Skip to content

Go 主机安全面试:Windows 计划任务与 WMI 持久化检测

Windows 终端上的持久化不只有服务自启动。攻击者常用计划任务、WMI 事件订阅、启动目录、注册表 Run Key 等方式让恶意程序反复执行。面试官会关注:Go Agent 怎么采集这些变化?怎么区分正常运维和攻击持久化?告警要给出哪些证据?

岗位场景

text
Windows 主机
  -> 采集任务计划程序、WMI 事件订阅、进程和文件事件
  -> 标准化触发器、执行命令、创建者、父进程、落地文件
  -> 关联异常命令、敏感路径、提权上下文和网络行为
  -> 判断持久化风险
  -> 输出可复盘的告警证据

这类题考的不是“记住几个自启动位置”,而是能把 Windows 系统机制、事件采集、规则设计、降噪和 Go 工程实现串起来。

高频面试题

1. 为什么计划任务是常见持久化入口?

简洁答案:计划任务能按时间、登录、启动或事件触发程序执行,权限可高可低,管理工具和恶意程序都常用,所以既隐蔽又容易误报。

关键知识点:

  • 计划任务可触发 powershell.execmd.exe、脚本、二进制文件或 LOLBin。
  • 攻击者常用隐藏任务、异常任务名、临时目录载荷、Base64 PowerShell 参数。
  • 合法软件更新、备份、监控也会创建大量计划任务。

Go 落地思路:

  • 标准化字段:task.nametask.triggertask.actiontask.authorprocess.cmdline
  • 规则不要只看“新建计划任务”,要结合执行命令、路径、创建进程和账号。
  • 对系统目录、厂商签名、历史基线做降噪,但保留新增任务审计记录。

2. Go Agent 如何采集 Windows 计划任务变化?

简洁答案:优先采集 Windows 事件日志和任务 XML 快照,必要时周期性扫描任务目录做兜底。

关键知识点:

  • 任务计划程序会产生创建、更新、删除、执行等事件。
  • 任务定义最终是 XML,能看到触发器、动作、作者、运行账号等字段。
  • 单靠轮询会漏掉短生命周期任务,单靠事件也要考虑日志关闭或丢失。

Go 落地思路:

  • 用事件日志作为主链路,定时快照作为一致性校验。
  • 解析 XML 时只抽取检测需要的字段,不把完整 XML 透传到规则层。
  • 快照结果做 hash,比对新增、修改、删除,避免每次扫描都生成重复告警。
go
func suspiciousTaskAction(action string) bool {
	action = strings.ToLower(action)
	return strings.Contains(action, "powershell") ||
		strings.Contains(action, "wscript") ||
		strings.Contains(action, "mshta")
}

3. WMI 事件订阅为什么适合做隐蔽持久化?

简洁答案:WMI 可以注册“事件过滤器 + 消费者 + 绑定”,在系统事件发生时自动执行命令,入口不如服务和任务直观。

关键知识点:

  • 常见三元组是 __EventFilterCommandLineEventConsumer__FilterToConsumerBinding
  • 触发条件可以是用户登录、进程启动、时间间隔、系统状态变化。
  • WMI 持久化常见执行体仍是 PowerShell、cmd、脚本解释器或异常路径程序。

Go 落地思路:

  • 采集 WMI 永久事件订阅列表,拆成 filter、consumer、binding 三类实体。
  • 规则重点看 consumer 命令、触发条件、创建时间、创建账号和落地文件。
  • 告警中展示三元组关系,否则客户很难复盘为什么 WMI 可疑。

4. 如何区分正常计划任务和恶意持久化任务?

简洁答案:用“任务来源 + 执行动作 + 文件位置 + 权限上下文 + 后续行为”组合判断,单字段判断容易误报。

关键知识点:

  • 正常任务通常有稳定厂商、签名、固定路径和历史基线。
  • 高风险信号包括用户临时目录、可写目录、混淆命令、下载执行、隐藏窗口。
  • 创建任务后如果紧接着外联、提权或访问敏感文件,风险更高。

Go 落地思路:

  • 对任务创建事件关联前后 5 到 10 分钟的进程、文件、网络事件。
  • 规则输出风险分数和命中原因,不只输出布尔结果。
  • 客户白名单要绑定任务名、路径、签名和账号,避免按单个任务名粗放放行。

5. 检测 WMI 持久化时要避免哪些误报?

简洁答案:不要把所有 WMI 查询都当持久化,重点检测永久事件订阅和可执行 consumer。

关键知识点:

  • 运维脚本和管理软件频繁使用 WMI 查询,这是正常现象。
  • 临时查询和永久订阅风险不同,不能混在一条规则里。
  • 某些安全软件、资产管理软件会注册合法 WMI consumer。

Go 落地思路:

  • 事件模型中区分 wmi.querywmi.subscriptionwmi.consumer
  • 只对可执行 consumer 或异常绑定提升告警等级。
  • 建立厂商基线和客户基线,白名单仍要记录规则版本与过期时间。

6. 计划任务和 WMI 告警需要哪些证据字段?

简洁答案:至少要有持久化对象、执行命令、触发条件、创建者、创建进程、文件路径、签名信息和关联行为。

关键知识点:

  • 没有触发条件,客户无法判断任务何时执行。
  • 没有创建进程和账号,很难区分软件安装、管理员操作和攻击落点。
  • 没有关联行为,告警只能说明“可疑”,不能还原攻击链。

Go 落地思路:

  • 统一输出 persistence.type,例如 scheduled_taskwmi_subscription
  • 保留 evidence 数组,逐条说明命中的字段和规则条件。
  • 原始事件 ID、规则版本、Agent 版本要进入告警,便于线上问题定位。

7. 线上客户反馈计划任务告警误报,你怎么排查?

简洁答案:先还原任务定义和创建链路,再检查规则条件、基线、签名、账号、路径和关联窗口是否过宽。

关键知识点:

  • 误报可能来自软件升级、域策略、运维平台、备份任务或安全产品。
  • 规则命中字段要能回放,不能只保存最终告警文案。
  • 修复误报时要防止把真实攻击一起压掉。

Go 落地思路:

  • 导出脱敏事件样本,用同一规则版本做离线 replay。
  • 对比降噪前后的命中数量、被压制样本和仍告警样本。
  • 优先修正共享解析、字段归一化或规则阈值,不给单个客户写硬编码分支。

学习要点

模块需要掌握的点
Windows 基础计划任务、WMI 永久事件订阅、事件日志、运行账号
持久化检测触发器、执行动作、异常路径、脚本解释器、LOLBin
攻击链关联创建进程、落地文件、外联、提权、后续执行
Go 工程事件标准化、XML 解析、快照 hash、离线 replay、规则版本
误报治理基线、签名、白名单作用域、过期时间、客户现场复盘

小练习

  1. 设计一个 ScheduledTaskEvent 结构体,字段要能支撑任务创建、更新和删除检测。
  2. 写一条规则:新计划任务执行 powershell -EncodedCommand 且载荷位于用户临时目录,列出需要的证据字段。
  3. 复盘一个误报场景:企业补丁系统批量创建计划任务时,如何降噪但保留审计能力?
最近更新