1. 项目概述为什么DNS是恶意软件分析的“金矿”如果你在网络安全或者运维岗位上待过一段时间肯定会听过一句话“没有恶意软件能离开网络通信”。而在这纷繁复杂的网络流量中DNS域名系统协议这个互联网的“电话簿”往往是被安全分析人员忽视的宝藏更是恶意软件作者试图隐藏自己的“最佳掩护”。我处理过不少安全事件从最初的毫无头绪到最终定位到感染源十次有七八次突破口都藏在DNS查询记录里。这个项目要做的就是带你深入这个战场。我们不用那些昂贵的高级威胁检测平台就靠一个业界标准的免费工具——Wireshark加上你对协议的理解和一双善于发现异常的眼睛从海量的网络包中把那些试图通过DNS“打电话回家”的恶意软件给揪出来。这听起来很“黑客”但其实是一套非常系统化、可重复的操作流程。无论是安全工程师进行事件响应还是运维人员想排查内网中那台“行为怪异”的主机这套方法都能直接拿来用。你会发现很多高级持续性威胁APT攻击的初始阶段都离不开对DNS的滥用。2. 核心思路拆解恶意软件如何利用DNS我们又该如何反击在深入抓包和分析之前我们必须先搞清楚“敌我”双方的基本战术。否则你面对Wireshark里成千上万的DNS记录只会是一头雾水。2.1 恶意软件使用DNS的常见“花招”恶意软件不像正常软件那样使用规规矩矩的域名它们会玩各种把戏来逃避检测和实现控制。1. 域名生成算法DGA这是高级恶意软件最常用的技术之一。恶意软件内置一个算法可以按特定规则例如基于当前日期、种子值动态生成大量伪随机域名。它尝试连接这些域名中的一个作为其命令与控制C2服务器。这样做的好处是安全人员无法通过简单封禁一个固定域名来阻断它。你在流量里会看到主机频繁查询一系列看起来毫无意义、像乱码一样的域名例如xbqweyrtjkhgfd.com、plmkoijnbvgyc.net。2. 高频查询与长域名为了传递数据或探测网络连通性恶意软件可能会对同一个域名或一批域名发起远超正常频率的DNS查询。另一种手法是使用超长的子域名将需要外传的数据如窃取的文件名、系统信息编码在域名本身中。例如查询abc.def.ghi.[Base64编码的数据].malicious.com。接收端的C2服务器只需要解析这个域名就能从查询请求中提取出数据这是一种隐蔽的“DNS隧道”技术雏形。3. 查询非常见或伪造的域名类型除了最常见的A记录查询IPv4地址和AAAA记录IPv6恶意软件可能会查询TXT、MX、CNAME甚至NULL等不常用的记录类型用于数据传输或混淆。特别是在内网中查询大量不存在的内部域名NXDOMAIN响应激增可能是恶意软件在暴力扫描内网服务或尝试进行DNS重绑定攻击。4. 短生存时间TTL恶意软件控制的域名往往将DNS记录的TTL设置得非常短比如几十秒。这样它们可以快速更换服务器IP地址增加追踪和封禁的难度。在Wireshark中你需要留意DNS响应包里Answer段的TTL值。2.2 我们的分析策略与Wireshark定位知道了对手的套路我们的策略就是“以不变应万变”在Wireshark中建立一套过滤和审视流量的方法。核心策略寻找“异常”而非“恶意”一开始不要试图直接找到“恶意”域名这很难。我们的目标是先找到“异常”的DNS行为。什么是异常就是相对于你网络环境的正常基线而言显得突兀的行为。比如一台普通的办公电脑突然开始每秒查询几次域名或者查询了大量从未见过的、奇怪的域名。Wireshark中的关键抓手协议过滤器dns这是基础过滤出所有DNS流量。统计功能这是重中之重。Statistics - Conversations会话切换到DNS标签页这里可以清晰看到哪个IP地址发起了最多的DNS查询哪个被查询的域名出现频率最高。显示过滤器组合使用过滤器进行精确定位例如dns.flags.response 0只看查询请求。dns.qry.type 1只看A记录查询。dns.qry.name contains “.tk”查找包含特定可疑顶级域如.tk, .ml, .ga等免费域名常被滥用的查询。!dns.qry.name contains “yourcompany.com”排除内部合法域名专注于外部查询。注意在开始分析前最好能在相对“干净”的时期抓取一段基线流量了解你网络中正常的DNS“声音”是什么样的。这样当“杂音”出现时你才能敏锐地察觉。3. 实战环境搭建与数据捕获要点工欲善其事必先利其器。分析的前提是拿到高质量的数据包。这一步没做好后面分析全是空中楼阁。3.1 Wireshark安装与抓包位置选择Wireshark的安装不再赘述从官网下载即可。关键在于抓包的位置这直接决定了你能看到什么。1. 本机抓包针对单机分析如果你怀疑某台特定电脑比如你的分析机或一台可疑终端直接在它上面用Wireshark抓包是最直接的。选择正确的网卡通常是Wi-Fi或以太网卡。但这里有个大坑现代操作系统和浏览器广泛使用的DNS-over-HTTPSDoH或DNS-over-TLSDoT会对你的分析造成盲区。这些加密的DNS查询在网卡层面是加密的HTTPS或TLS流量Wireshark无法直接解析为DNS协议。应对方法在分析前暂时在系统或浏览器设置中关闭DoH/DoT迫使系统使用传统的明文DNSUDP 53端口。或者你需要配置Wireshark的SSL/TLS解密功能并导入客户端密钥这比较复杂。2. 网络镜像端口SPAN抓包最佳实践这是企业环境分析的首选方法。在网络交换机上将你需要监控的网络端口或整个VLAN的流量镜像到一个指定端口然后将安装了Wireshark的电脑接到这个镜像端口上。这样你可以无损地捕获整个网段的所有流量包括所有设备的DNS请求和响应。实操心得配置镜像端口时务必确认交换机的性能是否足以处理镜像流量而不丢包。对于千兆网络镜像端口和对端分析机的网卡最好支持万兆。我曾遇到过因为镜像端口带宽不足导致抓取大流量时大量丢包错过了关键的攻击序列。3. 网关处抓包如果条件有限可以在网络网关路由器/防火墙处抓包。这能看到所有进出内网的DNS流量。但缺点是无法精确对应到内网的具体源IP如果网关做了NAT且流量巨大需要强大的过滤技巧。3.2 捕获过滤器与显示过滤器的正确使用Wireshark有两层过滤器用途截然不同。捕获过滤器Capture Filter在抓包开始前设置语法基于BPF用于丢弃不关心的流量减少抓取文件的大小和系统负荷。例如如果你只关心DNS可以设置port 53。但注意这也会过滤掉非标准端口的DNS流量虽然很少见。显示过滤器Display Filter在抓包完成后使用用于隐藏已抓取数据包中的无关流量语法更强大灵活。我们分析时主要用它。一个关键技巧在开始长时间抓包前先用一个很宽的捕获过滤器如host 8.8.8.8抓几分钟快速看一下你的环境中DNS流量大概的协议和端口分布再决定正式的捕获过滤器。有时一些应用或恶意软件会使用非53端口进行DNS通信。3.3 第一次抓包建立流量基线在怀疑有感染事件发生前如果条件允许进行一次“健康状态”下的抓包时间15-30分钟即可。保存为baseline.pcapng。重点观察Statistics - Protocol Hierarchy看DNS流量占比是否正常。Statistics - Conversations - DNS记录下最常见的内部DNS服务器地址、最常见的被查询外部域名如微软、谷歌更新域名等。注意正常用户产生的DNS查询模式通常是突发性的打开网页时集中查询而非均匀、持续的高频查询。这个基线文件是你后续判断“异常”的参照物。4. 深度流量分析从海量数据包到精准线索假设我们现在已经抓取到了一段包含可疑流量的数据包文件incident.pcapng。真正的侦探工作开始了。4.1 第一步宏观统计发现异常点不要一头扎进数据包详情里。先利用Wireshark的统计功能俯视全局。打开Statistics - Conversations选择IPv4/IPv6和DNS标签页。这里列出了所有通信对。看哪个内网IP地址的DNS查询“包数”最多。将其与基线对比如果某个IP的DNS活动量级远超同类其他主机它就是首要嫌疑对象。记下这个IP10.0.1.105。同时看哪个被查询的域名出现的频率最高。如果出现一个陌生的域名且查询次数异常多比如几百上千次它就很可疑。使用Statistics - HTTP - DNS统计。这个功能能直接列出所有被查询的域名及其请求次数。按请求次数降序排列。排在前面的除了google.com、windowsupdate.com这类正常域名外如果出现了像7f8d3e.xyz、update.bestsofts[.]net这种看起来随机或模仿正常软件更新的域名就需要重点标记。应用显示过滤器聚焦嫌疑IP。在过滤栏输入ip.src 10.0.1.105 and dns。这样视图里就只显示来自这台可疑主机的所有DNS流量。4.2 第二步解码DNS查询内容识别恶意模式现在我们聚焦到10.0.1.105的DNS查询上。一条条查看Info列。1. 识别DGA域名查看查询的域名名称。DGA域名通常具有以下特征字符随机ajshdg.xyz,pqowie.ml看起来像胡乱敲键盘打出来的。长度相似同一家族DGA生成的域名长度可能一致。时间规律可能每隔固定时间如5分钟、1小时查询一批新域名。操作你可以尝试对dns.qry.name字段进行排序观察域名模式。也可以使用Wireshark的Statistics - DNS中的Requested Domains进行汇总查看。2. 识别数据外泄DNS隧道观察是否有非常长的、包含多级子域且子域名像编码字符串的查询。例如ZWNobyBoZWxsbyB3b3JsZA.data.malicious[.]top这里的ZWNobyBoZWxsbyB3b3JsZA是 “echo hello world” 的Base64编码。虽然这个例子简单但实际中可能是窃取的密钥、系统信息等。操作可以尝试用显示过滤器筛选长域名dns.qry.name len 50。然后右键域名 -Copy - Bytes - Printable Text Only将域名粘贴到文本编辑器手动或使用脚本尝试Base64、Hex等解码看是否能得到可读信息。3. 分析查询类型和响应点击一个DNS查询包在下方详情面板展开Domain Name System (query)。检查Queries部分Type字段。除了A、AAAA大量TXT、NULL查询需要警惕。检查响应包找到对应的DNS响应包dns.flags.response 1。Answers部分看返回的IP地址是什么。一个可疑域名可能指向一个已知的恶意IP可以通过威胁情报平台如VirusTotal、AlienVault OTX查询该IP或域名。Authoritative nameservers部分有时恶意域名的权威NS服务器也很有特点可能是另一个恶意域名。Time to liveTTL值非常小如300秒以下是另一个危险信号。4.3 第三步时间线分析与会话追踪恶意活动往往不是孤立的。我们需要把离散的DNS查询和其他网络活动关联起来。使用Statistics - Flow Graph。设置过滤条件为ip.addr 10.0.1.105生成一个该主机所有网络会话的时序图。你可以清晰地看到DNS查询之后是否立即跟随了到某个IP的TCP连接可能是C2通信的建立。在图上DNS查询和后续的TCP SYN包紧密相连这是一个非常强的关联证据。使用Follow - UDP Stream对于DNS。虽然DNS主要用UDP但Follow UDP Stream功能对于查看完整对话不那么直观。更好的方法是使用tshark命令行版本的Wireshark进行聚合分析。打开命令行进入抓包文件目录执行tshark -r incident.pcapng -Y dns and ip.src10.0.1.105 -T fields -e frame.time -e dns.qry.name -e dns.resp.addr -E separator, dns_log.csv这条命令会提取可疑主机所有DNS查询的时间、查询域名和响应IP输出为CSV文件。用Excel打开你可以轻松地按时间排序、按域名分组分析其查询模式。关联HTTP/HTTPS流量。在发现可疑DNS解析出IP例如185.1.2.3后立即在显示过滤器中添加对该IP的过滤查看是否有后续的HTTP/S通信ip.addr 185.1.2.3 and (http or tls.handshake)。如果发现紧接着有TLS握手或HTTP GET/POST请求那么基本可以确定这个DNS查询是为恶意C2通信做准备的。5. 案例复盘一个真实的DGA恶意软件感染分析让我用一个简化但真实的案例串联上面的所有步骤。当时我们收到告警内网一台服务器10.0.5.20出站流量异常。第一步抓包与宏观统计在核心交换机做了端口镜像抓包30分钟。在Conversations的DNS标签页立刻发现10.0.5.20对端口53的发送包数量是第二名的数十倍。第二步聚焦与分析查询模式过滤ip.src 10.0.5.20 and dns。观察发现它每隔约5分钟就会发起一轮约15次DNS查询查询的域名诸如brqweytkjhfdg.xyzplmkijnhubgvc.xyzxswedcvfrtgbn.xyz...规律都是12个字母的 .xyz 域名这高度符合DGA特征。查询类型均为A记录。第三步检查响应与关联流量查看这些查询的响应发现大部分返回NXDOMAIN域名不存在但偶尔有一两个会解析到一个特定的IP45.1.2.3。每当解析到这个IP时在Flow Graph上能看到几秒后10.0.5.20就会向45.1.2.3:443发起TLS握手请求。第四步威胁情报验证将域名brqweytkjhfdg.xyz和IP45.1.2.3提交到VirusTotal等平台查询。反馈显示该IP已被多个安全厂商标记为恶意C2服务器关联的恶意软件家族是“某僵尸网络”。结论主机10.0.5.20感染了使用DGA技术的僵尸网络恶意软件。它通过不断尝试生成域名来寻找存活的C2服务器一旦找到45.1.2.3便建立加密通道等待指令。6. 进阶技巧与自动化分析思路手动分析对于单个事件是可行的但面对海量数据或需要持续监控时就必须借助自动化和外部工具。6.1 使用Wireshark命令行工具tshark进行批量提取tshark是脚本化和自动化分析的利器。除了前面提取DNS日志的例子还可以做很多事提取所有唯一查询域名tshark -r incident.pcapng -Y dns.flags.response 0 -T fields -e dns.qry.name | sort | uniq -c | sort -nr unique_domains.txt统计查询类型分布tshark -r incident.pcapng -Y dns -T fields -e dns.qry.type | sort | uniq -c记住常见类型代码1A, 28AAAA, 16TXT, 15MX。6.2 结合外部威胁情报IoC手动查询威胁情报平台效率低。可以将tshark提取出的域名和IP列表通过API与威胁情报平台进行自动化比对。例如编写一个Python脚本调用VirusTotal或AlienVault OTX的API批量查询并输出命中率高的恶意指标。一个简单的思路用tshark导出所有解析成功的域名-IP对。脚本去重后调用威胁情报API查询。将返回结果中标记为恶意的域名/IP高亮并关联回Wireshark数据包通过过滤dns.qry.name “malicious.com”或ip.addr “bad.ip”。6.3 构建简单的检测规则基于常见的恶意模式你可以在Wireshark中创建颜色规则或触发警报需要配合其他工具如Snort、Suricata但Wireshark本身也可做简单过滤。例如标记长域名查询可以设置一个显示过滤器如dns.qry.name len 100并将其标记为醒目的背景色View - Coloring Rules。例如标记TTL过短的响应过滤器dns.time_to_live 300。实操心得自动化不是一蹴而就的。建议先从一两个最关心的场景开始比如先自动化检测DGA域名可以通过统计域名熵值或使用正则表达式匹配随机字符模式再逐步完善。同时一定要控制误报率避免被海量的“可疑但合法”的流量淹没。7. 排查清单与常见问题解决在实际操作中你肯定会遇到各种预料之外的情况。这里整理了一份快速排查清单和常见问题的解决方法。问题现象可能原因排查步骤与解决方案抓不到任何DNS流量1. 抓包位置错误。2. 系统使用了DoH/DoT。3. 捕获过滤器设置过严。1. 确认网卡选择正确镜像端口需接对。2. 检查系统/浏览器DNS设置关闭加密DNS。3. 暂时清空捕获过滤器使用port 53或udp port 53抓取。DNS查询巨多全是内网域名或NXDOMAIN1. 内网域名扫描或暴力枚举。2. 错误配置导致DNS循环查询。3. 恶意软件探测内网服务。1. 过滤dns并查看dns.flags.rcode 3NXDOMAIN的数量。2. 定位源IP检查该主机进程和网络连接用netstat、Sysinternals ProcExp等。3. 分析查询的域名模式是否为连续的字母数字组合如admin, test, wp-admin等。能看到DNS查询但看不到后续TCP连接1. C2服务器已下线或无响应。2. 恶意软件处于“休眠”或“探测”阶段。3. 流量被防火墙阻断。4. 抓包时间窗口不够长。1. 检查DNS响应是否返回了IP。如有尝试在威胁情报平台查询该IP历史。2. 延长抓包时间观察是否有周期性重复查询。3. 检查防火墙或主机日志看是否有对目标IP的阻断记录。域名看起来可疑但威胁情报平台查不到1. 全新注册的域名“新鲜”恶意域名。2. 合法的域名被攻陷“水坑攻击”。3. 误报如CDN域名、云服务域名。1. 检查域名Whois信息关注注册时间是否非常新。2. 分析该域名解析的IP看是否属于云服务商AWS, Azure, Google Cloud或CDN这些IP可能被多人共用。3. 结合其他行为综合判断如查询频率、TTL、关联的URL路径等。Wireshark显示“Malformed Packet”或无法解析DNS1. 数据包损坏或不完整。2. 非标准端口或自定义协议的DNS流量。1. 尝试在Edit - Preferences - Protocols - DNS中调整解析选项。2. 如果确认是恶意软件使用的非标端口可以尝试右键数据包 -Decode As...强制将其解码为DNS协议。一个必须牢记的要点DNS分析很少能提供“铁证”它通常是发现线索的起点。你需要将DNS异常与进程行为、文件变化、其他网络连接如到可疑IP的HTTP/S连接等证据结合起来才能形成完整的感染事件证据链。例如当你通过DNS锁定了一个可疑进程发起的查询后立即结合系统日志和内存分析工具去查找该进程对应的恶意文件实体这才是完整的应急响应流程。最后保持你的威胁情报库如恶意域名/IP列表和Wireshark版本更新。恶意软件技术在不断进化你的分析方法和工具也需要同步迭代。多分析公开的恶意软件样本流量包如来自Malware-Traffic-Analysis.net的资源是提升这项技能最快的方式。