0x00 前言
之前写过《红队视角下的Windows RPC》,本文来聊聊ScheduleTask(计划任务),在红队视角里的一些利用,本文并不是像之前的文章十分正式,以看懂为准,所以大量使用GPT-4来帮助编写(节省时间)。
0x01 Windows ScheduleTask 介绍
Windows 计划任务(Task Scheduler)是 Microsoft Windows 系统内置的一种服务,用于在预定时间或在特定事件发生时自动执行程序或脚本。这是一种基础的自动化工具,可以用来执行各种系统和非系统任务,例如创建备份、运行系统维护任务、启动第三方应用程序等。
1.1 主要功能
- 定时执行任务:你可以设置任务在特定时间执行,例如每天的特定时间、每周的特定日期、或每月的特定日期。你甚至可以设置任务在系统启动或用户登录时执行。
- 事件驱动执行任务:计划任务也可以响应系统事件。例如,你可以设置任务在系统空闲时执行,或者在特定的系统事件(如日志条目创建)发生时执行。
- 执行各种类型的任务:计划任务可以执行各种类型的任务,包括启动应用程序、发送电子邮件、显示消息、执行命令行命令等。
1.2 如何使用
计划任务的用户界面可以通过控制面板或管理工具(如 taskschd.msc
)访问。这个界面提供了创建和管理任务的各种功能,包括启动和停止任务、查看任务的运行历史、配置任务的属性等。
在计划任务中创建新任务时,你需要配置以下信息:
- 触发器:定义了何时执行任务。可能是一次性的、按日程的、或者是响应特定事件的。
- 操作:定义了任务执行的具体操作。可能是启动应用程序、发送电子邮件、显示消息等。
- 条件:定义了任务执行的条件。例如,你可以配置任务仅在计算机空闲或只在特定的电源情况下执行。
- 设置:定义了任务的其他设置,例如任务失败时重试的次数,任务运行的最长时间等。
此外,计划任务还提供了一个命令行工具 schtasks.exe
,你可以使用这个工具在命令行界面或脚本中创建和管理任务。
1.3 注意事项
使用计划任务时,你需要注意以下几点:
- 权限:计划任务需要足够的权限才能执行某些任务。例如,执行需要管理员权限的程序,或访问网络资源等。
- 安全性:虽然计划任务可以执行各种任务,但你应该避免使用它执行可能危害系统安全的操作。例如,你不应该使用计划任务来安装未经验证的软件,或打开可能包含恶意内容的网络连接。
- 错误处理:任务可能由于各种原因执行失败,你应该配置适当的错误处理机制,例如重试任务、记录错误信息等。
0x02 添加计划任务的方法
在 Windows 系统中,有多种方法可以用来添加计划任务:
2.1 使用图形用户界面
你可以使用 Windows 的 "任务计划程序" 工具来创建计划任务。这是一个图形用户界面工具,你可以通过以下步骤来使用它:
- 打开 "任务计划程序"。你可以在开始菜单中搜索 "任务计划程序",或者在运行对话框(Win + R)中输入
taskschd.msc
并按回车。 - 在右侧的操作栏中,点击 "创建基本任务" 或 "创建任务"。
- 按照向导的提示设置任务的名称、触发器、操作等信息。
- 在最后一步,检查你的设置,然后点击 "完成" 来创建任务。
2.2 使用命令行工具
Windows 也提供了一个命令行工具 schtasks
,你可以使用这个工具来创建计划任务。例如,以下命令会创建一个每天早上 9 点运行 Notepad 的任务:
schtasks /create /tn "MyTask" /tr "notepad.exe" /sc daily /st 09:00
在这个命令中,/tn
参数是任务的名称,/tr
参数是任务要执行的操作,/sc
参数是任务的调度(如每日、每周等),/st
参数是任务的开始时间。
2.3 使用 PowerShell 脚本
你也可以使用 PowerShell 来创建计划任务。以下是一个创建计划任务的 PowerShell 脚本示例:
$Action = New-ScheduledTaskAction -Execute "notepad.exe" $Trigger = New-ScheduledTaskTrigger -At 9am -Daily Register-ScheduledTask -Action $Action -Trigger $Trigger -TaskName "MyTask" -Description "Run Notepad every day at 9am"
在这个脚本中,New-ScheduledTaskAction
创建了一个新的任务操作,New-ScheduledTaskTrigger
创建了一个新的任务触发器,Register-ScheduledTask
注册了新的计划任务。
以上就是在 Windows 中添加计划任务的一些常见方法。需要注意的是,创建计划任务通常需要管理员权限。如果你在创建计划任务时遇到问题,你应该检查你是否有足够的权限。
0x03 使用计划任务进行权限维持
上面都是正常人添加计划任务的一些方法,但是红队中,一般不是正常人,需要用到一些脱裤子放屁的方法来绕过一些规则或是杀软的监控。
一般大家添加计划任务大都为了权限维持,是我们的程序在目标主机常驻,下面列举一些公开的添加计划任务的方法。
3.1 使用COM接口添加计划任务
上面GPT-4帮我们说了,有定时执行任务还有事件驱动执行任务,使用COM接口ITaskService
,可以编写程序添加一个计划任务。
时间触发器的例子:
登录触发器的例子:
实现原理
程序功能分为三部分,首先是初始化,其次是添加计划任务,最后添加了删除计划任务功能。
1.Initialization
为了获取到获取 ITaskService 对象以及 ITaskFolder 对象
首先初始化COM接口
// 初始化 COM hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); // 设置 COM security levels. hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL); // 创建Task Service对象 hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService); // 连接到Task Service hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);
2.CreateTask
首先创建任务定义对象,进行任务创建操作
hr = pService->NewTask(0, &pTask);
接着设置注册信息
hr = pTask->get_RegistrationInfo(&pRegInfo); //作者 hr = pRegInfo->put_Author(_bstr_t(wszAuthor)); //描述 hr = pRegInfo->put_Description(_bstr_t(wszDescription));
设置主体信息
hr = pTask->get_Principal(&pPrincipal); // 设置登陆类型 hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN); // 设置运行权限 hr = pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST);
设置任务相关信息
hr = pTask->get_Settings(&pSettings); hr = pSettings->put_StartWhenAvailable(VARIANT_TRUE); hr = pSettings->get_IdleSettings(&pIdleSettings);
创建触发器
hr = pTask->get_Triggers(&pTriggerCollection); hr = pTriggerCollection->Create(TASK_TRIGGER_LOGON, &pTrigger);
设置执行操作
hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction); hr = pAction->QueryInterface(IID_IExecAction, (void**)&pExecAction); //设置程序路径等信息 hr = pExecAction->put_Path(_bstr_t(wszProgramPath)); ......
在ITaskFolder对象注册
hr = pRootFolder->RegisterTaskDefinition(_bstr_t(wszTaskName), pTask, TASK_CREATE_OR_UPDATE, _variant_t(), _variant_t(), TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(L""), &pRegisteredTask);
3.DeleteTask
直接根据事先写好的名字删除即可
hr = pRootFolder->DeleteTask(_bstr_t(TaskName), 0);
3.2 使用RPC接口添加计划任务
实际上COM添加计划任务最终是由RPC接口ITaskSchedulerService
来实现的,以前写过:《Windows RPC之MS-TSCH添加计划任务》
需要UAC后进行调用。
3.3 ZcgonvhScheduleTask
头像哥的这个非常之牛逼,参考文章:https://www.zcgonvh.com/post/Advanced_Windows_Task_Scheduler_Playbook-Part.2_from_COM_to_UAC_bypass_and_get_SYSTEM_dirtectly.html
利用一个IElevatedFactoryServer
COM接口达到使用计划任务Bypass UAC的效果,同时因为进程外COM的缘故,天然也是一个断链技术。
在实战中使用也是非常好用:
以上一些方法我已经上传到GitHub,欢迎RP别的方法。
https://github.com/evilashz/PigScheduleTask
3.4 使用白文件添加计划任务
可以挖掘一些白文件是否存在此类问题。
0x04 使用计划任务进行横向移动
通过RPC接口ITaskSchedulerService
同样RPC bind到远程主机就可以实现横向移动,有不错的免杀性。
0x05 总结
本文只是介绍下目前公开的一些计划任务在红队中的利用,很多人可能会说其中的很多方法可能过不了某些杀软之类的,其中提到的方法均有对抗杀软的办法比如360核晶,权限维持的很多方法(不局限于计划任务)绕过什么核晶对很多兄弟是很简单的事情,所以本文并不关注这些技术的杀软绕过方法。