第四章:注册表与计划任务——攻击者的“后门”藏身处

做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 -enccmd.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的__EventFilterCommandLineEventConsumer类。如果你不做针对性配置,攻击者可以长期潜伏。

我个人习惯在EDR中开启WMI持久化检测。具体来说,就是监控root\subscription命名空间下的新增对象。一旦发现有新的__EventFilterCommandLineEventConsumer绑定,立刻拉高告警级别。

知识体系总览

下面这张图,是我自己总结的注册表与计划任务监控的核心逻辑。你可以把它当作一个检查清单:

持久化机制监控体系 注册表监控 计划任务监控 WMI持久化监控 关键监控点 • Run / RunOnce 键值 • Services 服务注册 • 启动项路径异常 • 非微软签名程序 关键监控点 • 任务名称伪装检测 • 触发器异常分析 • 执行路径白名单 • 批量创建行为模式 关键监控点 • __EventFilter 创建 • CommandLineEventConsumer • FilterToConsumerBinding • 持久化订阅检测 EDR检测策略建议 1. 注册表:监控非白名单路径写入Run/Services键 2. 计划任务:关注隐藏任务+临时目录执行+高频率触发 3. WMI:开启root\subscription命名空间变更审计

嗯,最后说一句。注册表和计划任务的监控,说白了就是跟攻击者玩“猫捉老鼠”的游戏。他们藏得越深,我们就要挖得越细。但记住一点:不要只盯着单个告警看,要关注行为链条。一个注册表写入可能是误报,但如果同时伴随着计划任务创建和网络连接外联,那基本可以实锤了。

避坑指南:

我曾经在配置EDR规则时,把“所有Run键写入”都设为告警。结果一天收到几千条告警——全是正常软件安装。后来我加了两个条件:一是排除微软签名,二是排除已知安装目录。告警量直接降了90%。所以,白名单比黑名单更重要


公众号:蓝海资料掘金营,微信deep3321