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调用过程
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哈希生成:
import hashlib,binascii
print binascii.hexlify(hashlib.new("md4", "123456".encode("utf-16le")).digest())
代码参考: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作为服务启动 - 将执行内容路径放入注册表:
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
实现步骤:
- 提取初始数据(-t 1)
- 解密获取凭证
参考资源:
3. 防御建议
- 限制RPC端口的网络访问
- 监控异常RPC调用行为
- 定期审计域内用户和组变更
- 限制计划任务和服务创建权限
- 对敏感API调用进行行为监控
- 更新系统补丁,修复已知RPC漏洞