21.3 使用DPKT分析数据包

08-11 汽车 投稿:茅水风
文章目录 站点概览

王瑞

一个面向信息安全技术爱好者的知识分享平台。 自创建以来,一直致力并专注于分享信息安全领域研究经验及成果,倡导并从事前慑性信息安全技术研究、交流、整理、和推广工作,普及安全技术和安全常识,提高网络安全整体水平,让更多信息安全爱好者从中受益。 285 日志 dpkt项目是一个`Python`模块,主要用于对网络数据包进行解析和操作。它可以处理多种协议,例如`TCP`、`UDP`、`IP`等,并提供了一些常用的网络操作功能,例如计算校验和、解析`DNS`数据包等。由于其简单易用的特性,`dpkt`被广泛应用于网络安全领域,例如流量分析、漏洞利用、入侵检测等。使用该库可以快速解析通过各类抓包工具抓到的数据包,从而提取分析包内的参数。

dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作。它可以处理多种协议,例如TCP、UDP、IP等,并提供了一些常用的网络操作功能,例如计算校验和、解析DNS数据包等。由于其简单易用的特性,dpkt被广泛应用于网络安全领域,例如流量分析、漏洞利用、入侵检测等。使用该库可以快速解析通过各类抓包工具抓到的数据包,从而提取分析包内的参数。

安装DPKT工具:pip install dpkt

在分析数据包之前我们需要抓取特定数据包并保存为*.pcap格式,通常情况下这种数据包格式可通过WireShark等工具抓取到,当然也可以使用上一篇提到的Scapy库实现,该库中存在一个sniff函数,该函数可以实现网络抓包功能,如下一个演示案例我们分别通过sniff(count=2)函数抓取两个数据包并使用wrpcap()函数将其保存到文件内,当需要分析时可通过调用rdpcap()函数打开数据包即可实现分析。

 from scapy.all import *  packets = sniff(count=2) # 动态抓取2个数据包  wrpcap( d://lyshark.pcap ,packets) # 保存数据包 pcap_packets = rdpcap( d://lyshark.pcap ) # 读取数据包  pcap_packets lyshark.pcap: TCP:2 UDP:0 ICMP:0 Other:0   pcap_packets.show()0000 Ether / IP / TCP 192.168.1.101:63995 172.217.24.10:https S0001 Ether / IP / TCP 192.168.1.101:63907 103.235.46.191:https A / Raw  pcap_packets.summary()Ether / IP / TCP 192.168.1.101:63995 172.217.24.10:https SEther / IP / TCP 192.168.1.101:63907 103.235.46.191:https A / Raw  pcap_packets[0].dst FF:2d:1e:0f:1e:a1   pcap_packets[0].src a4:7e:33:ee:cc:b3  # 如下分别代表: 链路层 [Ethernet]、网络层[IP]、传输层[TCP/UDP]、应用层[RAW] pcap_packets[0].show() # 抓包后直接输出 sniff(prn=lambda x: x.show(), count=1)

通过上方的抓包流程读者即可实现简单的抓包功能,当然sniff函数参数众多我们完全可以在抓包时增加不同的抓包条件,同时该函数也支持回调函数,当由新的请求被触发时则自动执行回调函数,如下则是使用Scapy抓包的完整案例,该案例展示了抓取60秒数据包,并将其保存至d://lyshark.pcap目录。

from scapy.all import *import scapy.all as scapy# 数据包回调函数def packet_callback(packet): if packet[TCP].payload: m_packet = str(packet[TCP].payload) print( 主机地址: --- 数据包内容: .format(packet[IP].dst,packet[TCP].payload))if __name__ == __main__ : # 抓取80端口的数据包并输出到屏幕 # sniff(filter= tcp port 80 , prn=packet_callback, store=0) # 抓取 过滤出tcp协议 抓取1分钟后保存到文件中 package=sniff(filter= tcp , timeout=60, prn=packet_callback, store=1) wrpcap( d://lyshark.pcap , package)

运行上方抓包程序,读者可看到如下图所示的输出结果,等待60秒后即可看到d://lyshark.pcap文件。

当读者抓取到这些数据包之后,下一步则是解析这些数据包,解析的方法有许多可以使用DPKT解析,也可以使用scapy自带的工具解析,本章首先介绍如何使用Scapy工具实现解析数据包内的HTTP请求,并输出的功能,如下是完整的代码实现;

from scapy.all import *import scapy.all as scapy# 解析获取到的数据包def get_http_pcap(pcap_path): pcap_infos = list() packets = scapy.rdpcap(pcap_path) for p in packets: if p.haslayer( IP ): src_ip = p[ IP ].src dst_ip = p[ IP ].dst if p.haslayer( TCP ): raw_http = p[ TCP ].payload.original sport = p[ TCP ].sport dport = p[ TCP ].dport if p.haslayer( HTTPRequest ): host = p[ HTTPRequest ].Host uri = p[ HTTPRequest ].Path http_fields = p[ HTTPRequest ].fields # print( 主机地址: -- URI: .format(host,uri)) print( 原IP地址: : -- 目标IP地址: : .format(src_ip,sport,dst_ip,dport))if __name__ == __main__ : get_http_pcap( d://lyshark.pcap )

读者可自行运行上述代码,并传入刚才抓取到的lyshark.pcap数据包,此时则可解析出当前数据包中所有HTTP访问数据,如下图所示;

对于数据包的解包功能,Dpkt工具包也可以很好的完成,对于使用Dpkt解包而言,首先需要通过open()打开数据包,接着调用dpkt.pcap.Reader(fp)将文件内的字节转化为PCAP格式,最后调用自定义函数GetDpkt根据字段进行解析即可。

import dpktimport socketdef GetDpkt(pcap): for timestamp,packet in pcap: try: eth = dpkt.ethernet.Ethernet(packet) ip = eth.data tcp = ip.data src = socket.inet_ntoa(ip.src) dst = socket.inet_ntoa(ip.dst) sport = tcp.sport dport = tcp.dport print( [+] 源地址: : -- 目标地址: : .format(src,sport,dst,dport)) except Exception: pass# 检测主机是否被DDOS攻击了def FindDDosAttack(pcap): pktCount =  for timestamp,packet in pcap: try: eth = dpkt.ethernet.Ethernet(packet) ip = eth.data tcp = ip.data src = socket.inet_ntoa(ip.src) dst = socket.inet_ntoa(ip.dst) sport = tcp.sport # 累计判断各个src地址对目标地址80端口访问次数 if dport == 80: stream = src + : + dst if pktCount.has_key(stream): pktCount[stream] = pktCount[stream] + 1 else: pktCount[stream] = 1 except Exception: pass for stream in pktCount: pktSent = pktCount[stream] # 如果超过设置的检测阈值500,则判断为DDOS攻击行为 if pktSent 500: src = stream.split( : )[0] dst = stream.split( : )[1] print( [+] 源地址: 攻击: 流量: pkts. .format(src,dst,str(pktSent)))# FindPcapURL 监控提取数据包中的所有URLdef FindPcapURL(pcap): Url = [] for timestamp,packet in pcap: try: eth = dpkt.ethernet.Ethernet(packet) ip = eth.data src = socket.inet_ntoa(ip.src) tcp = ip.data http = dpkt.http.Request(tcp.data) if(http.method == GET ): UrlHead = http.headers for key,value in UrlHead.items(): url = re.findall( ^https*://.* ,str(value)) if url: print( [+] 源地址: %10s -- 访问URL: %-80s %(src, url[0])) except Exception: pass return set(Url)# 动态保存pcap文件(每1024字节保存一次pcap文件),并读取出其中的网址解析出来def write_cap(pkt): global pkts global count pkts.append(pkt) count += 1 if count == 1024: wrpcap( data.pcap ,pkts) fp = open( ./data.pcap , rb ) pcap = dpkt.pcap.Reader(fp) FindPcapURL(pcap) fp.close() pkts,count = [],0if __name__ == __main__ : fp = open( d://lyshark.pcap , rb ) pcap = dpkt.pcap.Reader(fp) GetDpkt(pcap)

运行上述代码,同样可以输出这些IP信息,如下图所示;

标签: # 数据包 # DPKT
声明:生活头条网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系admin@gdcyjd.com