一. 安装scapy
执行下列命令
官方文档:https://scapy.readthedocs.io/en/latest/usage.html
二. 进行抓包
获取网络信息
windows系统下,在命令行执行ipconfig /all
获取网络信息。(如果是linux系统获取iface参数详见官方文档)
尝试抓包
先说明下即将用到的sniff
方法。
定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 sniff(count=0 , store=1 , offline=None , prn=None , filter =None , L2socket=None , timeout=None , opened_socket=None , stop_filter=None , iface=None ) count:抓取报的数量,设置为0 时则一直捕获 store:保存抓取的数据包或者丢弃,1 保存,0 丢弃 offline:从pcap文件中读取数据包,而不进行嗅探,默认为None prn:为每个数据包定义一个回调函数,通常使用lambda 表达式来写回调函数 filter :过滤规则,可以在里面定义winreshark里面的过滤语法,使用 Berkeley Packet Filter (BPF)语法L2socket:使用给定的L2socket timeout:在给定的事件后停止嗅探,默认为None opened_socket:对指定的对象使用.recv进行读取 stop_filter:定义一个函数,决定在抓到指定的数据之后停止 iface:指定抓包的网卡,不指定则代表所有网卡
下面是Python代码:
1 2 3 4 from scapy.all import *dpkt = sniff(iface="Broadcom 802.11ac Network Adapter" , count=100 ) print(dpkt)
在windows上运行,会报错:
RuntimeError: Sniffing and sending packets is not available at layer 2: winpcap is not installed. You may use conf.L3socket orconf.L3socket6 to access layer 3
它提示我们要去安装winpcap,这是一个免费,公共的网络访问系统,目的在于为win32应用程序提供访问网络底层的能力。
安装链接:https://www.winpcap.org/install/default.htm
再次执行代码,运行结果如下:
1 <Sniffed: TCP:91 UDP:9 ICMP:0 Other:0>
这告诉我们,在100次嗅探中分别是什么连接。
数据分析
我们首先运行下面的代码,看看抓到的具体内容。
1 2 3 4 5 from scapy.all import *dpkt = sniff(iface="Broadcom 802.11ac Network Adapter" , count=1 ) for i in dpkt: i.show()
运行结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ###[ Ethernet ]### dst = 2c:b2:1a:60:00:29 src = d4:61:9d:25:c6:cc type = IPv4 ###[ IP ]### version = 4 ihl = 5 tos = 0x0 len = 427 id = 62309 flags = DF frag = 0 ttl = 128 proto = tcp chksum = 0xca38 src = 192.168.2.105 dst = 101.91.19.66 \options \ ###[ TCP ]### sport = 8702 dport = 8080 seq = 1452087747 ack = 4270867081 dataofs = 5 reserved = 0 flags = PA window = 514 chksum = 0xcc23 urgptr = 0 options = [] ###[ Raw ]### load = "\x17\xf1\x03\x01~\xe5n\x10"
上面的内容,对应了一次请求的网络包。
如果要获取某一项具体值,可以参考下面的方法,并举一反三。
1 2 3 4 5 6 7 8 9 10 11 from scapy.all import *def pack_callback (pack ): try : if pack['IP' ].payload: print(pack['IP' ].chksum) except Exception as e: print(e) dpkt = sniff(iface="Broadcom 802.11ac Network Adapter" , prn=pack_callback, count=0 )
获取完参数后,可以进行一些其他操作,例如存储到数据库中。