干安全运营这些年,我最深的感受是:告警越堆越多,真正的攻击反而越来越难看见。刚开始带检测团队那会儿,我们的策略很简单——堆规则、加阈值、买更多数据源,被动告警的数量确实上来了,但内部的攻防演练一打,红队照样能悄无声息地拿到域管权限,而SOC这边还在处理几千条误报里挑不出一件真事。后来我慢慢意识到,问题不在规则写得不够多,而在于整套检测思路还停留在“等告警来找我”的被动阶段。从那时起,我开始带着团队系统性地转向主动狩猎——不是等警报响起,而是假设攻击者已经进来了,主动去找他藏在哪里。
这篇文章会把我们从被动告警切换到主动狩猎过程中的思考和做法完整拆开,讲清楚被动告警为什么会失效、主动狩猎的方法论、检测数据源怎么选、面对高级对抗手法时怎么反制,以及最后怎么把狩猎结果落成分诊和处置。适合正在搭检测体系、想提升安全运营效率的蓝队同学、安全分析师和检测工程负责人阅读,哪怕你只是刚接触SIEM,也能从中找到一套可以照着做的思路。
1. 被动告警的失效逻辑:不是规则不够多,而是攻击思路已经换赛道
1.1 阈值告警抓不住慢速攻击
被动告警最经典的形态是阈值规则,比如“同一账号5分钟内登录失败超过5次就告警”。这套逻辑对付早期那种粗暴撞库还能用,但现代攻击者早就学会了把节奏放慢。他会把密码喷射分散到几周甚至几个月,每次只打两三个账号,每个账号失败一两次就换下一个,让任何单点阈值都永远触发不了。
我见过一次真实的横向移动排查,攻击者对一批服务账号做了密码喷洒,每天只试3个账号,持续了将近一个月。期间SIEM一条告警都没触发,因为单日的失败次数远低于阈值。直到后来做日志回看,把时间窗口拉到整月聚合,才发现有一组账号的失败分布呈现出明显的规律性——每个账号都被精确地试过一轮,这在正常运维里几乎不可能发生。
阈值规则的统计学缺陷就在这里:它只能捕捉“短时间内大量重复”的暴力特征,对“低频、分散、有耐心”的行为模式完全没有建模能力。被动告警不是不好,而是它的前提假设——攻击者一定是急切的——在今天的对抗中已经不成立了。
1.2 签名匹配在合法工具面前基本失效
另一类被动告警的核心是签名匹配,比如静态文件哈希、YARA规则、已知恶意域名和IP黑名单。这套机制对“已知的恶意文件”非常有效,但对“用系统合法工具干坏事”的手法基本无能为力。
攻击者现在最常用的路径根本不是投放一个陌生木马,而是调用系统自带的PowerShell、WMI、mshta、certutil、bitsadmin这些工具。这些工具默认就在白名单里,行为上看起来和正常运维没有任何区别。一条YARA规则写得再好,也拦不住攻击者用三五行命令把编码后的脚本拉起来执行——因为加载脚本的进程是绝对合法、绝对受信任的系统组件。
签名匹配的本质是“我知道坏东西长什么样才拦你”,而现代攻击的核心恰恰是“我没有坏东西,我只是在用你的东西做坏事”。方向错了,规则写得越多越累,漏的还是漏。
1.3 告警疲劳让优先级彻底倒挂
被动告警模式的另一个隐性成本是告警量本身。规则多了、覆盖场景广了,不可避免会产生大量低置信度告警。分析师每天打开队列,看到的全是“用户访问了疑似风险域名”“某终端出现罕见命令行”这类泛化提示,每一单都要花时间核实,但绝大多数最后都是误报。
我后来统计过团队的时间分配,一个最熟练的分析师每天真正能用于排查高危告警的专注时间不足两个小时,其余时间全耗在琐碎的低级告警上。这带来的直接后果是:真正的高危事件和普通误报长得差不多,堆在同一个队列里,等分析师处理到它时,攻击者早已完成了后续动作。
告警疲劳的本质是优先级倒挂——我们把注意力平均分配给了所有“可能有问题”的事件,而把“一定有问题”的行为淹没在了噪声里。这也是我后来坚定转向主动狩猎的原因:与其被告警牵着走,不如反过来掌握主动权,自己去定义什么值得查。
2. 从IOC到IOA:换一套思考坐标来狩猎
2.1 IOC是事后指纹,IOA才是现场行为
被动告警依赖的IOC(失陷指标)有个天然局限:它描述的是“攻击者留下过的东西”,而不是“攻击者正在做的事”。哈希、IP、域名这些指标只有在一个攻击样本被分析完、情报被提取之后才会存在。也就是说,IOC永远是滞后的,它只能发现曾经发生过、已被人类认识的攻击。
主动狩猎的核心转换,是把关注点从IOC挪到IOA(攻击行为指标)上。IOA不看你是谁、不看文件哈希,看的是行为模式本身:一个系统进程为什么去加载PowerShell?一个普通员工账号为什么在凌晨三点访问域控?一台从不外联的设备为什么突然向云端发起加密连接?
这种思路的本质区别是:IOC回答“这是不是已知恶意物”,IOA回答“这个行为是否偏离了它本来的角色”。狩猎者真正要找的,不是异常文件,而是异常关系。
2.2 用ATT&CK建立攻击假设,而不是漫无目的翻日志
主动狩猎最怕的就是“打开日志随便看”。没有假设的狩猎,本质上是高级版的告警疲劳。我们的做法是反向思考:先站在攻击者角度问自己,如果我要拿下这个环境,我会走哪条路?
以ATT&CK框架为思维底图,把攻击路径拆成侦察、初始访问、执行、持久化、提权、横向移动、数据渗出这几个阶段,然后针对每个阶段问:在这个网络里,这一步最可能长成什么样?比如要做到横向移动,攻击者多半会通过RDP或SMB连接其他主机;要做到持久化,多半会注册计划任务或者服务;要做到凭据窃取,多半会盯上LSASS进程的内存。
有了这些假设,再去检索日志就有明确的方向了。我们执行狩猎任务时,第一步永远是写一页纸的狩猎计划:目标是什么、假设什么场景、对应哪些数据源、用什么查询去验证。没有这个步骤,后面所有工具和查询都是散弹打鸟。
2.3 异常基线:不知道“正常”长什么样,就谈不上“异常”
IOA狩猎有一个绕不开的前提:你得知道这个环境的正常基线是什么。一个客户环境的“正常”和另一个完全不同。在A公司,研发部门凌晨跑批任务是常态;在B公司的财务部门,凌晨还有主机外连就非常可疑。
建立基线不能靠拍脑袋,要基于数据。我们把关键维度的历史行为拉出来做统计:某类资产的活跃时间段、各主机外联目标国的分布、计划任务的新增频率、进程父子的常见搭配。基线不是死数据,周期性地滚动更新,同时叠加人工判断。
什么样的偏差值得深挖?我的经验是:单个指标脱离包络线要看,但更值得注意的是多个“轻微异常”在同一时间轴上叠加。单看某个进程多了一条命令行参数可能无所谓,但如果这台设备同时出现了新增计划任务和凌晨时段的异常外联,那就是一条完整的攻击链条了。
3. 检测数据源的纵深拆解:每一层能看见什么
3.1 终端侧:进程创建、命令行和脚本是狩猎的主战场
终端是攻击行为发生的第一现场,也是主动狩猎最具价值的数据源。Windows平台上的关键事件大致分几类:
第一是进程创建事件,重点关注父子进程关系。正常环境下,一个文本编辑器进程去启动PowerShell是极少见的;而攻击者常用的手法恰恰是让Office进程、HTML帮助程序甚至打印服务去拉起PowerShell,然后执行内联脚本。第二是PowerShell脚本块日志,它能记录到脚本内容本身,很多混淆手法在原始的脚本块日志里会露出马脚。第三是文件创建和注册表变更,配合Sysmon之类的采集器能看到恶意文件落地和持久化写入。
这里给一个进程祖先链检测的伪规则思路,形式上类似Sigma规则:
detection: selection: EventID: 1 ParentImage|endswith: - mshta.exe - wscript.exe - cscript.exe - regsvr32.exe Image|endswith: - powershell.exe - cmd.exe condition: selection这条规则抓的是“脚本宿主拉起命令行”的典型组合。实际落地时要注意,规则命中不等于攻击成立,很多合法的安装包升级脚本也会触发。它的价值在于把海量进程事件里最值得人肉复核的一小撮挑出来,这本身就是主动狩猎的第一步。
3.2 身份认证日志:横向移动的探照灯
横向移动的核心动作,最终几乎都要落在认证上。登录成功、登录失败、特权账号使用这些认证事件,是狩猎者观察整个网络流动的关键窗口。
我们关注的点有几个:首先是同一账号在极短时间内出现在多台主机上的登录记录。一个正常的运维账号如果从管理跳板机登录服务器,路径是可解释的;但如果一个从不直接登录服务器的账号,忽然在一分钟内登录了五台不同的服务器,就要怀疑是凭据被滥用后的横向尝试。
其次是登录来源与登录目标的不匹配。比如某服务账号历史上只从应用服务器登录数据库服务器,某天却从一台员工工作站发起登录,这种“来源身份错位”远比单纯看登录失败次数更有价值。再者是特权会话的可疑时段,域管账号在午夜的交互式登录,如果没有变更窗口支持,就是一条值得立即跟进的线索。
认证日志的缺点也很明显——它只告诉你“谁访问了谁”,不告诉你“访问之后做了什么”。所以认证侧和进程侧必须联动分析,先通过认证异常锁定一台主机,再下沉到那台主机的进程创建链,就能把横向移动从头串到尾。
3.3 网络侧:流量元数据比全流量解密更实用
很多团队一上来就想上全流量解密,这个思路在真实网络里不太现实,成本高、合规风险大,而且攻击者改用加密通道后照样抓瞎。我们在实践里发现,流量元数据才是性价比最高的网络侧数据源。
所谓元数据,不关心包内容,只关心连接本身:源IP、目标IP、端口、协议、连接时长、流量大小、TLS证书的SNI字段。通过这些字段能识别相当多的高危行为。比如某台内网服务器突然向一个从未见过SNI的域名发起长时间加密连接,流量特征呈周期性小包,很像数据渗出前的C2心跳;再比如内网两台毫无业务关系的服务器之间突然出现大量东西向流量,可能是横向移动后的批量数据搬运。
网络元数据的关键价值在于它不依赖终端的配合。终端上的审计可能被关闭、进程可能被清理,但只要流量经过了交换机,连接记录就会被镜像出来。我们在狩猎时,经常用它去验证终端侧发现的真实性——如果一台疑似失陷主机确实存在异常外联,终端行为和网络行为就能互相印证,整个结论的可信度立刻提上一个台阶。
3.4 内存与文件层:无文件攻击和供应链投毒的缓冲带
还有一层容易被忽略的数据源是内存和文件系统。无文件攻击、进程注入、内存马这类手法,在终端进程事件里往往只表现为一个正常进程的“隐形动作”,静态扫描和签名根本看不到。对这一层,我们主要关注进程的内存访问行为,尤其是对LSASS进程的异常句柄访问,以及PowerShell进程是否存在典型的内存注入特征。
文件层侧重点则不在查杀病毒,而在供应链投毒和异常文件演变。比如一个被广泛使用的内部脚本突然被修改,新增了下载执行逻辑;一个正常软件目录里多出一个与原有文件同名的可疑可执行文件。这些变化单看哈希匹配发现不了,需要靠文件完整性监控和文件出现频率统计来兜底。
内存和文件层的检测能力通常不是独立存在的,而是集成在终端检测和响应工具里。我们理解它的用途,不是去替代杀毒软件查毒,而是在攻击链的中后段,当攻击者已经开始隐蔽执行时,还能抓住他的尾巴。
4. 高级对抗实践:攻击者的绕过思路与我们的反制手段
4.1 日志清理:先弄瞎你的眼睛,再从容行动
攻击者进到主机之后,首先要处理的往往不是搞破坏,而是清理自己留下的脚印。删除事件日志、关闭审计策略、修改WMI事件订阅的持久化记录,这些都是失陷主机上真实发生过的操作。很多安全团队直到数周后被外部情报告知“你们被攻了”,回头一看,日志已经被人为截断,整条攻击链断在最初的一跳。
对付日志清理,思路很明确:不能让终端的日志成为唯一副本。所有关键安全日志必须实时转发到独立的日志服务器,最好写入一次写多次读的存储介质,让攻击者即使拿到系统权限也无法回头篡改历史。更重要的是,要把“日志被删除”本身设定为一个高优先级告警事件。正常运维中,极少有合法理由需要有人批量清理安全事件日志;一旦出现这个动作,基本可以认定主机已经被控制。
我们有一次实战排查,就是从4592和1102这类日志被清空的事件发现的突破口。攻击者以为清理了日志就万事大吉,但“清理动作”本身反而暴露了他。后来我们把“日志完整性异常”和“审计策略变更”纳入所有终端的必检清单,效果比多写十条特征规则都明显。
4.2 白名单工具滥用:离地攻击为什么难拦
现代攻击者特别喜欢用LOLBin手法,也就是利用系统自带的合法工具完成攻击动作。certutil下载文件、bitsadmin传输数据、mshta执行脚本、wmic创建进程、regsvr32加载DLL——这些操作全部来自受信任的系统二进制,终端防护默认放行。
靠简单的进程黑名单是堵不住这类手法的——你不能因为攻击者会用bitsadmin就不让所有业务用bitsadmin。真正的反制思路,是给合法工具画“行为禁区”。比如certutil,正常用途是做证书管理;如果一个交互式运行的cmd进程调用了certutil,并带上了URL下载参数,随后又在临时目录生成了可执行文件,这条行为链就明显越界了。
规则没法穷尽所有恶意参数,但可以盯住“工具角色突变”。一个平时从不调用wmic的财务部门主机,突然出现wmic创建远程进程的命令行,不需要知道它是不是恶意,先标记出来人工复核——这就是主动狩猎和签名查杀最大的区别:我们关心的不是“它是什么”,而是“它为什么在这里出现”。
4.3 混淆、内存驻留与云侧凭据窃取
再往后走,攻击者会加大隐蔽性。PowerShell脚本普遍做混淆,字符串拆成一段段的拼接、命令和参数编码进Base64、用无意义的变量名代替函数名。静态规则看到的是永远看不完的变体。我们应对混淆的思路是不解混淆,而是侧写“执行环境”和“执行结果”:谁在什么条件下触发了PowerShell?PowerShell进程之后有没有紧跟着网络连接?内存中的脚本块是不是有高熵特征?攻击者可以混淆每一步,但很难同时伪装整个行为链的逻辑走向。
内存驻留是另一类麻烦。攻击者不落地文件,直接把shellcode注入到合法进程内存里,用计划任务或WMI事件做持久化。这类手法的检测得依赖终端层的行为采集能力,特别是对敏感进程的访问监控。比如,一个普通业务进程打开LSASS进程并尝试读取内存,无论有没有写成文件,都值得立即深挖——正常业务极少会碰LSASS。
云侧的凭据窃取则是所有现代环境的必修课。攻击者拿到一台云主机后,会尝试访问云平台提供的元数据服务来换取临时凭据,再通过这些凭据横向影响整个云账号。检测这类攻击靠两个点:一是监控对元数据服务地址的访问,谁能访问、什么进程访问、频率如何;二是检测云账号的异常行为,比如突然出现来自新地域的API调用,或某实例被赋予了从未有过的过高权限。云给了攻击者一条全新的横向通道,狩猎的视野必须跟着扩出去。
4.4 检测对抗的螺旋上升:攻击者也在研究你的规则
高级攻击者不只是被动躲检测,他们会主动研究防御方的规则。规则重放测试、模拟普通流量、把恶意流量混在正常业务后面、定期更换基础设施——这些都是真实对抗中的常规操作。所以我们的检测规则也不能一成不变,必须定期审视、交叉验证。
几个实际做法:同一类攻击场景,用至少两条不同维度的检测逻辑去覆盖,避免单一规则被打掉后失控;规则的触发条件和辅助上下文定期做小范围改动,让攻击者无法稳定绕过;设计一些“蜜标”类诱饵,比如在域内伪造几个高权限但无人使用的账号,一旦有人尝试使用,这本身就是高置信度的攻击信号。主动狩猎不是一次性的解题,而是和对手持续博弈的过程,规则也要跟着对手的节奏保持进化。
5. 找到问题之后:狩猎结果如何快速转成分诊与处置
5.1 分诊框架:从“可疑”到“确认”的取舍路径
狩猎规则和查询天然会产生误报,所以每一批狩猎结果都要走分诊流程,不能直接当成事件处置。我们的分诊框架把结果分为三档:
第一档是低置信度偏离,比如单次命令行罕见、连接了一个未被分类的域名。这类先以观察为主,不展开人力,自动打标签累积,等待其他信号关联。第二档是行为链可疑,两到三个异常行为在时间上叠加,比如异常父进程拉起PowerShell后随即产生外联。这类需要分析师介入,做目标主机和账号的上下文调查。第三档是高置信度攻击特征,比如LSASS内存访问加凭据导出工具痕迹,或日志清理动作本身。这类直接升级为安全事件,启动完整的应急响应流程。
判断一个线索要不要深入,核心问题是:如果这条线索是真的,攻击者下一步最可能做什么?如果他现在就要做的那件事会给网络带来不可逆影响,那就没有“再看看”的余地,马上处置。
5.2 时间线重构:把碎片拼成完整的攻击故事
单条告警只是攻击链条上的一个点,主动狩猎的真正产出是对整条攻击链的理解。我们需要回答三个问题:最初的立足点是什么?持久化藏在哪?影响范围有多大?
时间线重构的具体做法,是把终端进程事件、认证日志、网络连接记录和文件变更记录全部拉到同一时间轴上。从第一个可疑行为开始,向前找——最初的命令从哪来,是钓鱼附件还是漏洞利用;向后追——这次执行之后,又连了哪台机器,写了哪些文件,改了哪些注册表。很多时候,最终确认攻击的核心证据,不是在初始告警里,而是在时间线展开后才发现的后段动作。
时间线重构也是验证狩猎假设的试金石。如果分析师的假设和观察到的时间线对不上,我们不硬凑,重新回来修正假设,这可能发现攻击者的真实路径比预想的更复杂。
5.3 狩猎产物的闭环:把每一次发现沉淀成新的检测能力
狩猎不能变成一次性的临时行动,每做完一轮,都要把发现回补到检测体系里。我习惯用一张简表记录每次狩猎的沉淀:
| 狩猎发现 | 对应的攻击阶段 | 沉淀出的检测能力 | 误报控制措施 |
|---|---|---|---|
| 财务主机深夜出现异常计划任务 | 持久化 | 新增计划任务与所属资产基线的偏离检测 | 绑定资产责任人,纳入变更窗口校验 |
| 服务账号从员工工作站发起登录 | 横向移动 | 异常登录来源与目标角色匹配规则 | 仅对特权账号生效,降低普通账号干扰 |
| 系统工具被用于下载执行 | 执行 | 合法工具行为越界检测 | 白名单方式排除已审批的软件分发路径 |
有了这张表,团队每次狩猎都在积累资产。三个月后再回头看,新沉淀的规则已经覆盖了之前一半以上的告警洞,而且这些规则全是基于自己环境里的真实行为反向推导出来的,远比凭经验写的通用规则贴合实际。
6. 团队与工程层面的落地经验:主动狩猎不是买工具,是改变工作方式
6.1 数据接入是狩猎的命门:决定能查什么、能查多深
没有完整的数据,狩猎就是无米之炊。我们做检测体系改造时,优先保证的数据源清单很明确:终端进程创建和命令行、身份认证事件、网络连接日志、DNS日志、文件完整性和计划任务变更。这五类数据覆盖了从执行、持久化到横向移动的大部分攻击路径,也是后续所有狩猎查询的基础。
数据接入的工程细节同样重要。日志采集要统一时间同步,否则时间线重构会错位;关键日志要冗余采集,避免单点失效;数据保留周期至少要覆盖一个完整的攻击驻留周期,我们实测中不少攻击驻留时间超过三个月,只保留一个月的日志在排查时会非常被动。索引设计上,按时间分区并按关键字段预聚合,可以显著提升狩猎查询的响应速度——分析师愿意多试几个查询,很大程度上取决于一次查询跑多久。
6.2 狩猎节奏设计:把狩猎变成常规任务而非救火队
主动狩猎最大的敌人不是攻击者,而是日常运营的吞噬。指派的分析师一不小心就被告警队列和误报处理填满,狩猎计划慢慢不了了之。我们后来把狩猎调度明确写进排班,每个周期框定一个专项主题,比如本轮聚焦“针对财务系统的凭据窃取”,下轮聚焦“办公终端的数据渗出行为”。主题之下再拆成三个子假设,每个子假设对应一组查询和数据源。
固定的节奏带来的好处是,团队形成了一种稳定的探索习惯:先写计划,再跑查询,再人工研判,再沉淀规则。这个过程本身就降低了个人能力依赖——哪怕新人来接手,照着一整套狩猎流程操作,也能产出可以复用的结果。
6.3 度量指标:别用告警数量假装成功
衡量主动狩猎的效果,不能只看“发现了几起真实事件”——很多环境里真实事件可能半年才一起。更值得关注的是度量维度,例如检测覆盖率,关键攻击路径是否都有对应的检测逻辑;再如从攻击发生到发现耗时,狩猎的核心目标是压缩攻击者的驻留时间;还要看误报闭环能力,新增规则后误报有没有被有效收敛、有没有定期复盘降噪。
我们内部会周期做一次告警质量抽样,随机抽一部分历史告警,标注“真实事件、误报、低价值不确定”三类,算出真正的有效告警占比。这个指标能真实反映检测体系的质量。与其大谈“每日处理多少条告警”,不如追踪“每条有效告警背后的人工成本”。检出的价值不在于数量,而在于是否在攻击造成实质伤害前抓住它。
6.4 人的因素:分析师判断力才是狩猎的天花板
工具和规则可以解决70%的问题,剩下的30%靠人的判断力。主动狩猎本质上是一项半开放式的探索工作,分析师面对的是不完整、充满噪声的数据,需要在有限信息里做出高置信度的结论。这种能力培养没有捷径,只能靠重复的实战复盘和共同狩猎来累积。
我在团队里推行的一个做法是“攻防互鉴”:让写检测规则的人定期扮演攻击者,自己尝试绕过自己的规则。轮换几次之后,大家对自己规则的弱点认识会非常深刻,下一次再设计检测点时,思维就会自然地从“我要检测这个”变成“如果我是攻击者我会怎么绕开这个”。这一层换位思考带来的提升,远比多买几套工具明显。
最后说一点个人体会。主动狩猎这套体系,我们落地了大概半年之后,整个团队的从心态到方法论都发生了变化:不再坐在队列前面等着告警来敲门,而是每天带着“攻击者已经在这里了”的假设去翻数据、验假设、画时间线。这种心态转变比任何工具都重要,因为它决定了团队是把安全运营当成被动受理,还是当成一场主动对抗。猎手和猎物的区别,往往就在于你有没有意识到自己正在被追踪。