声明:文中涉及到的技术和工具,仅供学习使用,禁止从事任何非法活动,如因此造成的直接或间接损失,均由使用者自行承担责任。
简介
这里引用微软官方的介绍:
Microsoft 远程过程调用 (RPC) 是一种进程间通信 (IPC) 机制,可实现数据交换和驻留在不同进程中的功能的调用。该进程可以在同一台计算机上、在局域网 (LAN) 上或通过 Internet。Microsoft RPC 机制使用其他 IPC 机制(例如命名管道、NetBIOS 或 Winsock)来建立客户端和服务器之间的通信。通过RPC,基本的程序逻辑和相关的过程代码可以存在于不同的计算机上,这对于分布式应用程序很重要。
建立RPC服务
当建立RPC Server时,会向EPM服务器注册相关信息,这些信息会存储在epm服务器的端点映射数据库中,rpc发现过程中也是查询端点映射数据库中的信息返回给client,每个windows主机都是自带EPM服务的;
一般每个windows都会有rpc服务以及epm,如果不是域内,只是本地进行rpc通信,会向目标主机上的epm进行epm map(映射)请求;
常见注册信息如下:
-
服务uuid(通用唯一标识符);
-
服务ip及开放的端口;
RPC通信的四个阶段
以impacket中的addcomputer.py进行举例,该脚本是在域内注册机器账号,wireshare抓包如下:
相关命令:
python addcomputer.py domain.local/win10_admin:Admin@123 -dc-ip 192.168.1.128
//domain.local/win10_admin:Admin@123为域用户凭证
//192.168.1.128为域控制器ip
第一阶段:建立TCP通信
第二阶段:RPC绑定
client向server发送RPC绑定请求,其中包括rpc通信所使用的通信协议、版本等;
server向client返回响应,其中包括rpc通信id、数据分片形式、传输最大值、是否同意进行通信等;
通信协议
client选择通信协议向server建立连接,这些协议都是基于tcp协议,协议如下:
第三阶段:RPC发现及查询
如果在不知道rpc服务器的ip及端口,则RPC发现要放在第一阶段,通过epm map请求epm来获取rpc服务端的信息,再进行rpc绑定和通信;
EPM MAP(映射)请求
client向epm发送map请求也叫做映射请求,其中包括rpc服务器的ip地址等信息;
epm向client发送map 响应,其中包括rpc服务器的host和端口,如果是smb协议会返回Named Pipe等信息;
详细查看map请求包,Operation表示操作类型位映射操作;UUID pointer表示映射请求的类型,REFerent ID不为空表示UUID存在,UUID等于0表示不知道具体的UUID,也就是未指定具体 UUID 的映射请求;Tower pointer可以理解为查询的条件,分别为:
-
SAMR uuid:表示请求目标SAMR服务;
-
32bit NDR:表示传输格式为32位;
-
RPC connection-oriented protocol:表示使用 RPC 连接导向的协议;
-
NamePipe:表示使用pipe命名管道进行通信;
-
NetBIOS:表示NetBIOS地址为192.168.1.128;
从请求包中我们可以分析出MAP请求要SAMR服务的PIPE命名管道接口;
详细查看map响应包中Tower pointer携带了SAMR服务对应的PIPE命名管道名称pipef253e8360b6bb445;
TCP 通信结束
经历了rpc的绑定后,tcp进行四次挥手断开;
第四阶段:RPC通信
重新开启tcp连接进行rpc通信,使用rpc绑定时的协议进行通信;
通过查看addcomputer的rpc过程,绘制流程图如下:
总结
本次对MS-RPC协议的通信流程进行简单的分析,上面举的例子为需要EPM映射请求的,大部分常见的RPC接口都是已知的,所以就不需要RPM通信这一步;往上对于EPM相关信息比较少,所以才选择带有EPM的相关通信进行分析。
点点关注不迷路,每周不定时持续分享各种干货。可关注公众号回复"进群",也可添加管理微信拉你入群。
原文始发于微信公众号(众亦信安):MS-RPC 流程浅析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论