Windows计划任务在红蓝对抗中的高级隐藏与持久化技巧

7 人参与

说起在红蓝对抗里玩 Windows 计划任务,我的脑海里立刻浮现出去年一次实战演练的画面:当所有蓝队的监控仪表盘都在盯着常规的注册表持久化时,我的任务已经悄悄潜伏在系统的阴影里,连任务管理器都找不到它的踪迹。

隐藏任务的几招小技巧

我常用的第一招是把任务名塞进系统自带的路径里,比如 C:WindowsSystem32TasksmicrosoftWindowsUpdate{随机 GUID}。蓝队的 schtasks /query 输出里会把它当成系统更新任务,根本不怀疑。

第二招是利用 /RL HIGHEST/RU "SYSTEM",让任务在最高权限下运行,却不在 Task Scheduler Library 的 UI 界面里出现。配合 cmd /c start /b "" "%TEMP%payload.exe",再加上 PowerShell -WindowStyle Hidden,整个过程在任务视图里只留下一行「System」的痕迹。

还有一个鲜为人知的技巧是把任务写成 XML 再导入。先把真正的执行命令写进 <Actions>,再在 <RegistrationInfo> 里塞入一个看似合法的描述,比如「Windows Defender Scheduled Scan」。导入后,蓝队的 Get-ScheduledTask 只会返回描述信息,真正的 Action 被隐藏在 XML 结构里。

持久化的弹性设计

光有一次性任务根本不够,我会在任务的 Triggers 里加上「OnIdle」和「AtLogon」双重触发。这样即便蓝队手动删除了「OnLogon」触发,系统空闲时仍会自动重新启动。

为了防止任务被清理,我会让它自我复制:在 payload.exe 里写一段代码,定时检查自己的任务是否存在,不在就用 schtasks /create 再建一个。这样一旦蓝队用 schtasks /delete 把它砍掉,下一分钟它又会自己复活。

  • 利用系统路径伪装任务名
  • XML 导入隐藏真实 Action
  • 双触发(OnIdle + AtLogon)提升弹性
  • 自我检查脚本实现“任务自愈”

说到这里,我忍不住想起那次 CTF,蓝队用了好几分钟才发现「Update」文件夹里多了一个奇怪的 GUID,结果已经在后台跑了三轮持久化脚本。那一瞬间,我的心里只有一句:隐藏得好,蓝队永远在追光的尽头。

参与讨论

7 条评论
  • 幻星旅团

    这个GUID伪装方法挺实用的

    回复
  • 梁浩

    我之前在测试环境也试过类似的方法,确实能躲过常规检测

    回复
  • BunnyBunny

    为啥要用XML导入?直接创建不行吗

    回复
  • 凝香

    感觉自我检查脚本有点意思,不过会不会被AV检测到?

    回复
  • PeachyPeachy

    SYSTEM权限确实隐蔽,但权限太高容易被监控工具发现吧

    回复
  • 冰川巨兽

    这种隐藏技巧在实战中真的有效吗?有没有被发现的案例?

    回复
  • 撒哈拉

    OnIdle触发这个思路不错,比单纯靠登录触发稳定

    回复