RPC在内网的攻击面
字数 1984 2025-08-11 08:35:42

RPC在内网攻击面分析与利用

1. RPC基础概念

RPC(远程过程调用)是一种允许请求另一台计算机上服务的协议,最初在80年代UNIX系统上实现,Windows系统也实现了自己的RPC机制。

1.1 RPC核心组件

  • IDL文件:接口定义语言文件,包含接口头(UUID和接口版本)和接口体(接口函数原型)
  • UUID:16字节的唯一标识符,用于标识RPC接口、管理器入口点向量或客户端对象
  • ACF文件:应用程序配置文件,包含IDL文件中定义的类型和函数的配置属性

1.2 RPC调用过程

  1. RpcStringBindingCompose:创建绑定句柄字符串
  2. RpcBindingFromStringBinding:通过绑定句柄字符串返回绑定句柄
  3. 必须定义内存分配和释放函数:MIDL_user_allocateMIDL_user_free

2. RPC攻击面分析

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

攻击原理:通过发送IOXID传输包探测内网多网卡主机信息

实现步骤

  1. 构造固定格式的数据包:05000b03100000004800000001000000b810b810000000000100000000000100c4fefc9960521b10bbcb00aa0021347a00000000045d888aeb1cc9119fe808002b10486002000000
  2. 接收并分析响应包,从/0x07/0x00/开始分割,到0x09/0x00/0xff结束

代码参考OXID.go

2.2 RPC over SMB

攻击原理:通过SMB协议传输RPC服务,利用管道进行访问

工具rpcclient - 执行客户端MS-RPC功能的工具

命令参考MS-RPC.md

2.3 MS-SAMR协议利用

2.3.1 添加本地用户

关键API

  • SamrCreateUser2InDomain():创建用户
  • SamrSetInformationUser():设置用户属性(清除禁用标识位)
  • SamrAddMemberToAlias():将用户添加到组

实现步骤

  1. 获取账户域(Account)和内置域(Builtin)的SID
  2. 获取域对象句柄
  3. 创建用户并清除禁用标识位
  4. 将用户添加到组

注意事项

  • 不能直接创建到内置域(Builtin)中,需先创建到账户域(Account)中
  • 账户域用户只能访问所在计算机资源,内置域账户可访问域资源

代码参考AddUser/main.c

2.3.2 修改用户NTLM哈希

关键APISamrChangePasswordUser()

实现步骤

  1. 使用SamrConnect5获取服务器句柄
  2. 使用SamrLookupDomainInSamServer获取服务器SID
  3. 使用SamrOpenDomain获取域句柄
  4. 使用SamrLookupNamesInDomain获取RID号
  5. 使用SamrOpenUser获取用户句柄
  6. 调用SamrChangePasswordUser修改密码

NTLM哈希生成

import hashlib,binascii
print binascii.hexlify(hashlib.new("md4", "123456".encode("utf-16le")).digest())

代码参考ChangePass/main.c

2.4 MS-TSCH协议利用(任务计划)

关键APISchRpcRegisterTask()

参数

  • 服务路径
  • 定义计划任务的XML

注意事项

  • 需要实现RpcBindingSetAuthInfoExA进行验证
  • 需要配置RPC绑定

代码参考RPCDESK/main.c

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

关键API

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

服务创建技巧

  1. 使用srvany.exe作为服务启动
  2. 将执行内容路径放入注册表:
    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
    

2.6 Seclogon Dump Lsass

攻击原理

  • 不直接调用OpenProcess打开进程对象
  • 利用已打开的Lsass进程句柄
  • 使用RpcImpersonateClient伪造调用者PID

实现步骤

  1. 提取初始数据(-t 1)
  2. 解密获取凭证

参考资源

3. 防御建议

  1. 限制RPC端口的网络访问
  2. 监控异常RPC调用行为
  3. 定期审计域内用户和组变更
  4. 限制计划任务和服务创建权限
  5. 对敏感API调用进行行为监控
  6. 更新系统补丁,修复已知RPC漏洞

4. 参考资源

  1. 微软RPC官方文档
  2. MS-SAMR协议文档
  3. MS-TSCH协议文档
  4. MS-SCMR协议文档
  5. RpcsDemo项目
RPC在内网攻击面分析与利用 1. RPC基础概念 RPC(远程过程调用)是一种允许请求另一台计算机上服务的协议,最初在80年代UNIX系统上实现,Windows系统也实现了自己的RPC机制。 1.1 RPC核心组件 IDL文件 :接口定义语言文件,包含接口头(UUID和接口版本)和接口体(接口函数原型) UUID :16字节的唯一标识符,用于标识RPC接口、管理器入口点向量或客户端对象 ACF文件 :应用程序配置文件,包含IDL文件中定义的类型和函数的配置属性 1.2 RPC调用过程 RpcStringBindingCompose :创建绑定句柄字符串 RpcBindingFromStringBinding :通过绑定句柄字符串返回绑定句柄 必须定义内存分配和释放函数: MIDL_user_allocate 和 MIDL_user_free 2. RPC攻击面分析 2.1 IOXID Resolver探测内网多网卡主机 攻击原理 :通过发送IOXID传输包探测内网多网卡主机信息 实现步骤 : 构造固定格式的数据包: 05000b03100000004800000001000000b810b810000000000100000000000100c4fefc9960521b10bbcb00aa0021347a00000000045d888aeb1cc9119fe808002b10486002000000 接收并分析响应包,从 /0x07/0x00/ 开始分割,到 0x09/0x00/0xff 结束 代码参考 : OXID.go 2.2 RPC over SMB 攻击原理 :通过SMB协议传输RPC服务,利用管道进行访问 工具 : rpcclient - 执行客户端MS-RPC功能的工具 命令参考 : MS-RPC.md 2.3 MS-SAMR协议利用 2.3.1 添加本地用户 关键API : SamrCreateUser2InDomain() :创建用户 SamrSetInformationUser() :设置用户属性(清除禁用标识位) SamrAddMemberToAlias() :将用户添加到组 实现步骤 : 获取账户域(Account)和内置域(Builtin)的SID 获取域对象句柄 创建用户并清除禁用标识位 将用户添加到组 注意事项 : 不能直接创建到内置域(Builtin)中,需先创建到账户域(Account)中 账户域用户只能访问所在计算机资源,内置域账户可访问域资源 代码参考 : AddUser/main.c 2.3.2 修改用户NTLM哈希 关键API : SamrChangePasswordUser() 实现步骤 : 使用 SamrConnect5 获取服务器句柄 使用 SamrLookupDomainInSamServer 获取服务器SID 使用 SamrOpenDomain 获取域句柄 使用 SamrLookupNamesInDomain 获取RID号 使用 SamrOpenUser 获取用户句柄 调用 SamrChangePasswordUser 修改密码 NTLM哈希生成 : 代码参考 : ChangePass/main.c 2.4 MS-TSCH协议利用(任务计划) 关键API : SchRpcRegisterTask() 参数 : 服务路径 定义计划任务的XML 注意事项 : 需要实现 RpcBindingSetAuthInfoExA 进行验证 需要配置RPC绑定 代码参考 : RPCDESK/main.c 2.5 MS-SCMR协议利用(服务控制) 关键API : ROpenSCManagerA() :打开服务控制管理器 RCreateServiceA() :创建服务 RStartServiceA() :启动服务 服务创建技巧 : 使用 srvany.exe 作为服务启动 将执行内容路径放入注册表: 2.6 Seclogon Dump Lsass 攻击原理 : 不直接调用 OpenProcess 打开进程对象 利用已打开的Lsass进程句柄 使用 RpcImpersonateClient 伪造调用者PID 实现步骤 : 提取初始数据(-t 1) 解密获取凭证 参考资源 : The Hidden Side of Seclogon Seclogon利用分析 3. 防御建议 限制RPC端口的网络访问 监控异常RPC调用行为 定期审计域内用户和组变更 限制计划任务和服务创建权限 对敏感API调用进行行为监控 更新系统补丁,修复已知RPC漏洞 4. 参考资源 微软RPC官方文档 MS-SAMR协议文档 MS-TSCH协议文档 MS-SCMR协议文档 RpcsDemo项目