0x00 前言(扯淡)
好久没有发文章了,一直在家远程办公,自己休息的状态还没调整过来,最近调整的差不多了,本想发一下别的东西但是昨天看大家发了两篇关于RPC的文章。
一个是《通过Windows RPC批量寻找“出网”机器》(https://payloads.online/archivers/2022-03-04/1/),
另一篇是《[安全工具] 未授权主机信息收集工具-RPCSCAN》(https://github.com/JDArmy/RPCSCAN)。
第一篇文中提到了RPC注册计划任务,正好和我前几天写的东西一样,所以最近趁这个机会随便写写东西吧。
另外关于第二篇文章我认为mimikatz
的这块代码是否可以实现同样效果?
https://github.com/gentilkiwi/mimikatz/blob/e10bde5b16b747dc09ca5146f93f2beaf74dd17a/mimikatz/modules/kuhl_m_rpc.c#L122
只是临时翻阅了一下,没有深究,有懂哥的话可以说说。
进入正题,Windows的计划任务有多种添加方式,比如通过命令、PowerShell、C++调用COM组件等,之前写过的C++调用COM组件添加自启动的方法:PigScheduleTask(https://github.com/evilashz/PigScheduleTask),对于开启核晶的360已经失效。
所以就想使用RPC来添加计划任务,使用的是ITaskSchedulerService
这个RPC接口,接口实现了使用XML来添加计划任务的方法。
0x01 代码(瞎BB)
正常可以使用MSDN中的IDL文件或是由RPCView工具反编译出来的IDL文件,由于我的虚拟机符号还没有下载完成,RPCView有些废了,所以我直接使用MSDN上的IDL来编译需要的文件,
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tsch/96c9b399-c373-4490-b7f5-78ec3849444e
在VS中添加此IDL文件并编译将目录下生成的这几个.c以及.h文件添加至项目。
在实际编译的时候这几个文件中肯定会有代码报错,直接无脑注释就好。
然后在IDL中查看接口的UUID
或是MSDN也会写:
在暂时没有符号的RpcView上搜索一下UUID,确认一下接口:
使用\pipeatsvc
就好,然后就是常规的bind RPC端点了
handle_t BindtoRpc()
{
wchar_t buffer[100];
RPC_WSTR StringBinding;
handle_t BindingHandle;
RPC_SECURITY_QOS SecurityQOS = { 0 };
RpcStringBindingComposeW(UUID, (RPC_WSTR)L"ncacn_np", (RPC_WSTR)L"localhost", InterfaceAddress, NULL, &StringBinding);
RpcBindingFromStringBindingW(StringBinding, &BindingHandle);
SecurityQOS.Version = 1;
SecurityQOS.ImpersonationType = RPC_C_IMP_LEVEL_IMPERSONATE;
SecurityQOS.Capabilities = RPC_C_QOS_CAPABILITIES_DEFAULT;
SecurityQOS.IdentityTracking = RPC_C_QOS_IDENTITY_STATIC;
RpcBindingSetAuthInfoExA(BindingHandle, 0, RPC_C_AUTHN_LEVEL_PKT_PRIVACY, 0xA, 0, RPC_C_AUTHZ_NONE, &SecurityQOS);
RpcStringFreeW(&StringBinding);
return(BindingHandle);
}
由于是本地测试,这里直接bind到localhost即可.
如果是远程创建计划任务,RpcBindingSetAuthInfoExA
,倒数第三个参数指定SEC_WINNT_AUTH_IDENTITY这个结构就可以。
然后定义一个xml写好计划任务的触发器开始时间等,将command格式化输入到xmlBuffer中,传入SchRpcRegisterTask
的参数就可以实现计划任务的注册了。
swprintf(xmlBuffer, 4096, xml, ProgramPath);
HRESULT status = SchRpcRegisterTask(handle, L"\MicroSoft Corp", xmlBuffer, TASK_CREATE, NULL, 0, 0, NULL, &actualPath, &errorInfo);
0x02 总结(离大谱)
测试发现这个ITaskSchedulerService
接口的注册计划任务会被核晶识别为横向移动攻击,其他的两个接口还没有尝试。
实属是整了个“烂活”。但对于其他杀软以及国外的杀软还是有一定效果的,我测试卡巴斯基EDR并无阻拦。
更重要的是对于了解RPC的基础、使用、编写代码等还是有一定帮助的,比如说可以帮助理解SpoolSample、PetitPotam这类东西,然后过两天我会分享(大概率)一个Print Spooler服务的另一个RPC接口的abuse。
上述“垃圾代码”我已经上传至「黑客在思考和他的朋友们」知识星球。
可以一起来学习知识,可以扫码kk相关主题是否感兴趣(速度让我噶韭菜)
原文始发于微信公众号(黑客在思考):Windows RPC之MS-TSCH添加计划任务
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论