红队视角下的Windows 计划任务
2023-11-8 21:26:44 Author: Z2O安全攻防(查看原文) 阅读量:51 收藏

0x00 前言

    之前写过《红队视角下的Windows RPC》,本文来聊聊ScheduleTask(计划任务),在红队视角里的一些利用,本文并不是像之前的文章十分正式,以看懂为准,所以大量使用GPT-4来帮助编写(节省时间)。

0x01 Windows ScheduleTask 介绍

    Windows 计划任务(Task Scheduler)是 Microsoft Windows 系统内置的一种服务,用于在预定时间或在特定事件发生时自动执行程序或脚本。这是一种基础的自动化工具,可以用来执行各种系统和非系统任务,例如创建备份、运行系统维护任务、启动第三方应用程序等。

1.1 主要功能

  1. 定时执行任务:你可以设置任务在特定时间执行,例如每天的特定时间、每周的特定日期、或每月的特定日期。你甚至可以设置任务在系统启动或用户登录时执行。
  2. 事件驱动执行任务:计划任务也可以响应系统事件。例如,你可以设置任务在系统空闲时执行,或者在特定的系统事件(如日志条目创建)发生时执行。
  3. 执行各种类型的任务:计划任务可以执行各种类型的任务,包括启动应用程序、发送电子邮件、显示消息、执行命令行命令等。

1.2 如何使用

计划任务的用户界面可以通过控制面板或管理工具(如 taskschd.msc)访问。这个界面提供了创建和管理任务的各种功能,包括启动和停止任务、查看任务的运行历史、配置任务的属性等。

在计划任务中创建新任务时,你需要配置以下信息:

  • 触发器:定义了何时执行任务。可能是一次性的、按日程的、或者是响应特定事件的。
  • 操作:定义了任务执行的具体操作。可能是启动应用程序、发送电子邮件、显示消息等。
  • 条件:定义了任务执行的条件。例如,你可以配置任务仅在计算机空闲或只在特定的电源情况下执行。
  • 设置:定义了任务的其他设置,例如任务失败时重试的次数,任务运行的最长时间等。

此外,计划任务还提供了一个命令行工具 schtasks.exe,你可以使用这个工具在命令行界面或脚本中创建和管理任务。

1.3 注意事项

使用计划任务时,你需要注意以下几点:

  • 权限:计划任务需要足够的权限才能执行某些任务。例如,执行需要管理员权限的程序,或访问网络资源等。
  • 安全性:虽然计划任务可以执行各种任务,但你应该避免使用它执行可能危害系统安全的操作。例如,你不应该使用计划任务来安装未经验证的软件,或打开可能包含恶意内容的网络连接。
  • 错误处理:任务可能由于各种原因执行失败,你应该配置适当的错误处理机制,例如重试任务、记录错误信息等。

0x02 添加计划任务的方法

在 Windows 系统中,有多种方法可以用来添加计划任务:

2.1 使用图形用户界面

    你可以使用 Windows 的 "任务计划程序" 工具来创建计划任务。这是一个图形用户界面工具,你可以通过以下步骤来使用它:

  1. 打开 "任务计划程序"。你可以在开始菜单中搜索 "任务计划程序",或者在运行对话框(Win + R)中输入 taskschd.msc 并按回车。
  2. 在右侧的操作栏中,点击 "创建基本任务" 或 "创建任务"。
  3. 按照向导的提示设置任务的名称、触发器、操作等信息。
  4. 在最后一步,检查你的设置,然后点击 "完成" 来创建任务。

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,可以编写程序添加一个计划任务。

时间触发器的例子:

https://learn.microsoft.com/en-us/windows/win32/taskschd/time-trigger-example--scripting-?source=recommendations

登录触发器的例子:

https://learn.microsoft.com/en-us/windows/win32/taskschd/logon-trigger-example--c---?source=recommendations

实现原理

程序功能分为三部分,首先是初始化,其次是添加计划任务,最后添加了删除计划任务功能。

1.Initialization

为了获取到获取 ITaskService 对象以及 ITaskFolder 对象

首先初始化COM接口

 //  初始化 COM
 hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);

  //  设置 COM security levels.
  hr = CoInitializeSecurity(NULL-1NULLNULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL0NULL);

  //  创建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

利用一个IElevatedFactoryServerCOM接口达到使用计划任务Bypass UAC的效果,同时因为进程外COM的缘故,天然也是一个断链技术。

在实战中使用也是非常好用:


    以上一些方法我已经上传到GitHub,欢迎RP别的方法。

    https://github.com/evilashz/PigScheduleTask


3.4 使用白文件添加计划任务

可以挖掘一些白文件是否存在此类问题。


0x04 使用计划任务进行横向移动

    通过RPC接口ITaskSchedulerService同样RPC bind到远程主机就可以实现横向移动,有不错的免杀性。

0x05 总结

    本文只是介绍下目前公开的一些计划任务在红队中的利用,很多人可能会说其中的很多方法可能过不了某些杀软之类的,其中提到的方法均有对抗杀软的办法比如360核晶,权限维持的很多方法(不局限于计划任务)绕过什么核晶对很多兄弟是很简单的事情,所以本文并不关注这些技术的杀软绕过方法。

    可以进入星球多补补课


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2ODYxMzY3OQ==&mid=2247505062&idx=1&sn=c89ae8c5614006c14763700ecd1c5553&chksm=ceab3fe6f9dcb6f05a46635bb78fd3a581b4fbed4d3a6a0105ca0241944dd26919d25cbf1e60&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh