安全矩阵

 找回密码
 立即注册
搜索
查看: 993|回复: 0

红队视角下的Windows 计划任务

[复制链接]

417

主题

417

帖子

2391

积分

金牌会员

Rank: 6Rank: 6

积分
2391
发表于 2023-11-12 13:40:33 | 显示全部楼层 |阅读模式
黑客在思考 Z2O安全攻防 2023-11-08 21:25 发表于北京

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 的任务:

  1. schtasks /create /tn "MyTask" /tr "notepad.exe" /sc daily /st 09:00
复制代码

在这个命令中,/tn 参数是任务的名称,/tr 参数是任务要执行的操作,/sc 参数是任务的调度(如每日、每周等),/st 参数是任务的开始时间。

2.3 使用 PowerShell 脚本

    你也可以使用 PowerShell 来创建计划任务。以下是一个创建计划任务的 PowerShell 脚本示例:

  1. $Action = New-ScheduledTaskAction -Execute "notepad.exe"
  2. $Trigger = New-ScheduledTaskTrigger -At 9am -Daily
  3. 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接口

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

  3.   //  设置 COM security levels.
  4.   hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL);

  5.   //  创建Task Service对象
  6.   hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (void**)&pService);
  7.   //  连接到Task Service
  8.   hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());

  9.   hr = pService->GetFolder(_bstr_t(L"\"), &pRootFolder);
复制代码

2.CreateTask

首先创建任务定义对象,进行任务创建操作

  1.   hr = pService->NewTask(0, &pTask);
复制代码

接着设置注册信息

  1. hr = pTask->get_RegistrationInfo(&pRegInfo);
  2. //作者
  3. hr = pRegInfo->put_Author(_bstr_t(wszAuthor));
  4. //描述
  5. hr = pRegInfo->put_Description(_bstr_t(wszDescription));
复制代码

设置主体信息

  1. hr = pTask->get_Principal(&pPrincipal);
  2.   //  设置登陆类型
  3. hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN);

  4.   // 设置运行权限
  5. hr = pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST);
复制代码

设置任务相关信息

  1. hr = pTask->get_Settings(&pSettings);

  2. hr = pSettings->put_StartWhenAvailable(VARIANT_TRUE);
  3. hr = pSettings->get_IdleSettings(&pIdleSettings);
复制代码

创建触发器

  1. hr = pTask->get_Triggers(&pTriggerCollection);
  2. hr = pTriggerCollection->Create(TASK_TRIGGER_LOGON, &pTrigger);
复制代码

设置执行操作

  1. hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction);
  2. hr = pAction->QueryInterface(IID_IExecAction, (void**)&pExecAction);
  3. //设置程序路径等信息
  4. hr = pExecAction->put_Path(_bstr_t(wszProgramPath));
  5. ......
复制代码

在ITaskFolder对象注册

  1. 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

直接根据事先写好的名字删除即可

  1. hr = pRootFolder->DeleteTask(_bstr_t(TaskName), 0);
复制代码

3.2 使用RPC接口添加计划任务

    实际上COM添加计划任务最终是由RPC接口ITaskSchedulerService来实现的,以前写过:[color=var(--weui-LINK)]《Windows RPC之MS-TSCH添加计划任务》

需要UAC后进行调用。

3.3 ZcgonvhScheduleTask

    头像哥的这个非常之牛逼,参考文章:https://www.zcgonvh.com/post/Adv ... STEM_dirtectly.html

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

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

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

    https://github.com/evilashz/PigScheduleTask


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

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

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

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

0x05 总结

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

    可以进入星球多补补课


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:19 , Processed in 0.015211 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表