python scapy 使用秘钥 解析https
时间: 2023-12-09 17:19:43 浏览: 374
使用 Scapy 解析 HTTPS 流量需要先获取到 HTTPS 通信过程中的加密秘钥。获取方式一般有两种:
1. 使用 Wireshark 等抓包工具,从 SSL/TLS 握手过程中获取到加密秘钥。
2. 使用 SSLKEYLOGFILE 这个环境变量,将加密秘钥保存到一个文件中。这个环境变量告诉 SSL 库将加密秘钥写入指定的文件中,可以在 Scapy 中使用这个文件进行解密。
获取到加密秘钥之后,就可以使用 Scapy 解析 HTTPS 流量了。具体操作步骤如下:
1. 读取 pcap 文件,使用 rdpcap 函数:
```
packets = rdpcap('https.pcap')
```
2. 配置解密参数,使用 SSL/TLS 握手过程中获取到的加密秘钥:
```
from scapy.layers.ssl_tls import *
ssl_session_key = '<session key>' # 加密秘钥
ssl_master_key = '<master key>' # 主密钥
ssl_parameters = TLSParameters()
ssl_parameters.set_cipher_suites(['TLS_RSA_WITH_AES_256_CBC_SHA256'])
ssl_parameters.set_master_secret(bytes.fromhex(ssl_master_key))
ssl_parameters.set_session_ticket(bytes.fromhex(ssl_session_key))
```
3. 解析 HTTPS 报文:
```
for packet in packets:
try:
if packet.haslayer(TLS):
tls_packet = packet[TLS]
if tls_packet.handshake_type == 1: # 客户端发起握手
tls_record = TLSRecord(tls_packet.payload)
tls_record.decode_payload_as(TLSHandshake)
tls_handshake = tls_record.payload
client_hello = tls_handshake.payload
ssl_parameters.set_client_random(client_hello.random_bytes)
elif tls_packet.handshake_type == 2: # 服务器响应握手
tls_record = TLSRecord(tls_packet.payload)
tls_record.decode_payload_as(TLSHandshake)
tls_handshake = tls_record.payload
server_hello = tls_handshake.payload
ssl_parameters.set_server_random(server_hello.random_bytes)
elif tls_packet.content_type == 23: # 应用数据
tls_record = TLSRecord(tls_packet.payload)
tls_record.decode_payload_as(TLSApplicationData)
tls_application_data = tls_record.payload
print(tls_application_data.data)
except:
pass
```
需要注意的是,Scapy 在解析 HTTPS 报文时,默认不会解密加密的数据。需要手动配置解密参数,才能正确解析加密数据。
阅读全文