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

发布于 2021-01-29 14:09:47

我正在尝试读取TLS消息。具体来说,是带有证书详细信息(handshake_type =
11)的证书。我正在做的是先检查邮件中是否包含Raw。如果是这样,我将像这样提取有效负载:b = bytes(pkt[Raw].load)。接下来,我要检查 第一个 字节是0x16,接下来的两个字节需要是正确的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')

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

关注者
0
被浏览
567
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果要使用TLS握手,请使用启用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)
    

    如果您使用的是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数据包中



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看