21.3 Python 使用DPKT分析數據包

来源:https://www.cnblogs.com/LyShark/archive/2023/10/20/17777817.html
-Advertisement-
Play Games

dpkt項目是一個`Python`模塊,主要用於對網路數據包進行解析和操作。它可以處理多種協議,例如`TCP`、`UDP`、`IP`等,並提供了一些常用的網路操作功能,例如計算校驗和、解析`DNS`數據包等。由於其簡單易用的特性,`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文件。

當讀者抓取到這些數據包之後,下一步則是解析這些數據包,解析的方法有許多可以使用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 許可協議。轉載請註明出處!

文章作者:lyshark
文章出處:https://www.cnblogs.com/LyShark/p/17777817.html
本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 當用戶輸入網頁路徑,瀏覽器首先通過網路請求拿到html字元串,然後經過HTML解析、樣式計算、佈局、分層、繪製、分塊、光柵化、畫等過程,將頁面的內容最終呈現到了屏幕上。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近遇到一個問題,計算滾動距離,滾動比例達到某界定值時,顯示mask,很常見吧^ _ ^ 這裡講的不是這個需求的實現,是其中遇到了一個比較有意思的bug,靠這個bug才達到了正確效果,以及這個bug是如何暴露的(很重要)。 下麵是演示代碼 ...
  • React採用on+事件名的方式來綁定一個事件,註意,這裡和原生的事件是有區別的,原生的事件全是小寫 onclick , React里的事件是駝峰 onClick ,React的事件並不是原生事件,而是合成事件。 事件回調的幾種寫法 1.直接在組件內定義一個非箭頭函數的方法,然後在render里直接 ...
  • 本文分享自華為雲社區《從0到1實現 OpenTiny 組件庫跨框架技術》,作者:華為雲社區精選 。 在華為雲《DTSE Tech Talk》技術直播第44期《0基礎玩轉 OpenTiny 跨框架組件庫,實現一站式前端進階》中,華為雲前端開發 DTSE 技術佈道師莫春輝老師在本期直播中與開發者一起交流 ...
  • 接上一節:從零用VitePress搭建博客教程(3) - VitePress頁腳、標題logo、最後更新時間等相關細節配置 六、首頁樣式修改 有時候覺得自帶的樣式不好看,想自定義,首先我們在docs/.vitePress新建一個theme文件夾,用來存放自定義佈局和主題修改的相關文件,如下所示 th ...
  • 目錄 1. HTTP協議 2. HttpServlet 內容 HTTP 什麼是HTTP協議 HTTP 協議一般指 HTTP(超文本傳輸協議)。超文本傳輸協議(英語:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分散式、協作式和超媒體信息系統的應用層協議,是網際網路上 ...
  • Python支持來自數學的通常邏輯條件: 等於:a == b 不等於:a != b 小於:a < b 小於或等於:a <= b 大於:a > b 大於或等於:a >= b 這些條件可以以多種方式使用,最常見的是在"if語句"和迴圈中使用。 if語句是使用if關鍵字編寫的。 示例,if語句: a = ...
  • 知識總覽 2.3.1 單鏈表的定義 知識總覽 單鏈表定義 #include<stdio.h> #include<string.h> #include<stdlib.h> struct LNode{ int data; struct LNode *next; }; int main(){ struct ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...