dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作。它可以处理多种协议,例如TCPUDPIP等,并提供了一些常用的网络操作功能,例如计算校验和、解析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 S
0001 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 S
Ether / 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 dpkt
import socket def 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 监控提取数据包中的所有URL
def 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 = [],0 if __name__ == "__main__":
fp = open("d://lyshark.pcap","rb")
pcap = dpkt.pcap.Reader(fp)
GetDpkt(pcap)

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

本文作者: 王瑞

本文链接: https://www.lyshark.com/post/29b6bdae.html

版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

21.3 Python 使用DPKT分析数据包的更多相关文章

  1. 使用winpcap多线程抓包,以及简单的分析数据包

    刚开始使用winpcap数据包的时候,我在抓包的时候使用了 pcap_loop(adhandle, 0, packet_handler, NULL); 这个回调函数进行抓包.同时在回调函数中分析IP地 ...

  2. Wireshark数据抓包教程之认识捕获分析数据包

    Wireshark数据抓包教程之认识捕获分析数据包 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了,学会捕获数据了,接下来就该去认识这些捕获的数据包了.Wiresh ...

  3. ARPSpoofing教程(四) - 捕获并分析数据包

    本程序的主要目标是展示如何解析所捕获的数据包的协议首部. 这个程序可以称为UDPdump,打印一些网络上传输的UDP数据的信息. 1: #include"pcap.h" 2: ty ...

  4. #WEB安全基础 : HTTP协议 | 0x7 学会使用wireshark分析数据包

    wireshark是开源,免费,跨平台的抓包分析工具 我们可以通过wireshark学习HTTP报文和进行抓包分析,在CTF中的流量分析需要用到抓包 1.下载和安装 这是wireshark的官网 ht ...

  5. python+pcap+dpkt 抓包小实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 """ imp ...

  6. python+pcap+dpkt抓包小实例

    通过pcap与dpkt抓包解包示例: #!/usr/bin/env python # -*- coding: utf-8 -*- """ 网络数据包捕获与分析程序 &qu ...

  7. snmp数据包分析

    今天看了一下snmp数据包的报文格式,用wireshark抓了两个数据包来分析. 先说说snmp get-request的书报包格式吧,get-next-request,get-response,se ...

  8. python数据包之利器scapy用法!

    scapy介绍:  在python中可以通过scapy这个库轻松实现构造数据包.发送数据包.分析数据包,为网络编程之利器! scapy安装: pip install scapy   ======> ...

  9. 可视化数据包分析工具-CapAnalysis

    可视化数据包分析工具-CapAnalysis 我们知道,Xplico是一个从pcap文件中解析出IP流量数据的工具,本文介绍又一款实用工具-CapAnalysis(可视化数据包分析工具),将比Xpli ...

  10. 基于TILE-GX实现快速数据包处理框架-netlib实现分析【转】

    最近在研究suricata源码,在匹配模式的时候,有tilegx mpipe mode,转载下文,了解一下. 原文地址:http://blog.csdn.net/lhl_blog/article/de ...

随机推荐

  1. 【Python】Beautiful Soup

    简介 Beautiful Soup 对象 我全部使用soup表示: Beautiful Soup 简介: 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据. ...

  2. selenium 根据期刊信息获取知网文献信息 pt.1

    哈喽大家好,我是咸鱼 之前写过一篇获取知网文献信息的文章(关于<爬取知网文献信息>中代码的一些优化),看了下后台数据还挺不错 所以咸鱼决定再写一篇知网文献信息爬取的文章 需要注意的是文章只 ...

  3. 巧用 awk 批量杀进程

    今天遇到线上的一个问题: 我需要批量杀死某台机器的 PHP 进程,该怎么办? 注意,不是 php-fpm,是常驻任务. 如果是一个进程,那就好办了,ps -ef | grep php,找到 PID 然 ...

  4. Spring-Bean的依赖注入的数据类型

    Spring-Bean的依赖注入的数据类型 除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入 数据的三种数据类型 普通数据类型 引用数据类型 集合数据类型 普通数据类型 public ...

  5. 好用工具:Wappalyzer

    说明 这个插件可以检测到网站使用的技术栈,是一个好玩的技术嗅探插件 安装 使用

  6. Vue: 配置axios基准路径并使用

    配置 main.js文件修改 在main.js中进行如下修改 // 设置axios全局api import axios from 'axios' // 请求基准路径的配置 后台 axios.defau ...

  7. TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范

    TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范 本文深入介绍了微软最近发布的 TypeChat 项目,该项目允许开发者定义大语言模型返回的响应结构.通过分析源代码,探讨了 ...

  8. Python类型提示

    摘自:Python 类型提示简介 - FastAPI (tiangolo.com) 快速入门 类型提示用于声明一个变量的类型,在Python 3.6+版本的时候引入. 示例: def get_full ...

  9. 从壹开始前后端开发【.Net6+Vue3】

    项目名称:KeepGoing(继续前进) 1.1介绍 工作后,学习的脚步一直停停走走,希望可以以此项目为基础,可以不断的迫使自己不断的学习以及成长 将以Girvs框架为基础,从壹开始二次开发一个前后端 ...

  10. c++算法之离散化例题

    离散化基础2 题目描述 给定 n 个元素的数列,将相同的数据离散化为一个数据(去重),即把 {4000,201,11,45,11}{4000,201,11,45,11} 离散化为 {4,3,1,2,1 ...