使用Scapy嗅探TCP流量时末尾奇怪文本的含义及信息提取咨询
问题解答
1. 奇怪文本的本质
你遇到的gz字段值是Base64编码后的gzip压缩数据,服务端为了减少传输包体积,把返回的大体积载荷做了gzip压缩后再转Base64编码放在这个字段里,不属于乱码,完全可以提取有效信息。
2. 提取操作逻辑
只需要在现有代码中新增解码逻辑即可,流程如下:
- 解析JSON后先判断
b字段下是否存在gz键 - 存在的话先对
gz值做Base64解码,得到gzip压缩二进制数据 - 再对二进制数据做gzip解压,得到原始明文后按需解析即可
3. 调整后可用代码
from scapy.all import sniff import json import base64 import gzip from io import BytesIO while True: packet = sniff(count=1, filter='host 91.225.236.166') try: info = packet[0].load.decode('utf-8') info = info.replace('\x00', '') info = json.loads(info) # 新增gz字段解码逻辑 if 'b' in info and 'gz' in info['b']: # 第一步:Base64解码 gz_bytes = base64.b64decode(info['b']['gz']) # 第二步:gzip解压 with gzip.GzipFile(fileobj=BytesIO(gz_bytes), mode='rb') as f: raw_content = f.read().decode('utf-8') # 转JSON拿到原始结构化数据 decompressed_data = json.loads(raw_content) # 把解压后的数据替换回去方便后续处理 info['b']['raw_data'] = decompressed_data del info['b']['gz'] print(info) except: continue
4. 注意事项
- 若遇到解压失败的情况,可以先检查Base64解码后的二进制数据头是否为gzip标准魔术头
1f 8b,确认数据包完整性后再处理 - 如果解压后的内容不是JSON格式,可根据你自身的业务场景调整解压后的解析逻辑
内容的提问来源于stack exchange,提问作者Левый Тип
相关产品推荐
相关产品推荐

