ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Click Fix攻击链解析:DNS TXT与PowerShell载荷的实战防御

Click Fix攻击链解析:DNS TXT与PowerShell载荷的实战防御 上周处理一台终端异常时用户跟我说电脑突然变卡右下角还反复弹出奇怪的窗口。我查了PowerShell操作日志发现就在一小时前这台机器执行了一条非常可疑的命令——它先向一个陌生域名发起了DNS TXT查询然后把拿到的内容拼接成一段脚本运行。进一步追问才知道用户之前在某个网站看到“浏览器异常点击修复”的提示按照页面指引按下WinR并粘贴了一段“修复代码”。这就是典型的Click Fix攻击攻击者不直接给你传文件而是让你自己动手把恶意PowerShell命令送进系统。更巧妙的是命令本体不是藏在网页里而是藏在一段看起来人畜无害的DNS TXT记录中。要理解这种攻击需要同时搞懂三件事攻击者如何让人乖乖执行命令社会工程、为什么用DNS TXT传递负载信道选择、以及PowerShell拿到负载后做了什么执行逻辑。这篇文章我按攻防双方的视角把整套链路拆开讲清楚并给出检测、取证和防御的可落地方法。适合安全运维、蓝队成员以及想搞明白“为什么不能随便复制终端命令”的普通用户。1. 攻击链路全景拆解一次点击修复背后发生了什么1.1 什么是Click Fix伪装成“修复”的社会工程诱导Click Fix点击修复并非某个软件的名字而是安全圈对一类攻击手法的统称。它的核心套路是在页面上模拟一个“系统出问题需要修复”的界面常见的有四类伪浏览器错误页提示“浏览器组件已损坏请点击Fix”伪验证码页面提示“人机验证失败请运行命令完成验证”伪软件激活页提示“Office许可证异常请按步骤修复”伪安全警报提示“检测到病毒请执行清理命令”。每类页面的终点几乎一样让用户复制一段精心构造的命令按WinR调出运行框粘贴后回车。为什么攻击者要绕这么大一圈而不是直接投放exe文件因为浏览器下载exe会被拦截提示邮件网关也会扫描附件而复制粘贴命令属于用户主动操作很多杀毒软件不会对运行框里的内容做严格检查。从攻击者角度看这是把恶意代码“合法化”为一次本地用户操作远比投毒exe的成功率高。1.2 DNS TXT记录为什么攻击者选择它作为载荷分发通道DNS TXT记录原本是一个很朴素的机制给域名附加一段人类可读的文本说明后来大量用于SPF邮件校验、站点所有权验证这些场景。它的特点是存储和查询都非常简单几乎不会触发内容安全网关对“下载文件”的检查。攻击者看中的正是这一点。把恶意PowerShell命令塞进TXT记录有几个现实好处查询流量看起来就是普通DNS请求很多防火墙不会对DNS流量做深度内容检测载荷不在受害者的磁盘上出现静态文件的扫描完全失效攻击者可以随时修改TXT记录里的内容相当于拥有一个即时更新的恶意代码分发源托管成本极低一个域名、一条解析记录就能反复使用。和HTTP下载相比DNS TXT不需要等待文件传输查询速度快而且浏览器安全策略对DNS查询管得很少。当然TXT记录能承载的数据量有限实际可用通常在几百到几千字节所以攻击者一般用它传递第一阶段的小型loader命令再让这个loader从HTTP服务器拉取更大的工具包。1.3 完整攻击链从诱饵页面到持久化后门把前面两部分串起来一次典型的Click Fix DNS TXT攻击可以分为六个阶段阶段攻击行为攻击者的目标投放通过恶意广告、钓鱼邮件或SEO挂马把受害者引到伪造页面建立信任诱导页面展示“复制-运行”操作指引让用户主动执行命令启动受害者按WinR粘贴并运行PowerShell命令完成代码执行入口拉取PowerShell解析域名查询TXT记录获取载荷绕过文件检测执行解码载荷下载并运行后续恶意模块落地植入持久化写入开机自启、计划任务或注册表维持控制这里最关键的是“诱导”和“拉取”两个阶段。前者决定攻击能不能开张后者决定攻击能不能躲过检测。很多安全团队在防范时只盯着“是否有恶意文件落地”结果这套攻击从第一行命令开始就不落文件自然容易漏掉。2. 恶意载荷的技术拆解DNS TXT里的PowerShell如何被解析执行在分析和防御这套攻击前必须把DNS TXT和PowerShell的执行机制弄明白。2.1 DNS TXT记录的基本原理TXT记录本质上是一组由引号包裹的字符串用来描述域名的附加信息。在命令行工具里你可以用nslookup直接查询nslookup -typeTXT clickfix.example.com在PowerShell中则用Resolve-DnsName -Type TXT clickfix.example.com查询结果通常返回类似Q2xpY2tGaXggRXhhbXBsZQ这样的字符串。这个字符串就是攻击者藏在DNS里的内容。由于TXT记录本身只是一种数据存储DNS服务器并不关心内容含义所以它既能存正常文本也能存完全被Base64编码后的命令。这里有一个容易踩的坑用 Resolve-DnsName 返回的TXT记录往往带着两端的引号实际写脚本解析时要用 Trim() 去掉否则后续Base64解码会多出两个字符报错。2.2 攻击者常用的编码与混淆手法单纯把命令放TXT里显然太显眼所以攻击者会先做几层处理Base64编码最基础却最实用PowerShell原生支持从Base64还原字节ASCII转进制把每个字符转成十六进制或八进制再拼接反转字符串执行时再反转回来变量拼接把一条长命令拆成多段变量运行时拼接再调用减少特征词用-e短参数替代-EncodedCommand用-nop替代-NoProfile。例如一段命令可能长这样powershell -nop -w hidden -e Base64编码内容这里的-e后面跟的就是Base64编码的脚本。这类命令最容易被杀软拦截但攻击者会再套一层“动态拼接”来降低检测概率比如用$aIEX(...)的方式延迟关键特征的暴露。我在实际分析中也见过更“讲究”的攻击者把字符串拆成多个单字符变量通过[char]方式还原这样即使杀软扫描TXT记录内容也看不出任何明显的恶意函数名。2.3 解码与静态分析方法拿到一个疑似恶意TXT负载我习惯按三步走。第一步先看原始字符串。在隔离分析机中执行Resolve-DnsName查询把返回内容保存到文本文件里不要把内容直接丢进PowerShell执行。第二步判断编码类型。先尝试Base64还原用PowerShell做一个无害演示$encoded Q2xpY2tGaXggRXhhbXBsZQ [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encoded))执行后输出ClickFix Example说明还原成功。如果输出乱码常见原因是原始内容不是UTF8编码需要换成ASCII或Unicode再试。这里顺便提醒一句日常排查PowerShell文件乱码问题也通常是编码没选对用VS Code把文件转成带BOM的UTF-8或系统默认编码基本都能解决。第三步阅读还原后的内容。正常的第二阶段脚本通常包含下载器逻辑、持久化写入、反弹连接其中至少一种。看到IEX、DownloadString、FromBase64String、Start-Process这些词基本可以确认是恶意行为。2.4 为什么这类载荷能绕过常规检测把攻击链串起来看这套方案最聪明的地方在于“不落盘不落地”。恶意脚本从TXT记录里被拉取后直接在PowerShell进程的内存中解码执行文件系统上全程没有exe或dll出现。传统的文件扫描引擎完全看不到攻击活动HTTP流量检测器如果不看DNS流量也拿不到证据就算用户复制命令到运行框那一刻被抓到如果安全软件只关注“下载文件”而不关注“执行命令”依然会漏。另外攻击者还会故意使用-ExecutionPolicy Bypass这类参数在命令行层面绕过Windows默认的PowerShell执行策略。一旦进入内存执行环节AMSI反恶意软件扫描接口是少数能在脚本执行前拦一把的机制但攻击者也会尝试通过混淆和内存patch绕过AMSI。这也是为什么这类攻击需要从进程、网络、日志多个层面联动检测。3. 检测与取证在真实环境中揪出Click Fix攻击看完了攻击原理接下来讲排查。真实环境里我不会一上来就跑扫描器而是先建立时间线和进程线索。3.1 终端侧从进程与日志找蛛丝马迹Windows的事件日志是第一个要看的地方。重点关注三处安全日志4688进程创建记录命令行的进程信息前提是开启了命令行审计PowerShell日志4104脚本块日志PowerShell会把被执行的脚本块内容记录下来Sysmon事件1进程创建和事件22DNS查询如果部署了Sysmon可以直接看到进程与DNS查询的对应关系。如果你需要手动看可疑进程PowerShell里最常用的是Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match PowerShell }输出里的命令行字段就是判断关键凭据。如果发现某个由explorer或cmd启动的PowerShell进程带着-nop -w hidden -e这串参数基本上可以断定是恶意。如果怀疑有隐藏脚本文件可以再配合Get-ChildItem -Path C:\Users\xxx -Recurse -Filter *.ps1 -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 20按修改时间倒序翻一遍往往能发现刚落地还没被清理的恶意脚本。3.2 网络侧DNS TXT查询异常的特征在DNS服务器或内网出口设备上可以关注这类查询大量TXT记录查询且查询域名与业务无关一个域名突然出现多条TXT记录TXT记录的内容经过Base64编码出现类似结尾的字符串查询行为集中在某个终端与该终端上进程启动时间吻合。这类特征单看一条可能不明显但结合终端侧的PowerShell启动事件往往能快速锁定问题机器。3.3 浏览器与剪贴板取证如果用户还能回忆起访问的网址去浏览器历史里找回页面是最直接的思路。伪造页面的前端通常有一段JavaScript用来生成要复制的命令。在浏览器的缓存或开发者工具中可以看到原始命令内容。这里有个实操禁忌不要在受害者的正常工作机上直接复制粘贴未知命令到PowerShell里哪怕只是为了“看看内容”。正确做法是把命令写入文本文件在隔离分析机或沙箱里打开。3.4 快速判断一段命令是否恶意的几个特征给一个快速排查清单参数包含-EncodedCommand或-e命令中混有FromBase64String、IEX、DownloadString使用-WindowStyle Hidden隐藏窗口结合-NoProfile或-nop跳过配置文件加载命令内容本身不是完整逻辑只是拉取远程内容。达到其中两三条就需要按应急事件处理。4. 防御与处置从用户习惯到企业级管控4.1 用户意识别让“修复”变成攻击入口说句扎心的话这套攻击最大的漏洞不是系统而是“用户那一刻的默认信任”。页面说“请复制并运行”用户很少会质疑。所以要反复强调一个常识任何正规系统都不会让你按WinR、粘一段代码来“修复浏览器”或“完成验证”。对个人用户我的建议是看到这类提示先关页面换个官方渠道核实如果已经复制了命令宁可多花两分钟发给身边懂行的人看一眼也别直接运行。对安全团队来说结合钓鱼演练和短小的即时提示会让员工形成条件反射凡是让复制代码到运行框的一律视为攻击。4.2 主机加固AMSI、AppLocker与受限语言模式终端侧的防御不是靠装一个杀软就完事需要做组合确保AMSI工作正常Windows Defender开启实时保护后会为PowerShell提供AMSI扫描日志记录也可以通过PowerShell 5.0的事件通道查看用AppLocker或WDAC限制PowerShell可执行范围只允许管理员或特定程序调用PowerShell启用PowerShell受限语言模式对部分行业用户可以设置$ExecutionContext.SessionState.LanguageMode为ConstrainedLanguage限制脚本中的危险性调用关闭不必要的PowerShell远程管理端口、限制WinRM访问。这里有另一个值得注意的点攻击者为了“解除PowerShell限制”会尝试用-ExecutionPolicy Bypass绕过执行策略。要真正防住不能只靠执行策略还需要AppLocker、AMSI和日志审计配合。4.3 网络层防护对DNS TXT异常查询的监测网络侧的核心是“给DNS流量加一双眼睛”。常见做法包括在内网DNS上开启查询日志重点记录TXT类型查询用SIEM把DNS日志和终端进程日志做关联分析对已知恶意域名引入威胁情报查询命中即告警防火墙或DNS安全设备对异常TXT响应内容做解码预检。DNS流量量大刚开始做告警时会有大量误报。我的经验是先拿“TXT查询 PowerShell进程启动 外连HTTP子域名”三个条件做组合告警准确率会明显提升。4.4 应急处置发现中毒后的应对流程如果已经确认有终端被Click Fix打入按这个流程走先把机器断网阻止继续外连但不要关机避免丢失内存线索采集证据进程列表、PowerShell日志、DNS查询日志、浏览器历史、启动项查持久化Run注册表键、启动文件夹、计划任务、WMI事件订阅清理恶意项修改相关账号密码检查是否有横向移动在不破坏证据的前提下更新防病毒定义全盘扫描观察24小时确认无反弹连接后恢复正常使用。整个处置过程最忌讳的是急着重装系统。重装虽然能清除恶意软件但会丢掉攻击入口和攻击手法的证据安全团队很难再做复盘和溯源。5. 实战中踩过的坑与排查心得最后这部分把实际排查中经常遇到的问题整理成速查表再加上几条经验之谈。5.1 常见问题速查表问题常见原因解决办法解码Base64后出现乱码源内容不是UTF8编码依次尝试UTF8、ASCII、Unicode检查是否混入多余引号查询TXT记录返回空域名不存在TXT记录或解析服务器缓存了旧记录换公共DNS或指定权威DNS服务器再查PowerShell执行策略显示受限组策略覆盖了注册表设置检查本地组策略不要轻易用Bypass全覆盖杀毒软件没有报警但行为异常恶意载荷只存在于内存文件扫描失效收集内存镜像和PowerShell脚本块日志分析清除启动项后仍然外连存在计划任务或WMI事件订阅持久化用Get-ScheduledTask和WMI查询完整检查找不到攻击来源页面用户无法回忆网址缓存被清查浏览器历史、DNS解析日志和代理访问日志5.2 几条实战排查心得第一永远在隔离环境里复现。用一台干净的虚拟机去模拟查询TXT记录和解码过程不要在受害机上反复尝试。你永远不知道哪一步会把残留的恶意逻辑再次触发。第二先把时间线图画明白。用户说“我没打开奇怪网站”但日志可能显示3分钟前有PowerShell启动和TXT查询记录。以日志为准以时间线为导向排查效率会高很多。第三注意观察“最像正常”的异常。有一次我排查到某台机器持续外连启动项和计划任务都很干净最后发现攻击者在一个看似正常服务名的计划任务里用了隐藏参数。很多时候恶意行为和正常系统管理行为只有一两个参数之差多问一句“这个任务是谁建的、什么时候建的”就能找出线索。第四不要小看日志保留周期。PowerShell脚本块日志默认可能有大小限制DNS日志也经常因为磁盘配额被截断。提前把日志转到集中采集平台比事后补救重要得多。说实话Click Fix这类攻击并不需要多高深的技术真正难防的是“让用户在某个瞬间失去警惕”这件事。我在实际排查中见过太多类似场景用户很谨慎却恰好在非常疲惫或着急时点了那一下。所以我的建议一直很朴素——把“不要随意复制粘贴命令到运行框”当成和“不点陌生链接”一样的基本习惯。对安全团队来说真正有效的不是某一款神器而是把DNS查询审计、PowerShell日志、进程监控这几件事持续做下去。哪怕只是一个简单的TXT记录查询在平时是噪音在关键时间点就是抓住攻击者的那根线。别怕麻烦这些基础工作最后都会在应急响应时救你一次。
返回列表