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

标签 python ssl networking scapy

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

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

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

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

enter image description here

编辑
这是代码:

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 握手/ key ...数据包

你应该先试试

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

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

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

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

例子: Screenshot

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

总结一下: Screenshot 2

你会在使用load_layer("tls")时找到每个数据包。

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

关于python - 如何使用 scapy 和 python 提取 SSL/TLS 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51423507/

相关文章:

python - Django-import-export - 导入高级字段?

php - 验证 header 为 "origin"的 HTTP 请求

networking - 如何使用 podman 进行虚拟主机

iPhone:什么时候应该使用网络事件指示器

c++ - 如何调试丢包?

python - 在 python 中查找命令失败,出现 "missing argument to -exec"

python - Cpython 和 fortran 链表之间的互操作性

python - 如何在python中重建libmem_crc32_direct CRC函数?

ios - iOS下如何使用公钥加密数据

ssl - acivemq、安全 websockets、CA、安全和同源限制 - 如何安装 CA 证书?