如果想要彻底了解一个网络,那么最好的办法就是对网络中的流量进行 嗅探
在本章中将会编写几个嗅探工具,这些嗅探工具可以用来窃取网络中 明文 传输的密码,监视网络中的数据流向,甚至可以收集远程登录所使用的NTLM数据包(这个数据包中包含登录用的用户名和使用Hash加密的密码)
网络数据嗅探
编写一个网络嗅探工具
在Scapy中提供了一种专门用来捕获数据包的函数sniff(),这个函数的功能十分强大,首先使用help函数来查看一下它的使用方法
help(sniff)
-
函数sniff()中可以使用多个参数,下面先来了解其中几个比较重要参数的含义
1)count:表示要捕获数据包的数量。默认值为0,表示不限制数量。
2)store:表示是否要保存捕获到的数据包,默认值为1。
3)prn:这个参数是一个函数,这个函数将会应用在每一个捕获到的数据包上。如果这个函数有返回值,将会显示出来。默认是空; 返回一个数据包信息
4)iface:表示要使用的网卡或者网卡列表。 -
sniff()还支持了过滤器的使用
1)这个过滤器使用了一种功能非常强大的过滤语法——“伯克利包过滤”语法。
2)这个规则简称为BPF,利用它可确定该获取和检查哪些流量,忽略哪些流量。
3)BPF可以帮助我们通过比较各个层协议中数据字段值的方法对流量进行过滤。
4)BPF的主要特点是使用一个名为“原语”的方法来完成对网络数据包的描述,
例如,可以使用“host”来描述主机,“port”来描述端口,同时也支持“与”“或”“非”等逻辑运算。可以限定的内容包括地址、协议 -
使用这种语法创建出来的过滤器被称为BPF表达式,每个表达式包含一个或多个原语。每个原语中又包含一个或多个限定词,主要有三个限定词:Type、Dir和 Proto。
1)Type用来规定使用名字或数字代表的类型,例如host、net和port等。
2)Dir用来规定流量的方向,例如src、dst和src and dst等。
3)Proto用来规定匹配的协议,例如ip、tcp和arp等。
“hos 192.168.76.128”就是一条最为常见的过滤器,它用来过滤掉除了本机和192.168.169.133以外的所有流量。如果希望再将范围限制小一些,例如,只捕获tcp类型的流量就可以使用“与”运算符,如“host 192.168.76.128 && tcp”。
常见的过滤器。
-
只捕获与网络中某一个IP的主机进行交互的流量:“
host 192.168.1.1
”。 -
只捕获与网络中某一个MAC地址的主机交互的流量:“
ether host 00-1a-a0-52-e2-a0
”。 -
只捕获来自网络中某一个IP的主机的流量:“
src host 192.168.1.1
”。 -
只捕获去往网络中某一个IP的主机的流量:“
dst host 192.168.1.1
”,host也可以省略。 -
只捕获23端口的流量:“
port 23
”。 -
捕获除了23端口以外的流量:“
!23
” 。 -
只捕获目的端口为80的流量:“
dst port 80
”。 -
只捕获ICMP流量:“
icmp
”。 -
只捕获type为3,code为0的ICMP流量:“
icmp[0] = 3 &&icmp[1] = 0
”。 ([type,code] -
下面使用sniff()来捕获一些数据包并显示出来
例如,源地址为192.168.76.128,端口为80的tcp报文sniff(filter='dst 192.168.76.128 and tcp port 80')
这时Scapy就会按照要求开始捕获所需要的数据包。
-
如果希望即时显示捕获的数据包,就可以使用
prn函数
选项,
函数的内容为prn=lambda x:x.summary()sniff(filter='dst 192.168.76.128 and tcp port 80',prn = lambda x:x.summary())
利用prn就可以不断地打印输出捕获到的数据包的内
-
这个函数可以实现很多功能,例如输出其中的某一个选项:使用
x[IP].src
输出IP报文的目的地址sniff(filter='dst 192.168.76.128 and tcp port 80',prn=lambda x:x[IP].src,count=5)
-
在开启 sniff 的时候, 访问 目标主机的目标端口,(方式:火狐访问 HTTP服务器,产生流量开启sniff,进行流量获取)
结果如下:
-
另外,也可以定义一个回调函数,例如,打印输出这个数据包。
def Callback(packet) print packet.show()
-
然后再在sniff()中调用这个函数
sniff(prn=Callback)
-
这些捕获到的数据包可以使用wrpcap函数保存起来,保存的格式很多,目前最为通用的格式为pcap。
例如,现在捕获5个数据包并保存起来的语句如下所示。 Pcap= -> wireshark 保存的 数据包 格式 就是 .
pacppacket = sniff(count=5) wrpcap("demo.pcap", packet)
-
接下来编写一个完整的数据嗅探工具,它可以捕获和特定主机通信的10个数据包,并保存到catch.pcap数据包中。
from scapy.all import