如何使用 scapy 和 python 提取 SSL/TLS 消息?
How to extract an SSL/TLS message using scapy and python?
我正在尝试阅读 TLS 消息。具体来说,就是带有证书详细信息的那个 (handshake_type = 11)。我正在做的是首先检查消息是否包含 Raw
。如果是这样,我将像这样提取有效负载:b = bytes(pkt[Raw].load)
。接下来,我正在检查 第一个 字节是 0x16
并且接下来的两个字节需要是正确的 TLS 版本。
问题是此邮件不满足这些条件。 WireShark 向我显示 \x16\x03\x03
是位置 0000
处的字节(附有图片),但我想这样做是为了方便。
所以我假设负载必须以 0x16
开头是错误的吗?
P.S
我不想使用 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')
编辑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 handshake/key... packets
你应该先试试
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 数据包中
我正在尝试阅读 TLS 消息。具体来说,就是带有证书详细信息的那个 (handshake_type = 11)。我正在做的是首先检查消息是否包含 Raw
。如果是这样,我将像这样提取有效负载:b = bytes(pkt[Raw].load)
。接下来,我正在检查 第一个 字节是 0x16
并且接下来的两个字节需要是正确的 TLS 版本。
问题是此邮件不满足这些条件。 WireShark 向我显示 \x16\x03\x03
是位置 0000
处的字节(附有图片),但我想这样做是为了方便。
所以我假设负载必须以 0x16
开头是错误的吗?
P.S
我不想使用 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')
编辑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 handshake/key... packets
你应该先试试
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 数据包中