【问题标题】:How to extract an SSL/TLS message using scapy and python?如何使用 scapy 和 python 提取 SSL/TLS 消息?
【发布时间】:2018-12-27 15:24:54
【问题描述】:

我正在尝试读取 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')

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))

我希望看到TLSCertificate 对象,但从未见过这样的对象。 为什么?

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

【问题讨论】:

  • 在第一次编辑中,您是否弄清楚为什么您的代码不起作用?我想遵循与您在代码中所做的类似的模式(不依赖于 ssl tls 的任何 scapy 包)。

标签: python ssl networking scapy


【解决方案1】:

如果您想使用 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 数据包中可以包含许多信息

【讨论】:

  • 谢谢,我明天试试!
  • 好的,所以我使用了它,但有趣的是我从未见过TLSCertificate msg。我将编辑我的问题以获取详细信息。
  • 我已经更新了我的答案。包很多,TLSCertificate只会出现一次。
  • 我在帖子中附加的代码应该可以处理所有消息,对吧?然而,我从未见过TLSCertificate - 一次也没有。也许它是某些TLSServerHello 消息的一部分?
  • 我使用ls()函数,发现如下数据:msg : _TLSMsgListField = [<Raw load='\x0b\x00\x0b\x88\x00\x0b\x85\x00\x06\xe70\x82\x06\xe30\x82\x05\xcb\xa0\x03\x02\x01\x02\x02\x10\x05,\xd1\xe8\xf9\x82\x04R0m~\x1f&\xea\xb0\x970\r\x06\t*\x86H\x86\xf7\r\x01\x01\x0b\x05\x000M1\x0b0\t\x06\x03U\x04\x06\x13\x02US1\x150\x13\x06\x03U\x04\n\x13\x0cDigiCert Inc1\'0%\x06\x03U\x04\x03\x13\x1eDigiCert SHA2 Secure Server
猜你喜欢
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多