我正在尝试使用 Scapy 从 pcap 中提取 TLS 元数据。我能够成功解析数据包和单个消息,例如 client-hello、server-hello 等及其字段。我遇到的问题是当 TLS 记录分布在多个 TCP 数据包/段时。这种情况主要发生在大型 TLS 消息中,例如应用程序数据或服务器在一个 TLS 帧中发送多个 TLS 消息(服务器问候、证书等)时。在这种情况下,scapy 表示它具有 TLS/SSLv2 层,但我无法从此类帧中提取任何有意义的信息。当我在wireshark中查看相同的pcap时,wireshark显示
Reassembled TCP segments (T bytes): #X (x), #Y(y), #Z(z)
其中 T 是合计; X、Y、Z 是帧 ID,x、y、z 是每个帧中构成总 T 的字节数。Wireshark 在解析 TLS 帧之前会重新组装整个 TLS 负载。
我的代码中有这样的东西:
if pkt.haslayer(TCP) and pkt.haslayer(TLS):
parseTLS(pkt)
elif pkt.haslayer(TCP) and pkt.haslayer(SSLv2):
parseSSLv2(pkt)
当遇到部分 TLS 数据包时,代码始终会转至 SSLv2。有没有一种方法可以让我像wireshark一样准确地将数据包识别为部分tls-segment并累积然后处理完整的TLS帧?如果是这样,我该怎么办。任何指示或帮助表示赞赏。谢谢。
不确定是否有更好的解决方案,但这就是我为解决问题所做的事情。累积的帧大小似乎与 Wireshark 从多个数据包重新组装 TLS 帧时所做的一致。
Note:此解决方案假设不存在乱序数据包或重复数据包。此外,此处显示的解决方案并不完整。下面的代码仅显示了当 TLS 帧跨越单个 TCP 流的多个 IP 数据包时如何累积 TLS 帧。请关注Janus's https://stackoverflow.com/users/1214974/janus-varmarken建议(在下面的评论中提到)或提出您自己的解决方案来积累不同的流。
def extractDataFromPcap(pcapfile):
load_layer("tls")
try:
reader = PcapReader(pcapfile)
# tls frame accumulation related variables.
tls_accumulate = False
tls_leftover_len = 0
tls_blist = list()
for pkt in reader:
try:
if tls_accumulate and pkt.haslayer(TCP):
ip_tcp_hdr_overhead = ((pkt[IP].ihl*4) + (pkt[TCP].dataofs*4))
pkt_payload_len = (pkt[IP].len - ip_tcp_hdr_overhead)
tls_leftover_len = (tls_leftover_len - pkt_payload_len)
tls_blist.append(raw(pkt[TCP].payload))
if tls_leftover_len <= 0:
# got complete TLS frame
tls_raw_bytes = b''.join(tls_blist)
# parse accumulated frame.
tls = TLS(tls_raw_bytes)
#... process tls object
# reset accumlation variables.
tls_accumulate = False
tls_leftover_len = 0
tls_blist = list()
else:
continue
if pkt.haslayer(TCP) and pkt.haslayer(TLS):
if not tls_accumulate:
# Process new TLS frame.
# Pkt over head: ip-hdr-len + tcp-hdr-len
ip_tcp_hdr_overhead = ((pkt[IP].ihl*4) + (pkt[TCP].dataofs*4))
pkt_payload_len = (pkt[IP].len - ip_tcp_hdr_overhead)
if pkt[TLS].len > pkt_payload_len:
# partial TLS frame. Start accumulating.
tls_accumulate = True
tls_leftover_len = (pkt[TLS].len - pkt_payload_len)
tls_blist.append(raw(pkt[TCP].payload))
else:
# complete TLS frame
# ... process complete TLS Frame
except Exception as error:
pkt.show()
print("tcp-processing error: %s", error)
sys.exit(-1)
except Exception as error:
print("packet processing error: %s", error)
sys.exit(-1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)