计划任务创建事件(4698)
Windows 的计划任务创建会写安全日志 4698,事件里包含任务名称、创建者与任务内容(XML 形式的动作、触发器与运行身份)。攻击者用计划任务做持久化很常见:动作指向用户目录或临时目录、触发器设置为登录时或每隔几分钟执行、运行身份为 SYSTEM。判读时把 4698 与任务生命周期的其他事件一起看:4699 删除、4700 启用、4701 禁用、4702 更新;再用 schtasks 查询当前实际状态,判断任务是否仍在生效。
基本信息
| 适用平台 | Windows 7/10/11 与 Windows Server 2008 R2 及以上 |
|---|---|
| 日志位置 | 安全日志中的 4698/4699/4700/4701/4702;另可在任务计划程序操作日志(Microsoft-Windows-TaskScheduler/Operational)中交叉验证 |
| 审核前提 | 需启用相应审核策略,具体要求随系统版本不同,实施前先在实际环境确认能否产生事件 |
| 关键内容 | 任务名、创建者、动作的 Command 与 Arguments、触发器、运行身份 |
| 当前状态核验 | schtasks /query /fo LIST /v 或任务计划程序界面 |
典型使用场景
- 排查持久化:发现事件窗口内新建的非计划内任务
- 还原攻击链:任务动作中的命令行往往直接暴露载荷路径与参数
- 区分系统自带任务与人为创建:按创建者与动作路径过滤可快速降噪
- 确认任务是否仍在生效,决定处置顺序(先禁用再取证)
- 核对运维自动化任务与变更单,避免把正常脚本当成恶意行为
筛查思路
筛查思路
# 1) 拉出任务创建事件,看任务名与创建者
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4698} -MaxEvents 40 |
Select-Object TimeCreated, Message | Format-List
# 2) 只看任务内容里的命令与参数(事件 XML 中的 Command/Arguments)
(Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4698} -MaxEvents 5)[0].ToXml()
# 3) 对照当前实际状态,确认任务是否仍在生效
schtasks /query /fo LIST /v | Select-String -Pattern 'TaskName|Task To Run|Run As User|Schedule Type' -Context 1
# 4) 任务动作指向临时目录或编码命令时优先深挖事件对照
| 事件 ID | 含义 | 判读要点 |
|---|---|---|
| 4698 | 创建计划任务 | 含任务内容 XML,是持久化排查的重点 |
| 4702 | 更新计划任务 | 已有任务被改写,同样值得关注 |
| 4700 / 4701 | 启用 / 禁用任务 | 启用在事件窗口内出现时需核实 |
| 4699 | 删除计划任务 | 处置期清理属正常,其他时段删除要核对授权 |
| 106(任务计划操作日志) | 任务注册成功 | 与 4698 交叉验证任务是否真正落地 |
任务内容在事件的 XML 里,默认的文本视图可能只显示摘要;分析时要用 ToXml() 或事件查看器的 XML 视图才能看到完整的 Command 与 Arguments。
计划任务可由文件系统直接写入与修改,某些方式不会产生 4698 事件;事件中查不到不等于没有任务,必须结合 %SystemRoot%\System32\Tasks 目录与注册表核对。