[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑

最近福建这边的运维圈子不太平,好几个公司的内网被通报"非法外联",查了半天发现是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)
为什么福建地区容易中招?
  1. 公共DNS污染:很多福建用户习惯使用公共DNS(如114.114.114.114),这些DNS服务器有时会被运营商层面的劫持设备干扰,返回错误的IP。
  2. 内网管理疏忽 :很多企业的测试域名(如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次,且域名长度适中,试图模仿正常的系统后台更新行为。
溯源过程:全流量分析显神威

由于攻击流量混杂在正常的医疗业务流量中,传统的基于阈值的告警完全失效。我们采用了全流量分析方案:

  1. 全量采集:在核心交换机旁路部署流量探针,镜像采集南北向和东西向流量。
  2. 协议深度解码:利用全协议解析技术,对DNS流量进行深度解码。
  3. 异常特征提取
    • 包长分布异常:正常DNS请求包长通常在64-128字节,而该攻击流量的包长集中在200-300字节(携带了加密载荷)。
    • TXT记录滥用:攻击者大量使用TXT记录查询来接收指令,这在正常的医院业务中极为罕见。
处置与阻断
  • DNS实时阻断 :在边界防火墙上配置策略,对命中恶意域名*.sys-health-check.com的解析请求直接丢弃响应包(DNS Sinkhole)。
  • 漏洞修补:定位到失陷主机为内网一台未打补丁的OA服务器,立即进行隔离和补丁更新。
  • 基线优化:建立医院内网DNS解析基线,对偏离基线的异常解析行为(如解析境外冷门域名)实施实时告警。
专家总结

此次事件再次证明,"看不见"是安全最大的敌人。在福建这样医疗信息化程度较高的地区,必须建立基于全流量的"透视"能力,才能发现隐藏在标准协议下的隐蔽威胁。单纯依赖边界防火墙的端口过滤,已无法应对当前的DNS层攻击。

相关推荐
froginwe111 小时前
jQuery 添加元素
开发语言
zhangfeng11331 小时前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php
csbysj20201 小时前
解释器模式
开发语言
kybs19911 小时前
springboot视频推荐系统--附源码72953
java·spring boot·python·eclipse·asp.net·php·idea
CoderCodingNo2 小时前
【信奥业余科普】C++ 的奇妙之旅 | 20:更安全的间接访问——引用的设计动机与实战对比
开发语言·c++
凯瑟琳.奥古斯特2 小时前
DNS解析全流程详解
网络·网络协议
Yupureki2 小时前
《Linux网络编程》5.HTTPS协议
linux·网络·https
知识汲取者2 小时前
巨量引擎 Marketing API Java SDK 介绍
java·开发语言
182******20832 小时前
2026年40岁自学java还能找到工作吗
java·开发语言