最近福建这边的运维圈子不太平,好几个公司的内网被通报"非法外联",查了半天发现是DNS被劫持了。其实现在的攻击早就不是简单的改个Hosts文件,而是玩起了DNS隧道和休眠域名。今天咱们不整虚的,直接用Python写个脚本,看看怎么从流量里抓出这些"鬼"。
什么是DNS隧道?
简单说,就是把数据拆碎了塞进DNS请求里。比如攻击者想传一个文件,他会把文件内容编码成base64字符串,然后作为子域名去查询,比如aGVsbG8ud29ybGQ.evil.com。DNS服务器虽然只负责指路,但攻击者控制的evil.com服务器收到请求后,就能把数据拼回去。
代码实战:检测异常DNS流量
我们可以利用scapy库来监听网卡,分析DNS请求的特征。正常的域名通常是有意义的单词或拼音,而隧道流量的子域名通常是一长串无意义的随机字符(高熵值)。
python
编辑
1from scapy.all import sniff, DNSQR, DNS
2import math
3from collections import Counter
4
5def calculate_entropy(data):
6 # 计算字符串的香农熵,熵值越高,随机性越强,越可疑
7 if not data:
8 return 0
9 prob = [float(freq) / len(data) for freq in Counter(data).values()]
10 return -sum(p * math.log2(p) for p in prob)
11
12def detect_dns_tunnel(packet):
13 if packet.haslayer(DNSQR):
14 qname = packet[DNSQR].qname.decode('utf-8')
15 # 提取子域名部分(去掉主域名)
16 subdomain = qname.split('.')[-3] if len(qname.split('.')) > 2 else qname
17
18 # 计算熵值
19 entropy = calculate_entropy(subdomain)
20
21 # 阈值判断:通常正常单词熵值<3.5,Base64编码熵值>4.5
22 if entropy > 4.5 and len(subdomain) > 20:
23 print(f" 发现疑似DNS隧道流量!")
24 print(f"域名: {qname}")
25 print(f"熵值: {entropy:.2f}")
26 # 这里可以加入阻断逻辑,如发送RST包
27 # send_rst(packet)
28
29# 监听网卡,过滤DNS端口
30print("开始监听DNS流量...")
31sniff(filter="udp port 53", prn=detect_dns_tunnel)
为什么福建地区容易中招?
- 公共DNS污染:很多福建用户习惯使用公共DNS(如114.114.114.114),这些DNS服务器有时会被运营商层面的劫持设备干扰,返回错误的IP。
- 内网管理疏忽 :很多企业的测试域名(如
test.example.com)在服务器下线后,DNS记录没删。攻击者扫描到这些"孤儿域名"后,重新配置解析,用来做钓鱼或C2通信。
避坑指南
- 不要只看IP:现在的WAF和防火墙如果只盯着IP看,根本防不住DNS隧道。必须看域名特征。
- 加密DNS(DoH/DoT):建议在内网推广使用加密DNS,防止中间人窃听和篡改。
- 日志审计:定期检查DNS服务器日志,看有没有那种特别长的、乱码一样的查询请求。
文章三:云盾8论坛风格
标题:[实战复盘] 福建某医院内网失陷溯源:基于全流量回溯的DNS隐蔽通道挖掘
背景 :
福建省某三甲医院近期频繁被上级主管部门通报"内网主机非法外联"。经初步排查,防火墙并未发现明显的异常端口开放,且外联流量均伪装成标准的53端口(DNS)UDP流量。云盾安全团队介入后,通过全流量回溯分析,成功定位了一起利用DNS协议进行数据窃取的APT攻击事件。
攻击手法分析:披着羊皮的狼
攻击者利用医院内网一台老旧的Windows Server作为跳板,植入了支持DNS隧道的木马。
- 流量伪装 :木马将窃取的患者数据加密后,分割成多个DNS查询请求,发送至攻击者控制的域名
update.sys-health-check.com(伪装成系统更新域名)。 - 规避检测:请求频率控制在每秒1-2次,且域名长度适中,试图模仿正常的系统后台更新行为。
溯源过程:全流量分析显神威
由于攻击流量混杂在正常的医疗业务流量中,传统的基于阈值的告警完全失效。我们采用了全流量分析方案:
- 全量采集:在核心交换机旁路部署流量探针,镜像采集南北向和东西向流量。
- 协议深度解码:利用全协议解析技术,对DNS流量进行深度解码。
- 异常特征提取 :
- 包长分布异常:正常DNS请求包长通常在64-128字节,而该攻击流量的包长集中在200-300字节(携带了加密载荷)。
- TXT记录滥用:攻击者大量使用TXT记录查询来接收指令,这在正常的医院业务中极为罕见。
处置与阻断
- DNS实时阻断 :在边界防火墙上配置策略,对命中恶意域名
*.sys-health-check.com的解析请求直接丢弃响应包(DNS Sinkhole)。 - 漏洞修补:定位到失陷主机为内网一台未打补丁的OA服务器,立即进行隔离和补丁更新。
- 基线优化:建立医院内网DNS解析基线,对偏离基线的异常解析行为(如解析境外冷门域名)实施实时告警。
专家总结
此次事件再次证明,"看不见"是安全最大的敌人。在福建这样医疗信息化程度较高的地区,必须建立基于全流量的"透视"能力,才能发现隐藏在标准协议下的隐蔽威胁。单纯依赖边界防火墙的端口过滤,已无法应对当前的DNS层攻击。