代码之家  ›  专栏  ›  技术社区  ›  Elimination

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

  •  0
  • Elimination  · 技术社区  · 7 年前

    我正在读一条TLS消息。具体来说,具有证书详细信息的证书(握手类型=11)。我要做的是首先检查消息是否包含 raw。如果是的话,我提取有效负载就像这样: b=bytes(pkt[raw].load) 。接下来,我将检查第一个字节是否需要正确的TLS版本。

    问题是此消息无法通过这些条件。Wireshark向我展示了 \x16\x03\x03 are the bytes at position 0000 (picture is attached),but I guess it is done for convenience.

    那么,我假设有效载荷必须以 0x16开始吗?

    P.S
    我不想使用 scapy-ssl_tls. library.

    编辑 这是代码:

    def handle_tls_packet(pkt):
    如果pkt.haslayer(原始):
    B=字节(pkt[raw].加载)
    
    如果b[0]==0x16:
    version=int.from_bytes(b[1:3],'大')
    message_len=int.from_bytes(b[3:5],'大')
    握手类型=B[5]
    握手长度=从字节开始的整数(b[6:9],“大”)。
    
    打印(“v=”,版本,“len=”,消息长度,“htype=”,握手类型
    ,“hlen=”,握手长度)
    
    如果握手类型=11:
    #从来没有发生过-为什么?
    certs_len=int.from_bytes(b[7:11],'大')
    

    edit2:
    cukic0d所建议的,我使用了load_layer(“ssl”)

    显然,pkt[tls].msgis a list(to hold multiple tls messages in one packet?)不管怎样,我把每一条这样的信息的类型都打印出来了:

    def handle_tls_packet(pkt):
    对于pkt[tls].msg中的tls_msg:
    打印(类型(tls_msg))
    

    我期望看到一个tlscertificateobject,但从未见过这样的对象。 为什么?

    edit3:
    我愿意使用scapy-ssl_l tlsif that will make life easier.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对象,但从未见过这样的对象。 为什么?

    EdTe3:
    我愿意用scapy-ssl_tls如果这能让生活更轻松。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Cukic0d    7 年前

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

    Screenshot

    https://github.com/secdev/scapy/blob/master/doc/notebooks/tls/notebook2_tls_protected.ipynb

    Screenshot 2

    msg