RPC绕过EDR的研究与落地 - 详细教学文档
1. RPC基础概念
1.1 RPC定义
RPC(Remote Procedure Call,远程过程调用)是一种允许请求另一台计算机上服务的协议。它不是Windows特有的概念,最早在80年代的UNIX系统上实现,并作为网络文件系统(NFS)的基础。
1.2 RPC通信关键组件
- IDL文件:接口定义语言文件,统一不同平台的客户端与服务端实现
- 包含接口头(UUID和接口版本信息)和接口体(接口函数原型)
- UUID:16字节的唯一标识符,用于标识RPC通信中的接口、管理器入口点等
- ACF文件:应用程序配置文件,包含类型和函数的配置属性
1.3 RPC调用基本流程
RpcStringBindingCompose:创建绑定句柄字符串RpcBindingFromStringBinding:通过绑定句柄字符串返回绑定句柄- 必须实现内存分配和释放函数:
void* MIDL_user_allocate(size_t size); void MIDL_user_free(void* p);
2. RPC攻击面研究
2.1 IOXID Resolver探测内网多网卡主机
原理:通过发送IOXID传输包探测目标主机的多网卡信息
实现步骤:
- 构造固定格式的数据包:
05000b03100000004800000001000000b810b810000000000100000000000100c4fefc9960521b10bbcb00aa0021347a00000000045d888aeb1cc9119fe808002b10486002000000 - 接收响应包并解析(从0x07 0x00开始,到0x09 0x00 0xff结束)
代码参考:
https://github.com/M0nster3/RpcsDemo/blob/main/OXIDINterka_network_card/OXID.go
2.2 RPC over SMB
工具:rpcclient(执行客户端MS-RPC功能的工具)
常用命令参考:
https://github.com/M0nster3/RpcsDemo/blob/main/RPC%20over%20SMB/MS-RPC.md
3. MS-SAMR协议利用
3.1 添加本地用户
关键API:
SamrCreateUser2InDomain():创建用户SamrSetInformationUser():清除用户禁用标识位SamrAddMemberToAlias():将用户添加到组
实现要点:
- 不能直接在内置域(Builtin)中创建用户,需先在账户域(Account)中创建
- 创建后需清除禁用标识位才能加入内置域
代码参考:
https://github.com/M0nster3/RpcsDemo/blob/main/MS-SAMR/AddUser/AddUser/main.c
3.2 修改用户NTLM Hash
关键API:SamrChangePasswordUser()
调用流程:
SamrConnect5获取服务器句柄SamrLookupDomainInSamServer获取SIDSamrOpenDomain获取域句柄SamrLookupNamesInDomain获取RIDSamrOpenUser获取用户句柄SamrChangePasswordUser修改密码
NTLM Hash生成方法:
import hashlib,binascii
print binascii.hexlify(hashlib.new("md4", "123456".encode("utf-16le")).digest())
代码参考:
https://github.com/M0nster3/RpcsDemo/blob/main/MS-SAMR/ChangeNTLM/ChangePass/main.c
4. MS-TSCH协议利用(计划任务)
关键API:SchRpcRegisterTask()
实现要点:
- 需要提供任务路径和定义计划任务的XML
- 需要实现
RpcBindingSetAuthInfoExA进行身份验证
代码参考:
https://github.com/M0nster3/RpcsDemo/blob/main/MS-TSCH_DESK/RPCDESK/RPCDESK/main.c
5. MS-SCMR协议利用(服务控制)
关键API:
ROpenSCManagerA():打开服务控制管理器RCreateServiceA():创建服务RStartServiceA():启动服务
实现要点:
- 不是所有程序都能直接作为服务运行
- 可使用srvany.exe作为代理:
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName\Parameters /v AppDirectory /t REG_SZ /d "c:\" /f reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName\Parameters /v Application /t REG_SZ /d "c:\xxx.exe" /f reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName\Parameters /v AppParameters /t REG_SZ /d "参数" /f
6. Seclogon Dump Lsass技术
原理:
- 不直接调用
OpenProcess打开lsass进程 - 利用已打开的lsass进程句柄
- 使用
RpcImpersonateClient伪造调用者PID
参考资源:
- https://splintercod3.blogspot.com/p/the-hidden-side-of-seclogon-part-3.html
- https://splintercod3.blogspot.com/p/the-hidden-side-of-seclogon-part-2.html
- https://www.anquanke.com/post/id/245482#h3-5
- https://mp.weixin.qq.com/s/ByW_tsipzLGKa9mUBImCqA
7. 总结
RPC协议在内网渗透中具有多种利用方式,能够有效绕过EDR检测。关键点包括:
- 理解不同RPC协议的调用流程
- 掌握各协议的关键API调用顺序
- 注意内存管理和身份验证的特殊要求
- 利用现有工具和代码作为参考实现
所有演示代码可在以下仓库找到:
https://github.com/M0nster3/RpcsDemo