[英]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
使用load_layer("tls")
時,您會找到每個數據包。
請注意,有很多數據包,並且 TLSCertificate 只會出現一次。 msg
是一個列表,因為單個 TLS 數據包中可以包含許多信息
使用這個驚人的回購tintinweb/scapy-ssl_tls
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.