之前的系列文章可以点击个人博客查看。这是python系列更新的第9天。
今天主要更新内容有:
目录
网络数据的嗅探
简介
编写一个完整的数据嗅探工具
调用WireShark来查看数据包
在KaliLinux2中提供了很多可以进行网络嗅探的工具,其基本的原理大都相同,所有通过你网卡的数据都可以被读取。这些网络数据按照各种不同的协议组织到了一起。所以只要掌握各种协议的格式。就可以分析出这些数据所要表示的意义。在学习的时候,只需要掌握这些协议中最重要的部分即可。
编写一个网络嗅探的工具
在Scapy模块中提供了一种专门用来捕获数据包的函数sniff(),这个函数的功能十分强大,简单说一下它的使用方法
函数sniff()中可以使用多个参数,其中重要的参数含义有:
count:表示要捕获数据包的数量。默认值为0,表示不限制数量。
store:表示是否要保存捕获的数据包,默认值为1。
prn:这个参数是一个函数,这个函数将会应用在每一个捕获到的数据包上。如果这个函数有返回值,就会显示出来。
iface:表示将要使用的网卡或者网卡列表
需要注意的是,直接使用这个函数会捕获到整个网络的通信,所以我们还要加以过滤,sniff()函数支持过滤器的使用,这个过滤器使用了一种非常强大的过滤语法——”伯克利包过滤“语法。这个规则简称为BPF,利用它可以确定获取和检查哪些流量,忽略那些流量。BPF可以帮助我们通过比较各个层协议的数据字段值方法对流量进行过滤。
BPF的主要特点是使用”host“来描述主机,”port“描述端口,同时也支持”与“”或“”非“等逻辑运算。可以限定的内容包括地址、协议等。
使用这种语法创建的过滤器被称为BPF表达式。每一个表达式中包含一个或者多个原语。每个原语中又包含一个或多个限定词,主要又三个限定词:Type、Dir和Proto。
Type用来规定使用名字或数字代表的类型,例如host、net和port等。
Dir用来规定流量的方向,例如src、dst和src and dst等。
Proto用来规定匹配的协议,例如ip、tcp和arp等。
”host 192.168.65.144“就是一条最基础的过滤器,用来过滤掉除本机和192.168.65.144以外的所有流量,如果范围再缩小一点,比如只捕获ICMP类型的流量就可以使用”与“运算符,如”host 192.168.65.144&&icmp“
下面举例一些常见的过滤器。
只捕获与网络中某一个IP的主机进行交互的流量:"host 192.168.65.142"
只捕获与网络中某一个MAC地址的主机进行交互的流量:”ether host MAC地址“
只捕获来自网络中某一个IP的主机的流量:”src host 192.168.65.11“
只捕获去往网络中某一个IP的主机流量”dst host 192.168.65.11“,host可以省略
只捕获80端口的流量:”port 80“
只捕获目的端口为22端口的流量:”dst port 22“
捕获除了22端口的流量:”!22“
只捕获ICMP的流量:”icmp“
只捕获type为3,code为0的ICMP流量:”icmp[0]=3&&icmp[1]=0“//这里的type,code类型参考ICMP错误消息和意义。
下面是用sniff()来捕获一些数据包并显示出来,例如,源地址为192.168.65.151,端口为80的tcp报文。
sniff(filter="dst 192.168.65.142 and tcp port 80")
然后打开浏览器访问192.168.65.142的web服务。
按照图中的方式查看一下包。
如果希望即时显示捕获的数据包,就可以使用prn函数选项,函数内容为prn=lambda x:x.summary()
现在的包变成
sniff(filter="dst 192.168.65.142 and tcp port 80",prn=lambda x:x.summary())
利用prn可以不断的打印输出捕获的数据包的内容,另外,这个函数可以实现很多的功能,例如输出其中的某一个选项,本例中就是使用x[IP].src输出IP报文的目的地址,
扫描地结果还需要保存,一般的格式为pcap。例如,现在捕获5个数据包并保存起来
packet=sniff(count=5) *
wrpcap("demo.pcap",packet)
根据以上的内容,接下来
import sys
from scapy.all import *
if len(sys.argv) != 2:
print('Usage:CatchPackets\n eg: CatchPackets 192.168.65.1 ')
sys.exit(1)
ip = sys.argv[1]
def Callback(packet):
print packet.show()
packets=sniff(filter = "host "+ip,prn=Callback,count=5)
wrpcap("catcah.pcap", packets)
在run configurations中为这个程序指定一个参数"ip",然后执行,并且与该ip进行通信,产生数据包。这里访问了该ip的web服务。执行结果如下:
在该工作目录下会保存一个文件
在scapy中进行捕捉数据包时,不容易直接查看,我们可以放在wireshark中来查看,首先在scapy中产生一个数据包
>>> packets = IP(dst="8.8.8.8")/ICMP()
然后把这个包用wireshark打开
>>> wireshark(packets)
图中的数据包一共分为三层,以此为Frame、IP、ICMP。每一层都可以单机前面的三角符号进行查看。
网络嗅探部分就到此为止了,接下来是网络数据欺骗部分。