第三届“数信杯”数据安全大赛wp之流量分析

缘起

流量分析题很常见,但是一个题目有500个流量包文件的,就不常见了,所以想记录一下。

题干

请根据题目提供的证书关键参数,合成私钥解密证书。请选手找到id为285的参数合成的证书(参考附件params.csv),可以解密哪个流量包(参考附件:pcap.zip)。并将其流量包名称作为答案提交。
【答案标准】
若id为285的参数合成证书,可以解密"UT5NHVWo2Z.pcap",则答案提交为UT5NHVWo2Z.pcap

分析

先看看重点:

请添加图片描述

整整有500个流量包文件,所以,平时使用wireshark来分析的方法,就不适用了,只能使用代码带分析了。

先使用wireshark看一下流量包内容:

请添加图片描述

单个流量包内容很简单:TLS密钥交换,然后用加密形式传数据

再看看一下params.csv文件:

请添加图片描述

就是提供了e、p、q

分析: 密钥交换的公钥,公钥=(n, e),而n=p*q

所以,只要取params.cvs的id=285的p和q,计算后和流量包的n比对,相等的就是。

看一下流量包的n的位置:

请添加图片描述

开始准备脚本

python语言处理流量包有2个选择,一个是pyshark,一个是scapy,今天使用pyshark来处理。

先上完整的代码:

# 完整代码如下:
import pyshark,os
from Crypto.Util.number import bytes_to_long

current_dir="./caps"

e = 65537 
p = 177264302295959185550899884811457697789837321132319354039496340545988969470422347313577084568610012957139649359576035974322283705879187577664768699213211347033624840318251940972496063336844685896882713624561971974788692556498019960846465311267474369690812099681875735569564330504277517754796899917257323134723
q = 143990163909936129648804807321551478733567016733642335522156625973321506509458427490929508866189002322826874210961910641865602374675333206288577734876005828016379170951078934469472423840724164310343028554942665656763806178050620857070820746559094989518930589089970082522430002916286799917078785172333647028571

n = p * q

for capfile in os.listdir(current_dir):
    if capfile.endswith('.pcap'):
        cap = pyshark.FileCapture(
            input_file=os.path.join(current_dir, capfile),
            display_filter='tls',
            keep_packets=False
        )
        for packet in cap:
            if 'TLS' not in packet:
                continue
            if hasattr(packet.tls, 'handshake_type') and packet.tls.handshake_type=='11':
                modulus_hex = packet.tls.pkcs1_modulus.replace(':', '').replace('\n', '')
                modulus_int = bytes_to_long(bytes.fromhex(modulus_hex))
                if modulus_int == n:
                    print(f"Found the matching packet in {capfile}!")
                    break
        cap.close()

配合wireshar的图片,来简单解释一下代码:

在TLS层的,Handshake Type是Certificate(type=1)的,就是交互tls密钥公钥的包,可以在里面找到n

分享一个小代码,用于当你不知道包里面有哪些字段的是可以查找:

for packet in cap:
    # 打印packet.tls的所有成员,以便查看有哪些字段可用
    if hasattr(packet, 'tls'):
        print("TLS Layer Fields:")
        for field in packet.tls.field_names:
            print(f"  {field}: {getattr(packet.tls, field)}")

测试结果

跑一下:

请添加图片描述

完事大吉!

小结

一直都是分析一个流量包文件,有1000+的数据包,还是第一次遇到500个流量包文件需要分析。

所以使用脚本就成了必须的,记一下pyshark的使用方法

题目附件见:

https://download.csdn.net/download/Casablanca1983/92697436

第三届数信杯的其他题目wp:

第三届“数信杯”数据安全大赛wp之ai模型

第三届“数信杯”数据安全大赛WP之简单AES

欢迎关注:

第三届“数信杯”数据安全大赛wp之流量分析

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐