天天看点

python黑帽之包嗅探(chapter3)

抽了点空玩了玩包嗅探,代码中还是有些许不能理解的地方啊。

主要问题就是sniffer.bind()这里后面的端口随便设置都可以嗅探到流量!这就奇怪了,为什么每个端口都能嗅探到流量呢?而且,我win10上一运行程序就嗅到了流量然后退出来,kali上必须ping才能嗅到流量,这是为何?而且kali上我打开浏览器浏览没有嗅到流量,只有Ping才行。这又是为什么呢~我再去研究研究,挖个坑回头来填!

在一个就是linux下也有混杂模式啊,为什么只在windows下开?不过我试了下去了linux上的话socket显示没有ioctl属性,不知道是不是因为kali上是python2.7的缘故,而我win10上装了3.6。。anyway,希望后面的学习能够解答疑惑,奉上我的代码。

import os
import socket

#监听的主机
host = '192.168.158.129'

#创建原始套接字,然后绑定在公共接口上
#os.name == 'nt'的话说明是windows系统
if os.name == 'nt':
	socket_protocal = socket.IPPROTO_IP #windows系统允许嗅探所有协议的所有数据包
else:
	socket_protocal = socket.IPPROTO_ICMP #Linux只能嗅探ICMP数据

sniffer = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket_protocal)

sniffer.bind((host,0))

#设置在捕获的数据包中包含IP头
sniffer.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)#1表示sniffer关闭后马上释放端口

#在windows平台上我们需要设置IOCTL启用混杂模式
if os.name == 'nt':
	sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)

#读取单个数据包
print(sniffer.recvfrom(65565))

#在windows平台上关闭混杂模式
if os.name == 'nt':
	sniffer.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF)
           

在电脑上运行程序然后再ping 就会嗅到流量了!