安全与风控
如何从网络流量中检测DNS/ICMP隐蔽隧道与数据外传
当调查可疑DNS/ICMP/HTTP流量、在抓包中寻找隐藏C2通道或归因数据外传时,用熵值、子域长度和载荷大小等指标识别隧道行为。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
如何从网络流量中检测DNS/ICMP隐蔽通用
解决思路
- 准备环境:安装 Python 3.9+ 及 scapy、dpkt、dnslib 库,并准备 Wireshark/tshark、Zeek 用于 PCAP 与网络监控分析,同时确保有 DNS 查询日志基础设施。
- 编写 DNS 隧道检测脚本:用 scapy 的 rdpcap 读取 PCAP,遍历含 DNS 与 DNSQR 层的包,提取 qname 与 qtype,按最后两段拆出基础域名、其余部分作为子域。
- 按基础域名聚合统计:累计查询次数、qname 总长度、子域长度列表、查询类型计数(Counter)以及唯一子域集合。
- 计算子域熵值:用 entropy() 函数对字符频率做 -sum((c/length)*log2(c/length)) 计算,熵值越高越可疑。
- 对每个域名打分(查询数需≥5):平均子域长度>30 加30分;唯一子域比例>0.9 加25分;子域熵>4.0 加25分;TXT记录查询>10 加20分。
- 输出得分≥50 的可疑域名,附带查询数、平均子域长度、唯一子域数、熵值和命中原因,并按分数降序排列。
- 编写 ICMP 隧道检测脚本:遍历含 ICMP 与 IP 层的包,按 源IP->目的IP 聚合,统计包数、载荷大小列表,并保存长度>64 的载荷前100字节。
- 对每个 ICMP 流(包数≥5)判断:平均载荷>64 字节或包数>100 即标记为可疑,理由为“大/高频 ICMP 载荷疑似隧道”。
- 运行脚本:python script.py <pcap_file>,先输出 DNS 隧道分析结果,再输出 ICMP 隧道分析结果。
- 验证检测效果:确认 DNS 隧道通过熵、子域长度、查询量识别;ICMP 隐蔽通道通过载荷大小异常识别;将隧道域名与合法 CDN/云流量区分;估算外传数据量;提取 C2 通信模式与心跳间隔。
- 参考已知案例与资料:Palo Alto Unit42 的三大 DNS 隧道活动(TrkCdn、SecShow、Savvy Seahorse)、Elastic 隐蔽数据外传检测、Vectra AI ICMP 隧道检测、MITRE ATT&CK T1071。
- 结合已知工具特征归因:DNS 隧道工具如 iodine、dnscat2、FrameworkPOS;ICMP 隧道工具如 icmpsh、ptunnel;HTTP 隐蔽通道常把 C2 数据藏在头部、Cookie 或隐写图片中。
适用边界 · 注意事项
- 没有 PCAP 抓包或 DNS 查询日志等网络流量数据时无法开展分析。
- 低吞吐量的慢速外传可能低于阈值(查询数<5、包数<5)而漏报,需结合长期基线判断。
- 合法 CDN/云服务可能产生长子域或高唯一性,需先建立白名单避免误报。