
需要获取网络中的报文,可以保存为pcap而后读取分析,但是总觉得来回读写数据过于麻烦,不如直接获取报文分析。面向Google编程后,并结合实际的使用,总结如下:
使用python抓包,需要利用scapy,安装直接使用pip指令安装即可:
pip install scapy一、报文的抓取 1.sniff使用
sniff用来实际抓取报文,使用参考如下:
package = sniff(iface,prn=handlePackage,count,filter)
参数说明:
iface:需要抓取那个网卡上的流量,linux可以通过ifconfig查看(例如:“enp1s0”)
prn:报文的处理函数,抓取到符合条件的报文,即进入该回调函数处理
count:指定抓取的报文数量
filter:抓包过滤条件(例如“src host xx.xxx.xxx.xxx && src port xxxx”该条件用于过滤指定的IP与指定的端口)
2.关于scapy需要管理员权限问题的解决需要说明的是:linux下获取报文需要root权限,所以运行可能会存在Permission Denied的报错,使用setcap指令设置使用权限即可。可以参考代码:
setcap 'cap_net_bind_service+eip cap_net_raw+eip' $(readlink -f $(which python3))二、报文分析
报文分析可以获取各层的数据,可以通过回调函数中调用show()来显示各层报文信息
def handlePackage(package):
package.show()
但是这个方法也只是看个报文,并不能获取到值进行判断,通过如下参考代码可以实现抓取报文首包字节流数据:
from scapy.all import sniff,raw package_res = sniff(piface,filter,count,prn) res = raw(package_res[0]) print(res)
然后就可以获取到报文的字节流数据,之后,可以根据帧格式依次进行解析。
当然,scapy还为调包侠准备了现成的方法:
from scapy.all import sniff,Raw data = package.getlayer(Raw).load print(data)
以上代码即可以获取传输层以上的数据
如何获取传输层,网络层,物理层的相关数据:
layer = 'IP'#对应的物理层、传输层分别:Ethernet UDP/TCP field = 'src'#对应参数如下: """ Ethernet :dst(目的Mac) src(源Mac) type IP :version len id ttl proto src(源IP) dst(目的IP) UDP/TCP:sport(源端口) dport(目的端口) len chksum """ package = sniff(prn,iface,count,filter) content = getattr(package[0].getlayer(layer),field) print(content)#获取到报文的源IP
如何获取报文有几层数据:
package.layers()
获取的结果如下:
layers is [, , , , ]
之后获取各层数据时,便可以使用对应的名称作为Key值,比如获取vlan信息,可以使用方法:
vlan_id = getattr(package['Dot1Q'], 'vlan')
参考资料:
scapy的github链接:
scapy/scapy at master · secdev/scapy · GitHubScapy: the Python-based interactive packet manipulation program & library. Supports Python 2 & Python 3. - scapy/scapy at master · secdev/scapyhttps://github.com/secdev/scapy/tree/master/scapy