RPC绕过EDR的研究与落地
字数 2239 2025-08-25 22:58:41

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调用基本流程

  1. RpcStringBindingCompose:创建绑定句柄字符串
  2. RpcBindingFromStringBinding:通过绑定句柄字符串返回绑定句柄
  3. 必须实现内存分配和释放函数:
    void* MIDL_user_allocate(size_t size);
    void MIDL_user_free(void* p);
    

2. RPC攻击面研究

2.1 IOXID Resolver探测内网多网卡主机

原理:通过发送IOXID传输包探测目标主机的多网卡信息

实现步骤

  1. 构造固定格式的数据包:
    05000b03100000004800000001000000b810b810000000000100000000000100c4fefc9960521b10bbcb00aa0021347a00000000045d888aeb1cc9119fe808002b10486002000000
    
  2. 接收响应包并解析(从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():将用户添加到组

实现要点

  1. 不能直接在内置域(Builtin)中创建用户,需先在账户域(Account)中创建
  2. 创建后需清除禁用标识位才能加入内置域

代码参考
https://github.com/M0nster3/RpcsDemo/blob/main/MS-SAMR/AddUser/AddUser/main.c

3.2 修改用户NTLM Hash

关键APISamrChangePasswordUser()

调用流程

  1. SamrConnect5获取服务器句柄
  2. SamrLookupDomainInSamServer获取SID
  3. SamrOpenDomain获取域句柄
  4. SamrLookupNamesInDomain获取RID
  5. SamrOpenUser获取用户句柄
  6. 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协议利用(计划任务)

关键APISchRpcRegisterTask()

实现要点

  1. 需要提供任务路径和定义计划任务的XML
  2. 需要实现RpcBindingSetAuthInfoExA进行身份验证

代码参考
https://github.com/M0nster3/RpcsDemo/blob/main/MS-TSCH_DESK/RPCDESK/RPCDESK/main.c

5. MS-SCMR协议利用(服务控制)

关键API

  • ROpenSCManagerA():打开服务控制管理器
  • RCreateServiceA():创建服务
  • RStartServiceA():启动服务

实现要点

  1. 不是所有程序都能直接作为服务运行
  2. 可使用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技术

原理

  1. 不直接调用OpenProcess打开lsass进程
  2. 利用已打开的lsass进程句柄
  3. 使用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检测。关键点包括:

  1. 理解不同RPC协议的调用流程
  2. 掌握各协议的关键API调用顺序
  3. 注意内存管理和身份验证的特殊要求
  4. 利用现有工具和代码作为参考实现

所有演示代码可在以下仓库找到:
https://github.com/M0nster3/RpcsDemo

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 :通过绑定句柄字符串返回绑定句柄 必须实现内存分配和释放函数: 2. RPC攻击面研究 2.1 IOXID Resolver探测内网多网卡主机 原理 :通过发送IOXID传输包探测目标主机的多网卡信息 实现步骤 : 构造固定格式的数据包: 接收响应包并解析(从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 获取SID SamrOpenDomain 获取域句柄 SamrLookupNamesInDomain 获取RID SamrOpenUser 获取用户句柄 SamrChangePasswordUser 修改密码 NTLM Hash生成方法 : 代码参考 : 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作为代理: 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