Python3.9(Win10)下无需scapy-ssl_tls,用Scapy嗅探HTTPS数据包
无需scapy-ssl_tls捕获HTTPS相关信息的方案
首先明确:HTTPS的HTTP请求内容是加密的,不可能像明文HTTP那样直接抓取到完整URL(域名+路径),因为加密层会把HTTP内容完全包裹。但TLS握手阶段的Server Name Indication(SNI)字段是明文传输的,我们可以通过提取SNI来获取访问的HTTPS域名,这部分不需要依赖scapy-ssl_tls模块,原生Scapy就能实现。
以下是修改后的代码:
import scapy.all as scapy from scapy.layers.tls.record import TLSRecord from scapy.layers.tls.handshake import TLSClientHello def sniff(interface): # 过滤443端口的TCP流量 scapy.sniff(iface=interface, store=False, prn=process_sniffed_packet, filter="tcp port 443") def process_sniffed_packet(packet): # 尝试解析TLS记录和Client Hello if packet.haslayer(TLSRecord): tls_layer = packet[TLSRecord] if tls_layer.type == 22: # 22代表握手消息类型 handshake = tls_layer.payload if isinstance(handshake, TLSClientHello): # 提取SNI字段 for ext in handshake.extensions: if ext.type == 0: # 0代表SNI扩展 sni = ext.servernames[0].servername.decode() print(f"=> HTTPS Domain: {sni}") sniff("Wi-Fi")
代码说明:
- 原生Scapy已经内置了
TLSRecord和TLSClientHello的解析支持,不需要额外安装模块 - 过滤
tcp port 443的流量,只处理HTTPS端口的数据包 - 解析TLS握手的Client Hello消息,提取其中的SNI扩展字段,这是HTTPS请求中唯一明文传输的目标域名信息
局限性:
- 只能获取HTTPS域名,无法获取具体的请求路径(比如
/login这类),因为这部分内容在加密的HTTP报文中 - 需要确保你的网卡处于混杂模式(Windows下可能需要以管理员身份运行Python脚本)
内容的提问来源于stack exchange,提问作者Mohammad Dehghani
相关产品推荐
相关产品推荐

