簡體   English   中英

如何使用 scapy 和 python 提取 SSL/TLS 消息?

[英]How to extract an SSL/TLS message using scapy and python?

我正在嘗試閱讀 TLS 消息。 具體來說,具有證書詳細信息的那個(handshake_type = 11)。 我正在做的是首先檢查消息是否包含Raw 如果是這樣,我將像這樣提取有效負載: b = bytes(pkt[Raw].load) 接下來,我正在檢查第一個字節是否為0x16 ,接下來的兩個字節需要是正確的 TLS 版本。

問題是這條消息沒有通過這些條件。 WireShark 向我顯示\\x16\\x03\\x03是位置0000的字節(圖片已附上),但我想這樣做是為了方便。

那么我假設有效載荷必須以0x16開頭是錯誤的嗎?

附言
我不想使用scapy-ssl_tls庫。

在此處輸入圖像描述

編輯
這是代碼:

def handle_tls_packet(pkt):
    if pkt.haslayer(Raw):
        b = bytes(pkt[Raw].load)

        if b[0] == 0x16:
            version =  int.from_bytes(b[1:3], 'big')
            message_len = int.from_bytes(b[3:5], 'big')
            handshake_type = b[5]
            handshake_length = int.from_bytes(b[6:9], 'big')

            print("v = ", version, " len = ", message_len, " htype =", handshake_type
            , "hlen =", handshake_length)

            if handshake_type == 11:
                # never happens - Why?
                certs_len = int.from_bytes(b[7:11], 'big')

編輯2:
正如Cukic0d所建議的,我使用load_layer("ssl")

顯然, pkt[TLS].msg是一個列表(在一個數據包中保存多個 TLS 消息?)。 無論如何,我打印了每條此類消息的類型,如下所示:

def handle_tls_packet(pkt):
    for tls_msg in pkt[TLS].msg:
        print(type(tls_msg))

我希望看到一個TLSCertificate對象,但從未見過這樣的對象。 為什么?

編輯3:
如果這會讓生活更輕松,我願意使用scapy-ssl_tls

如果您想玩 TLS 握手,請使用load_layer("tls")在 scapy 上啟用 TLS。

這將啟用支持握手的 TLS 模塊(需要 scapy >= 2.4.0)。 然后 Scapy 將正確剖析 TLS 握手/密鑰...數據包

你應該先試試

load_layer("tls")
packets = sniff(prn=lambda x:x.summary(), lfilter=lambda x: TLS in x)

如果您使用的是 Scapy 2.4.4+,為了更好的一致性,您甚至可以使用

sniff([...], session=TLSSession)

看看數據包是如何構建的:

例子: 截屏

這里還有一個非常花哨的指南: https : //github.com/secdev/scapy/blob/master/doc/notebooks/tls/notebook2_tls_protected.ipynb

所以總結一下: 截圖 2

使用load_layer("tls")時,您會找到每個數據包。

請注意,有很多數據包,並且 TLSCertificate 只會出現一次。 msg是一個列表,因為單個 TLS 數據包中可以包含許多信息

使用這個驚人的回購tintinweb/scapy-ssl_tls

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM