STATEMENT
声明
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。
雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
NO.1 前言
计划任务作为持久化的机制之一,也被用在红队行动中。但常见的利用方法在被安全软件阻断的同时,也没有达到隐藏效果,并提高了被发现的风险。所以,需要深入理解利用计划任务,规避风险,达到持久控制。
本文阐述Windows计划任务在系统中的隐藏方式及工具化的转换。
NO.2 创建计划任务
at.exe 在 windows8 开始就弃用了,之后的系统都是使用 schtasks.exe 创建计划任务。schtasks 比 at 更加强大, 使管理员能够在本地或远程计算机上创建、删除、查询、更改、运行和结束计划任务。运行不带参数的 schtasks.exe 将显示每个已注册任务的状态和下次运行时间。
更多查看 Microsoft 文档:
https://docs.microsoft.com/zh-cn/windows/win32/taskschd/schtasks
schtasks /Create
[/S system [/U username [/P ]]]
[/RU username [/RP ] /SC schedule [/MO modifier] [/D day]
[/M months] [/I idletime] /TN taskname /TR taskrun [/ST starttime]
[/RI interval] [ {/ET endtime | /DU duration} [/K]
[/XML xmlfile] [/V1]] [/SD startdate] [/ED enddate] [/IT] [/Z] [/F]
命令行
schtasks /create /tn TestSchtask /tr C:WindowsSystem32cmd.exe /sc DAILY /st 13:00:00
XML 文件
计划任务一旦创建成功,将会自动在 %SystemRoot%System32Tasks 目录生成一个关于该任务的描述性 XML 文件,包含了所有的任务信息。
运行 taskschd.msc ,同时可以在任务计划程序看到刚才所创建的任务,处在程序库的根目录下。
注册表
在 Windows XP 时,计划任务注册表路径为
计算机HKEY_LOCAL_MACHINESoftwareMicrosoftSchedulingAgent
Windows7 以后变成
计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionSchedule
以 Windows 10 为例,查看刚才所创建任务计划的键值,路径:计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionScheduleTaskCacheTreeTestTask
Id {GUID},任务对应的guid编号。
Index 一般任务值为3,其他值未知。
SD Security Descriptor 安全描述符,在Windows中,每一个安全对象实体都拥有一个安全描述符,安全描述符包含了被保护对象相关联的安全信息的数据结构,它的作用主要是为了给操作系统提供判断来访对象的权限。
【 经测试:Windows 7 、Windows Server 2008 无 SD 值、Windows 10 有 SD 值 】
安全软件阻止
如果主机存在安全软件,计划任务的创建会被阻止,命令行无法成功创建。
【可通过 计划任务API (https://docs.microsoft.com/zh-cn/windows/win32/taskschd/using-the-task-scheduler)绕过,工具化利用此点】
schtasks /create /tn "TestTask" /ru system /tr C:WindowsSystem32cmd.exe /sc weekly /d mon /st 01:00
NO.3 隐藏姿势
非完全隐藏
非完全隐藏一个计划任务,通过修改 ScheduleTaskCacheTree 下对应任务的 Index 值,一般情况下值为 3 。
Index 修改
修改 HKLMSOFTWAREMicrosoftWindows NTCurrentVersionScheduleTaskCacheTree{TaskName} 下对应任务的 Index 值为 0
以 Windows 10 为例,新建计划任务 cmd 的高级安全设置中所有者为 SYSTEM,默认无法更改注册表键值。
更改所有者为 Administrators,并赋予完全控制权限,才能修改注册表键值。
当 Index 修改为 0 后, 利用 taskschd.msc、schtasks.exe 、甚至系统API查询出的所有任务中,都查看不到所创建的任务。但如果知道该任务名称,可以通过 schtasks /query /tn {TaskName Path} 查到。
但在 Windows Server 2008 与 Windows 7 中,修改 Index 键值为 0 ,任务计划程序中仍存在该任务。原因未知
XML 文件删除
· 删除 %SystemRoot%System32Tasks 下任务对应的 XML 文件
1、在 Windows 10 中,删除 XML 文件,并不影响计划任务的运行,且在 taskschd.msc 任务计划程序中,依然存在对应任务;
2、在 Windows 7 与 Windows Server 2008 中,若删除 XML 文件,任务计划程序中的对应任务也会被删除,并且影响计划任务的运行,但注册表中项值依然存在。
完全隐藏
SD 删除
· 删除 HKLMSoftwareMicrosoftWindows NTCurrentVersionScheduleTaskCacheTree{TaskName}SD
· 删除 %SystemRoot%System32Tasks 下任务对应的 XML 文件
这样操作,无论何种方式 (排除注册表) 都查不到该任务,较为彻底。因为 SD 就是安全描述符,它的作用主要是为了给操作系统提供判断来访对象的权限,但被删除后,无法判断用户是否有权限查看该任务信息,导致系统直接判断无权限查看。因此在使用 schtasks /query /tn MicrosoftWindowsAppIDcmd 查询时,提示“错误: 系统找不到指定的文件”。
但经过测试,Windows 7 、Windows Server 2008 无 SD 值、Windows 10 有 SD 值。
NO.4 总结
Windows 计划任务的隐藏并未绝对,因操作系统存在差异,最终实现的效果也不同。但作为持久化的机制之一,需要深入理解利用。
RECRUITMENT
招聘启事
END
长按识别二维码关注我们
原文始发于微信公众号(白帽子):Windows计划任务的进阶——隐藏
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论