21.3 Python 使用DPKT分析数据包

这篇具有很好参考价值的文章主要介绍了21.3 Python 使用DPKT分析数据包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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文件。

21.3 Python 使用DPKT分析数据包

当读者抓取到这些数据包之后,下一步则是解析这些数据包,解析的方法有许多可以使用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访问数据,如下图所示;

21.3 Python 使用DPKT分析数据包

对于数据包的解包功能,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信息,如下图所示;

21.3 Python 使用DPKT分析数据包文章来源地址https://www.toymoban.com/news/detail-711465.html

到了这里,关于21.3 Python 使用DPKT分析数据包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 21.1 Python 使用PEfile分析PE文件

    PeFile模块是 Python 中一个强大的便携式第三方 PE 格式分析工具,用于解析和处理 Windows 可执行文件。该模块提供了一系列的API接口,使得用户可以通过 Python 脚本来读取和分析PE文件的结构,包括文件头、节表、导入表、导出表、资源表、重定位表等等。此外,PEfile模块还可以

    2024年02月08日
    浏览(16)
  • 【Python-Django】如何在一个项目中创建多个app模块

    【Python-Django】如何在一个项目中创建多个app模块

    django开发案例:a​​​​​【Django】开发日报_1_Day:用户管理系统案例-创建项目_django 开发用户管理系统_代码骑士的博客-CSDN博客 前面做过的管理系统项目功能比较单一,只用一个模块就能解决问题。如果想创建多个不同的模块的话,就需要创建多个app组件,下面就介绍一

    2024年02月06日
    浏览(15)
  • 21 Python的datetime模块

    概述         在上一节,我们介绍了Python的time模块,包括:time模块中一些常用的属性和函数。在这一节,我们将介绍Python的datetime模块。datetime模块属于Python的内置模块,提供了一种方便的方法来处理日期和时间。该模块包含了许多类,包括:date、time、datetime、timedelta等

    2024年02月08日
    浏览(9)
  • 一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理+笔记(大全)

    一图看懂 setuptools 模块:一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目,资料整理+笔记(大全)

    本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 全文介绍python的 setuptools 模块(一个功能齐全、积极维护且稳定的库,旨在方便打包Python项目)、函数、类及类的方法和属性。 它通过代码抓取并经AI智能翻译和人工校对。 是一部不可多得的权威字典类

    2024年02月06日
    浏览(11)
  • FineBI实战项目一(21):不同支付方式订单总额分析开发

    FineBI实战项目一(21):不同支付方式订单总额分析开发

    点击新建组件,创建不同支付方式订单总额组件。 选择饼图,拖拽total_money到角度,拖拽pay_type到颜色,调节内径。 修改颜色的标识文字。 将组件拖拽到仪表板。 结果如下:

    2024年02月02日
    浏览(12)
  • 实战项目—使用Python,SqlServer,HTML实现简单登录模块

    实战项目—使用Python,SqlServer,HTML实现简单登录模块

            近期应老师的要求,要 使用一门编程语言连接数据库制作一个简单的登录模块 ,对于没有做过项目的小白来说,根本无从下手,甚至不能理解怎么跨平台操作。经过近一周的查资料,改代码,磕磕绊绊总算是实现了。         我是用的语言是Python,后端平台在pyc

    2024年02月09日
    浏览(10)
  • Python(21)json.dumps()使用indent参数 格式化输出json数据格式

    json.dumps() 方法 将一个Python数据结构转换为JSON字符串 输出为 这样的格式一般都不优美,当数据很多的时候,看得就不是很直观方便。 可以使用 indent=4 参数来对json进行数据格式化输出,会根据数据格式缩进显示,读起来更加清晰 用法如下 输出为 json.dumps()方法,参数解释

    2024年02月08日
    浏览(9)
  • 如何使用pycharm创建一个python项目

    如何使用pycharm创建一个python项目

    1.打开pycharm,点击new project 2.修改项目存放位置,点击第二个圆圈,点击add interpreter添加解释器 3.选择一个系统内置的解释器 4.点击创建按钮即可 5.打开该项目 6.在工程的地方点击鼠标右键–》选择new–》选择python file 7.给你的python文件取一个文件名,按回车键,创建成功

    2024年02月12日
    浏览(13)
  • Python数据分析项目案例

    Python数据分析项目案例

    第一部分:数据类型处理 数据加载 字段含义: user_id:用户ID order_dt:购买日期 order_product:购买产品的数量 order_amount:购买金额 观察数据 查看数据的数据类型 数据中是否存储在缺失值 将order_dt转换成时间类型 查看数据的统计描述 在源数据中添加一列表示月份:astype(\\\'datetime64[M

    2024年02月11日
    浏览(20)
  • 分享一个Python Django影片数据爬取与数据分析系统源码

    分享一个Python Django影片数据爬取与数据分析系统源码

    💕💕 作者:计算机源码社 💕💕 个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕💕 学习资料、程序开发、技术解答、文档报告 💕💕JavaWeb项目 💕💕微信小程序项目 💕💕Python项目 💕💕

    2024年02月09日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包