第四章:注册表与计划任务——攻击者的“后门”藏身处
做EDR这么多年,我见过太多攻击者留下的痕迹。说实话,最让我头疼的往往不是那些复杂的0day漏洞,而是注册表和计划任务这些“老把戏”。为什么?因为它们太容易被忽视了。
你想想看,一个攻击者拿下了一台服务器,他第一件事是什么?不是搞破坏,而是想办法“留下来”。注册表的Run键、计划任务、WMI订阅——这些都是经典的持久化手段。我曾在一次应急响应中,发现攻击者把恶意DLL藏在RunOnce里,系统重启一次就执行一次,然后自毁。要不是我们抓到了那个毫秒级的执行日志,差点就漏掉了。
4.1 注册表关键项监控
注册表是Windows的“灵魂数据库”。攻击者特别喜欢往这里写东西。我个人习惯把监控重点放在以下几个位置:
| 注册表路径 | 作用 | 攻击者常用手法 |
|---|---|---|
HKCU\Software\Microsoft\Windows\CurrentVersion\Run |
当前用户登录时自动启动 | 写入恶意程序路径 |
HKLM\Software\Microsoft\Windows\CurrentVersion\Run |
所有用户登录时自动启动 | 写入后门或远控木马 |
HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnce |
下次登录时执行一次后自动删除 | 一次性载荷投放,执行后擦除痕迹 |
HKLM\System\CurrentControlSet\Services |
系统服务注册 | 伪装成系统服务,实现高权限持久化 |
重点监控行为:
- 非微软签名的程序写入Run/RunOnce键
- Services键下新增的异常服务(尤其是ImagePath指向临时目录或可疑路径)
- 注册表项被修改为指向网络共享或远程路径
我记得有一次,一个攻击者把恶意DLL注册成了“Windows Update Service”,服务名看起来完全正常。但仔细一看,ImagePath指向了C:\Users\Public\目录。嗯,这里要注意——微软自己的服务绝不会从用户目录启动。
4.2 计划任务创建与修改
计划任务这东西,本来是为了方便管理员做自动化运维的。但攻击者发现它太好用了——可以指定执行时间、执行用户、执行条件,甚至还能隐藏任务。
我建议你重点关注以下几个维度:
- 任务名称:攻击者经常用“GoogleUpdateTask”、“AdobeFlashPlayerUpdate”这类名字来伪装
- 触发器:比如“系统启动时”、“用户登录时”、“每隔X分钟”
- 操作:执行的程序路径、参数。特别注意那些从
%TEMP%、%APPDATA%启动的 - 运行用户:如果任务以SYSTEM权限运行,但创建者是一个普通用户,这就有问题了
实战技巧:
在EDR中,我通常会设置一个规则:任何非管理员用户创建的计划任务,只要执行路径包含powershell.exe -enc或cmd.exe /c,直接告警。这招帮我抓到了不少挖矿脚本。
我曾经处理过一个案例:攻击者创建了100多个计划任务,每个任务只执行一次,然后自删除。任务名全是随机字符串。这种批量创建+自毁的模式,就是典型的“脚本小子”行为。但EDR如果只盯着单个任务看,很容易漏掉。所以,行为模式分析比单点检测更重要。
4.3 WMI持久化机制
WMI持久化,说白了就是利用Windows Management Instrumentation的订阅机制。攻击者创建一个事件过滤器,当某个条件满足时(比如系统启动、进程创建),自动触发一个脚本或程序。
这种手法隐蔽性极高。为什么?因为WMI订阅不写文件,不写注册表Run键,甚至不创建计划任务。它活在WMI的存储库里,普通管理员根本不会去查。
常见的WMI持久化方式:
# 创建一个WMI事件订阅(示例)
# 当系统启动时,自动执行恶意脚本
$filter = Set-WmiInstance -Namespace root\subscription -Class __EventFilter -Arguments @{
Name = "SystemStartupFilter"
EventNameSpace = "root\cimv2"
QueryLanguage = "WQL"
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System'"
}
$consumer = Set-WmiInstance -Namespace root\subscription -Class CommandLineEventConsumer -Arguments @{
Name = "MaliciousConsumer"
CommandLineTemplate = "powershell.exe -WindowStyle Hidden -EncodedCommand <base64>"
}
Set-WmiInstance -Namespace root\subscription -Class __FilterToConsumerBinding -Arguments @{
Filter = $filter
Consumer = $consumer
}
⚠️ 注意:
WMI订阅在系统重启后依然有效。而且,很多EDR默认不监控WMI的__EventFilter和CommandLineEventConsumer类。如果你不做针对性配置,攻击者可以长期潜伏。
我个人习惯在EDR中开启WMI持久化检测。具体来说,就是监控root\subscription命名空间下的新增对象。一旦发现有新的__EventFilter和CommandLineEventConsumer绑定,立刻拉高告警级别。
知识体系总览
下面这张图,是我自己总结的注册表与计划任务监控的核心逻辑。你可以把它当作一个检查清单:
嗯,最后说一句。注册表和计划任务的监控,说白了就是跟攻击者玩“猫捉老鼠”的游戏。他们藏得越深,我们就要挖得越细。但记住一点:不要只盯着单个告警看,要关注行为链条。一个注册表写入可能是误报,但如果同时伴随着计划任务创建和网络连接外联,那基本可以实锤了。
避坑指南:
我曾经在配置EDR规则时,把“所有Run键写入”都设为告警。结果一天收到几千条告警——全是正常软件安装。后来我加了两个条件:一是排除微软签名,二是排除已知安装目录。告警量直接降了90%。所以,白名单比黑名单更重要。
公众号:蓝海资料掘金营,微信deep3321