黑客在思考 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 的任务: - 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, -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来实现的,以前写过:[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核晶,权限维持的很多方法(不局限于计划任务)绕过什么核晶对很多兄弟是很简单的事情,所以本文并不关注这些技术的杀软绕过方法。 可以进入星球多补补课
|