Wireshark DNS流量分析:追踪恶意软件感染的核心实战指南
2026/6/30 3:16:30 网站建设 项目流程

1. 项目概述:为什么DNS是恶意软件分析的“黄金线索”?

如果你在安全运维或者应急响应的岗位上待过一段时间,一定会对这句话深有感触:“恶意软件可以隐藏,但通信无法完全隐形。”而在所有网络通信中,DNS(域名系统)查询,就像是恶意软件在互联网上留下的“脚印”。它可能伪装、可能加密、可能快速变换,但只要它想与外界控制服务器(C2)通信,获取指令或泄露数据,DNS查询往往是绕不开的第一步。这也是为什么,掌握通过Wireshark深度分析DNS流量来追踪恶意软件感染,成为了安全分析人员的一项核心进阶技能。

我处理过不少安全事件,从早期的挖矿木马到近年的勒索软件和高级持续性威胁(APT),发现一个共同点:在主机层查杀告警之前,网络流量,尤其是DNS流量,早已发出了异常信号。这些信号可能很微弱——比如一个从未见过的、由随机字符组成的域名(DGA域名),或者对某个已知恶意IP的DNS解析请求。Wireshark作为最强大、最通用的网络协议分析工具,给了我们一个“显微镜”,让我们能深入观察这些流量,还原攻击链条。

这篇文章,我将从一个实战分析者的角度,带你超越基础的“抓个包看看”,深入Wireshark的进阶功能,系统性地拆解如何通过DNS查询这条线索,定位、分析甚至溯源恶意软件感染。无论你是安全工程师、网络管理员,还是对安全分析感兴趣的开发者,这套方法都能让你在面对可疑网络活动时,有更清晰的排查思路和更高效的处置手段。

2. 分析前的核心准备:构建你的“狩猎”环境

工欲善其事,必先利其器。直接在生产核心交换机上抓包分析是不现实的,噪音太大,风险也高。一个可控的、镜像了可疑流量的分析环境至关重要。

2.1 网络流量镜像与捕获策略

分析的第一步是拿到数据。对于恶意软件分析,我们通常关注两种场景的流量:

  1. 单机嫌疑主机分析:怀疑某台电脑中毒,需要抓取其所有进出流量。
  2. 网络边界异常监控:在网关或核心交换机上,监控特定网段或指向外部可疑域名的流量。

对于第一种情况,最直接的方法就是在嫌疑主机上安装Wireshark,选择正确的网卡进行捕获。但这里有个关键技巧:许多高级恶意软件会检测Wireshark、Process Monitor等分析工具的存在并停止恶意行为(反分析)。因此,更稳妥的做法是进行网络端口镜像(SPAN)

  • 操作:将嫌疑主机所连接交换机的端口流量,镜像到一个专门用于分析的端口,你的分析机连接在这个镜像端口上。这样,分析机可以被动接收所有流量,对嫌疑主机完全透明。
  • Wireshark设置:在Wireshark的“捕获选项”中,务必勾选“在所有接口上使用混杂模式”。虽然镜像端口本身能收到所有帧,但开启混杂模式能确保捕获到所有类型的流量包,包括非本机MAC地址的包,避免遗漏。

对于第二种情况,你需要在网络边界设备(防火墙、路由器)或核心交换机上配置镜像,将出入站流量镜像到你的分析机。这里要特别注意法律和公司政策,确保你有权限监控目标流量。

2.2 Wireshark的初始配置与过滤准备

抓包前,对Wireshark进行针对性配置,能极大提升后续分析效率。

  1. 首选解析设置

    • 进入编辑 -> 首选项 -> Name Resolution
    • 勾选“解析网络层(IP)地址”和“解析传输层名称(端口)”。这能让Wireshark将IP地址尝试解析为主机名,将端口号解析为服务名(如80->http),让流量更易读。
    • 重要警告:对于恶意软件分析,谨慎使用DNS解析(即“解析物理地址”通常指MAC,而非本文的DNS)。因为Wireshark会为每个未知IP发起反向DNS查询,这会产生大量额外网络流量,可能干扰分析环境,甚至被攻击者察觉。在分析敏感流量时,我通常不勾选此项,而是事后对特定IP手动查询。
  2. 关键过滤器的提前准备: 在Filter输入框旁,点击“Expression”按钮,提前熟悉并保存一些关键过滤表达式:

    • dns:过滤出所有DNS协议流量。这是我们的主战场。
    • dns.flags.response == 0:只显示DNS查询请求(由客户端发出)。
    • dns.flags.response == 1:只显示DNS响应包。
    • dns.qry.type == 1:过滤A记录查询(IPv4地址)。
    • dns.qry.type == 28:过滤AAAA记录查询(IPv6地址)。越来越多的恶意软件开始使用IPv6基础设施来规避检测。
    • !(arp or icmp or dns):这是一个“减法”过滤器,用于过滤掉常见的“噪音”协议(ARP、ICMP、DNS),快速查看剩下的应用层协议(可能包含恶意软件的HTTP/C2通信)。在初步筛查时非常有用。

3. 恶意软件DNS行为的特征深度解析

并非所有DNS查询都是恶意的,但恶意DNS查询通常具备一些反常特征。我们需要像侦探一样,在浩如烟海的正常流量中(如对*.microsoft.com*.googleapis.com的查询)找出这些“异常点”。

3.1 域名生成算法(DGA)的识别

DGA是恶意软件用来动态生成大量随机域名,以连接其中一个作为C2地址的技术。这是对抗域名黑名单最有效的手段之一。

  • 特征:在Wireshark的DNS流量中,你会看到内网主机在短时间内(如一分钟内)向大量看似随机的域名发起查询,例如xbvjkeo12345.com,akdfhg67890.net,pqwermn.xyz。这些域名通常由辅音字母和数字组合而成,缺乏可读的语义。
  • Wireshark分析方法
    1. 应用过滤器dns.flags.response == 0查看所有查询请求。
    2. 观察“Info”列或展开DNS协议详情中的Queries部分,查看查询的域名。
    3. 使用“统计 -> 对话”功能,选择“IPv4”或“UDP”标签页,按数据包或字节数排序。如果发现某个内网IP与大量不同的、奇怪的域名有DNS对话,这极有可能是DGA行为。
    4. 进阶技巧:你可以将一段时间内的所有DNS查询域名导出(文件 -> 导出分组解析结果 -> 为纯文本),然后用脚本或文本处理工具进行简单分析,比如统计域名长度分布、字符集(是否包含非常用字符)、顶级域(.com, .net, .ru, .cn)的集中度。DGA域名往往在长度和字符集上呈现规律性。

3.2 对已知恶意域名或IP的解析

这是最直接的感染证据。你需要借助外部威胁情报。

  • 特征:主机查询了某个存在于公开威胁情报平台(如VirusTotal, AlienVault OTX, AbuseIPDB)黑名单中的域名或IP地址。
  • Wireshark联动方法
    1. 在Wireshark中过滤出DNS响应包dns.flags.response == 1,并包含回答dns.count.answers > 0
    2. 查看Answers部分,获取解析出的IP地址。
    3. 手动或通过编写Wireshark插件(Lua脚本),将捕获到的域名和解析IP与本地或在线威胁情报库进行比对。例如,你可以将可疑IP复制到VirusTotal的搜索栏中查看其信誉评分。
  • 实操心得:不要只依赖单一的威胁情报源。有些恶意域名为了躲避检测,采用“速燃”策略,即快速注册、使用、然后废弃。它们可能还未被大型平台收录,但在一些社区或专项威胁报告中已有提及。建立自己的可疑域名/IP清单非常重要。

3.3 高频查询与“域名流”攻击

某些恶意软件会通过高频查询特定域名(可能是为了进行DDoS攻击,也可能是通信协议的一部分),或者实施“域名流”攻击(快速连续查询大量唯一域名以耗尽DNS服务器资源或隐藏真实C2)。

  • 特征:在统计视图下,某个源IP在极短时间内的DNS查询速率(QPS)异常高于基线。或者,查询的域名序列呈现某种模式(如递增的编号:data1.c2.com, data2.c2.com...)。
  • Wireshark分析方法
    1. 使用“统计 -> I/O图表”。将X轴设为时间,Y轴设为“包数/秒”或“字节数/秒”。
    2. 在过滤器栏输入dns and ip.src == [嫌疑IP],生成该主机的DNS流量速率图。
    3. 观察图表是否存在规律的、周期性的尖峰,或者持续的高位流量,这都不同于正常用户偶尔的网页浏览产生的DNS查询。

3.4 DNS隧道与数据外泄

这是一种高级威胁,恶意软件将其他协议的数据编码后封装在DNS查询和响应中,绕过传统的基于HTTP/HTTPS的防火墙检测。

  • 特征
    • 查询的域名非常长(接近DNS协议允许的255字节上限),例如a1b2c3d4e5f6g7h8i9j0.verylongsubdomain.malicious[.]com
    • 域名主体部分(a1b2c3d4...)看起来像Base64编码或十六进制字符串。
    • 存在大量对同一二级域名的TXT记录查询(dns.qry.type == 16),因为TXT记录常被用来传输数据。
  • Wireshark分析方法
    1. 过滤dns.qry.name contains “malicious[.]com”观察所有相关查询。
    2. 重点关注查询类型为A、AAAA、TXT甚至NULL(dns.qry.type == 10)的记录。
    3. 尝试对查询的子域名部分进行解码(如Base64解码),看是否能得到可读的命令或数据片段。这通常需要结合其他上下文进行分析。

4. 实战演练:从一次挖矿木马事件看完整分析流程

假设我们收到告警,内网一台服务器(IP:10.0.0.105)CPU持续异常偏高。我们已在核心交换机将该服务器所在端口的流量镜像到分析机(10.0.0.200)。

4.1 第一步:全局概览与快速过滤

  1. 开始捕获,运行一段时间(如5分钟)。
  2. 应用初始过滤器ip.src == 10.0.0.105 or ip.dst == 10.0.0.105,聚焦于该服务器的所有流量。
  3. 首先查看协议分层统计:点击“统计 -> 协议分级”。这里会直观地显示各种协议流量的占比。在恶意软件感染案例中,你可能会看到:
    • DNS流量占比异常:虽然包体积小,但数量可能非常多(DGA)。
    • 出现大量未知或非标准端口的TCP/UDP流量:可能是C2通信。
    • TLS/SSL流量激增但目标IP可疑:加密通信到非知名服务。

4.2 第二步:深入DNS流量,寻找蛛丝马迹

  1. 在现有过滤器基础上,增加DNS过滤:(ip.src == 10.0.0.105 or ip.dst == 10.0.0.105) and dns
  2. 观察流量列表。很快,我发现了异常:10.0.0.105以大约每秒10次的频率,向大量随机域名如xkjhfgb.pool[.]minexmr.com,akjdhwq.pool[.]minexmr.com发起A记录查询。
  3. 关键点分析
    • 域名模式:子域名是随机字符串,但二级域和顶级域固定为pool.minexmr.comminexmr.com是一个知名的门罗币(Monero)矿池域名。这几乎就是挖矿木马的“签名”。
    • 查询行为:高频、规律性的查询,目的是为了从矿池域名解析出可用的矿池服务器IP地址,实现负载均衡和高可用。
  4. 右键追踪流:选中一个DNS查询包,右键 -> “追踪流” -> “UDP流”。虽然DNS是UDP,但这里可以看到该事务的完整请求和响应。确认响应返回了一个有效的IP地址(比如94.23.xx.xx)。

4.3 第三步:关联分析与确认感染

  1. 定位后续连接:我们已经知道矿池域名和解析出的IP。现在清除过滤器,搜索与该IP的通信:ip.addr == 94.23.xx.xx
  2. 我们发现,在每次成功的DNS解析后,10.0.0.105都会与这个IP的某个高端口(如14444)建立一个TCP长连接,并且有持续不断的、小尺寸的、双向的数据交换。这符合挖矿客户端与矿池服务器之间的Stratum协议通信特征。
  3. 最终确认:结合高CPU使用率的告警、对已知矿池域名的DGA式查询、以及到矿池IP的长期TCP连接,我们可以确诊该服务器感染了门罗币挖矿木马。

4.4 第四步:提取威胁指标与遏制

  1. 提取IOC
    • 域名*.pool.minexmr.com(通配符)
    • IP地址:从DNS响应和后续连接中提取的所有矿池服务器IP。
    • 通信端口:TCP14444(常见矿池端口还有3333,5555,7777等)。
  2. 行动
    • 立即在网络防火墙或主机防火墙上,阻断该服务器对上述IP和端口的出站连接。
    • 提交提取的IOC到全网的威胁情报检测系统(如IDS/IPS、下一代防火墙),防止横向移动。
    • 最后,再对该服务器进行主机层面的查杀和清理。

5. 高级技巧与排查工具箱

掌握了基础流程,一些高级技巧能让你在复杂情况下游刃有余。

5.1 使用Wireshark内置的专家信息与着色规则

Wireshark的“专家信息”系统(底部状态栏的圆圈图标)能自动检测出潜在问题,如重复的ACK、乱序报文、连接重置等。对于恶意软件分析,要特别关注:

  • “Malformed”畸形包:恶意软件可能发送不符合协议规范的包来触发漏洞或作为通信暗号。
  • 大量“TCP Retransmission”重传:可能表明C2服务器在海外或网络不稳定,或者是恶意软件在频繁尝试连接一个已失效的地址。

着色规则可以高亮显示特定流量。你可以创建自定义规则,例如:

  • dns.qry.name contains “.top” or dns.qry.name contains “.xyz”着色为亮粉色。因为许多恶意软件喜欢使用这些廉价的新顶级域。
  • tcp.port == 4444(Metasploit默认端口)着色为红色。

5.2 结合外部工具进行深度分析

Wireshark不是孤岛,结合其他工具能发挥更大威力。

  • tcpdump进行长期捕获:在Linux分析机上,可以用tcpdump -i eth0 -w suspect.pcap -C 100命令进行滚动捕获(每个文件100MB),然后将大文件拿到Wireshark中分析。
  • dnstop:一个强大的实时DNS流量分析工具。在镜像端口上运行dnstop,可以实时看到哪个域名被查询得最多、哪个客户端最活跃,非常适合快速发现异常。
  • 威胁情报平台API:如前所述,手动查询效率低。可以学习编写简单的Python脚本,利用VirusTotal或AlienVault OTX的API,自动对Wireshark导出的可疑IP/域名进行批量查询,并生成报告。

5.3 解密TLS流量(如果具备条件)

现代恶意软件普遍使用TLS加密C2通信。如果在受控环境内拥有目标主机的权限,可以配置导出TLS会话密钥,以便Wireshark解密流量。

  1. 在目标主机上设置环境变量SSLKEYLOGFILE(浏览器或某些程序支持)。
  2. 在Wireshark的编辑 -> 首选项 -> Protocols -> TLS中,设置 “(Pre)-Master-Secret log filename” 指向该密钥日志文件。
  3. Wireshark即可自动解密TLS流量,让你看到加密层之下的HTTP或其他明文协议内容。注意:这仅用于安全分析和取证,必须遵守相关法律法规。

6. 常见陷阱与避坑指南实录

即使掌握了方法,实战中依然会踩坑。下面是我总结的几个典型问题及解决方案。

常见问题现象描述原因分析与解决方案
抓不到任何DNS流量过滤器dns没有显示任何数据包。1.镜像配置错误:确认镜像端口是否正确接收到了流量。可以在分析机上 ping 一个公网地址,同时在Wireshark看是否有ICMP和DNS查询包。
2.本地DNS缓存:客户端可能缓存了域名解析结果,一段时间内不会发起新查询。可以尝试在客户端清空DNS缓存(ipconfig /flushdnssystemd-resolve --flush-caches)。
3.使用了DoH/DoT:客户端可能使用了基于HTTPS或TLS的DNS,流量被加密在HTTPS流中。需过滤tcp.port == 443并尝试解密TLS,或检查客户端网络设置。
DNS流量巨大,难以定位捕获文件中绝大部分是正常的DNS查询,掩盖了恶意流量。1.使用排除法:先过滤掉已知安全的域名。例如:dns and !(dns.qry.name contains “google” or dns.qry.name contains “microsoft” or dns.qry.name contains “internal-domain”)。需要根据你的网络环境构建白名单过滤表达式。
2.聚焦于NXDOMAIN响应:恶意DGA域名很多是不存在的。过滤dns.flags.rcode == 3查看所有“域名不存在”的响应,其对应的查询域名就非常可疑。
误判正常CDN或云服务发现对大量*.cloudfront.net,*.akamaiedge.net等域名的查询,误以为是DGA。需要结合上下文:CDN域名虽然看起来随机,但通常是在访问某个主流网站(如访问www.example.com时,其资源引用了CDN链接)时触发的。检查这些查询之前或之后的TCP/SSL连接,看是否关联到了合法的知名网站。真正的恶意DGA查询前后往往没有明确的、与正常浏览相关的HTTP/S流量。
分析结果无法重现在分析机上能看到的恶意流量,在防火墙日志或其它监控系统里找不到。时区与时间同步问题:Wireshark默认使用UTC时间显示,而你的其他系统可能使用本地时间。务必在分析前,在Wireshark的“视图 -> 时间显示格式”中调整为与日志系统一致的时区,确保时间戳能对应上。

最后,我想分享一个最深刻的体会:网络流量分析,尤其是恶意软件追踪,七分靠工具,三分靠经验,但十二分靠耐心和逻辑。不要指望按下捕获键就能立刻看到标着“我是病毒”的数据包。你需要像拼图一样,把零散的DNS查询、TCP连接、载荷数据甚至网络错误信息拼接起来,形成一个完整的故事链。每一次成功的分析,都会让你对恶意软件的行为模式有更深的理解,这些经验会逐渐内化成你的“直觉”,让你在下一场“狩猎”中更加敏锐。从今天起,试着用Wireshark去看看你网络里的DNS流量,或许你会发现一些平时被忽略的“有趣的”对话。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询