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

Eli*_*ion 7 python ssl networking scapy

我正在尝试读取 TLS 消息。具体来说,具有证书详细信息的那个 (handshake_type = 11)。我正在做的是首先检查消息是否包含Raw. 如果是这样,我提取有效载荷,像这样:b = bytes(pkt[Raw].load)。接下来,我正在检查第一个字节是否是0x16正确的 TLS 版本,接下来的两个字节是否需要是正确的 TLS 版本。

问题是这条消息没有通过这些条件。WireShark 向我展示了\x16\x03\x03位置上的字节0000(附上图片),但我想这是为了方便起见。

那么我的假设是有效载荷必须以0x16错误开头吗?

PS
我不想使用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')
Run Code Online (Sandbox Code Playgroud)

EDIT2:
根据Cukic0d 的建议,我使用了load_layer("ssl").

显然,pkt[TLS].msg是一个列表(在一个数据包中保存多个 TLS 消息?)。无论如何,我像这样打印了每个此类消息的类型:

def handle_tls_packet(pkt):
    for tls_msg in pkt[TLS].msg:
        print(type(tls_msg))
Run Code Online (Sandbox Code Playgroud)

我期望看到一个TLSCertificate物体,但从未见过这样的物体。为什么?

EDIT3:如果这会让生活更轻松,
我愿意使用scapy-ssl_tls

Cuk*_*c0d 7

如果您想玩 TLS 握手,请使用 .scapy 在 scapy 上启用 TLS load_layer("tls")

这将启用支持握手的 TLS 模块(需要 scapy >= 2.4.0)。然后 Scapy 将正确剖析 TLS 握手/密钥...数据包

你应该先试试

load_layer("tls")
packets = sniff(prn=lambda x:x.summary(), lfilter=lambda x: TLS in x)
Run Code Online (Sandbox Code Playgroud)

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

sniff([...], session=TLSSession)
Run Code Online (Sandbox Code Playgroud)

看看数据包是如何构建的:

例子: 截屏

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

所以总结一下: 截图 2

使用load_layer("tls").

请注意,有很多数据包,并且 TLSCertificate 只会出现一次。msg是一个列表,因为单个 TLS 数据包中可以包含许多信息