Translated ['src/network-services-pentesting/135-pentesting-msrpc.md'] t

This commit is contained in:
Translator 2025-07-17 22:10:04 +00:00
parent 4d025e6f60
commit 004e78ed09

View File

@ -6,7 +6,7 @@
Protokół Microsoft Remote Procedure Call (MSRPC), model klient-serwer umożliwiający programowi żądanie usługi od programu znajdującego się na innym komputerze bez zrozumienia specyfiki sieci, początkowo pochodził z oprogramowania open-source, a później został opracowany i objęty prawem autorskim przez Microsoft.
Mapper punktów końcowych RPC można uzyskać za pomocą portu TCP i UDP 135, SMB na TCP 139 i 445 (z sesją null lub uwierzytelnioną) oraz jako usługę internetową na porcie TCP 593.
Mapper punktów końcowych RPC można uzyskać za pomocą portu TCP i UDP 135, SMB na TCP 139 i 445 (z sesją null lub uwierzytelnioną) oraz jako usługa internetowa na porcie TCP 593.
```
135/tcp open msrpc Microsoft Windows RPC
```
@ -18,7 +18,7 @@ Inicjowany przez aplikację kliencką, proces MSRPC polega na wywołaniu lokalne
## **Identyfikacja wystawionych usług RPC**
Wystawienie usług RPC 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, oznaczonych wartościami **IFID**, ujawniając szczegóły usługi i powiązania komunikacyjne:
Ekspozycję usług RPC 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, oznaczonych wartościami **IFID**, ujawniając szczegóły usługi i powiązania komunikacyjne:
```
D:\rpctools> rpcdump [-p port] <IP>
**IFID**: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
@ -26,7 +26,7 @@ Annotation: Messenger Service
UUID: 00000000-0000-0000-0000-000000000000
Binding: ncadg_ip_udp:<IP>[1028]
```
Dostęp do usługi lokalizatora RPC jest włączony przez określone protokoły: 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 opartej na sieci web. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytowania i interakcji z usługami MSRPC, koncentrując się głównie na porcie 135:
Dostęp do usługi lokalizatora RPC jest włączony za pomocą określonych 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 opartej na sieci web. Poniższe polecenia ilustrują wykorzystanie modułów Metasploit do audytowania i interakcji z usługami MSRPC, koncentrując się głównie na porcie 135:
```bash
use auxiliary/scanner/dcerpc/endpoint_mapper
use auxiliary/scanner/dcerpc/hidden
@ -52,7 +52,7 @@ Wszystkie opcje z wyjątkiem `tcp_dcerpc_auditor` są specjalnie zaprojektowane
- **Opis**: Harmonogram zadań, używany do zdalnego wykonywania poleceń.
- **IFID**: 338cd001-2244-31f1-aaaa-900038001003
- **Named Pipe**: `\pipe\winreg`
- **Opis**: Usługa rejestru zdalnego, używana do uzyskiwania dostępu i modyfikacji rejestru systemowego.
- **Opis**: Usługa rejestru zdalnego, używana do uzyskiwania dostępu i modyfikowania rejestru systemowego.
- **IFID**: 367abb81-9844-35f1-ad32-98f038001003
- **Named Pipe**: `\pipe\svcctl`
- **Opis**: Menedżer kontroli usług i usługi serwera, używany do zdalnego uruchamiania i zatrzymywania usług oraz wykonywania poleceń.
@ -67,7 +67,7 @@ Wszystkie opcje z wyjątkiem `tcp_dcerpc_auditor` są specjalnie zaprojektowane
Używając [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), pochodzącego z [badania Airbus](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), możliwe jest nadużycie metody _**ServerAlive2**_ wewnątrz interfejsu _**IOXIDResolver**_.
Metoda ta była używana do uzyskiwania informacji o interfejsie jako adresie **IPv6** z maszyny HTB _APT_. Zobacz [tutaj](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) dla opisu 0xdf APT, zawiera alternatywną metodę używającą rpcmap.py z [Impacket](https://github.com/SecureAuthCorp/impacket/) z _stringbinding_ (patrz powyżej).
Metoda ta była używana do uzyskiwania informacji o interfejsie jako adresie **IPv6** z maszyny HTB _APT_. Zobacz [tutaj](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) dla opisu 0xdf APT, który zawiera alternatywną metodę używającą rpcmap.py z [Impacket](https://github.com/SecureAuthCorp/impacket/) z _stringbinding_ (patrz powyżej).
### Wykonywanie RCE z ważnymi poświadczeniami
@ -83,9 +83,65 @@ Możliwe jest wykonanie zdalnego kodu na maszynie, jeśli dostępne są poświad
**rpcdump.exe** z [rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools) może współdziałać z tym portem.
### Zautomatyzowana enumeracja interfejsów i dynamiczne generowanie klientów (NtObjectManager)
## Zautomatyzowane fuzzowanie interfejsów MSRPC
Guru PowerShell **James Forshaw** ujawnił większość wewnętrznych elementów Windows RPC w otwartym module *NtObjectManager*. Używając go, możesz w kilka sekund przekształcić dowolny serwer RPC DLL / EXE w **w pełni funkcjonalny stub klienta** bez potrzeby IDL, MIDL ani ręcznego unmarshalling.
Interfejsy MS-RPC ujawniają dużą i często niedokumentowaną powierzchnię ataku. Otwarty moduł PowerShell [MS-RPC-Fuzzer](https://github.com/warpnet/MS-RPC-Fuzzer) oparty na `NtObjectManager` Jamesa Forshawa, *dynamicznie* tworzy stuby klienta RPC z metadanych interfejsu, które są już obecne w binariach systemu Windows. Gdy stub istnieje, moduł może bombardować każdą procedurę z mutowanymi danymi wejściowymi i rejestrować wyniki, co umożliwia **powtarzalne, dużej skali fuzzowanie punktów końcowych RPC bez pisania ani jednej linii IDL**.
### 1. Inwentaryzacja interfejsów
```powershell
# 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ę, ciągi powiązań (named-pipe / TCP / HTTP) oraz **pełne prototypy procedur** dla każdego interfejsu, z którym się spotka, i zapisze je w `rpcServerData.json`.
### 2. Uruchom fuzzer
```powershell
'.\output\rpcServerData.json' |
Invoke-RpcFuzzer -OutPath .\output `
-MinStrLen 100 -MaxStrLen 1000 `
-MinIntSize 9999 -MaxIntSize 99999
```
Relewantne opcje:
* `-MinStrLen` / `-MaxStrLen` zakres rozmiaru dla generowanych ciągów
* `-MinIntSize` / `-MaxIntSize` zakres wartości dla zmutowanych liczb całkowitych (przydatne do testowania przepełnienia)
* `-Sorted` wykonuj procedury w kolejności, która uwzględnia **zależności parametrów**, aby wyniki jednego wywołania mogły służyć jako dane wejściowe dla następnego (dramatycznie zwiększa dostępne ścieżki)
Fuzzer implementuje 2 strategie:
1. **Default fuzzer** losowe wartości prymitywne + domyślne instancje dla typów złożonych
2. **Sorted fuzzer** uporządkowanie z uwzględnieniem zależności (zobacz `docs/Procedure dependency design.md`)
Każde wywołanie jest zapisywane atomowo do `log.txt`; po awarii **ostatnia linia natychmiast informuje o problematycznej procedurze**. Wynik każdego wywołania jest również klasyfikowany do trzech plików JSON:
* `allowed.json` wywołanie zakończone sukcesem i zwrócone dane
* `denied.json` serwer odpowiedział *Access Denied*
* `error.json` inny błąd / awaria
### 3. Wizualizacja z Neo4j
```powershell
'.\output\allowed.json' |
Import-DataToNeo4j -Neo4jHost 192.168.56.10:7474 -Neo4jUsername neo4j
```
`Import-DataToNeo4j` konwertuje artefakty JSON na strukturę grafu, gdzie:
* Serwery RPC, interfejsy i procedury są **węzłami**
* Interakcje (`ALLOWED`, `DENIED`, `ERROR`) są **relacjami**
Zapytania Cypher mogą być następnie używane do szybkiego wykrywania niebezpiecznych procedur lub do odtworzenia dokładnego łańcucha wywołań, który poprzedzał awarię.
⚠️ Fuzzer jest *destrukcyjny*: spodziewaj się awarii usług, a nawet BSOD zawsze uruchamiaj go w izolowanym zrzucie VM.
### Zautomatyzowana enumeracja interfejsów i dynamiczna generacja klienta (NtObjectManager)
Guru PowerShell **James Forshaw** ujawnił większość wewnętrznych elementów RPC Windows w otwartoźródłowym module *NtObjectManager*. Używając go, możesz w kilka sekund przekształcić dowolny DLL / EXE serwera RPC w **w pełni funkcjonalny stub klienta** bez potrzeby IDL, MIDL czy ręcznego unmarshalling.
```powershell
# Install the module once
Install-Module NtObjectManager -Force
@ -121,16 +177,14 @@ Connect-RpcClient $client -stringbinding 'ncacn_np:127.0.0.1[\\pipe\\efsrpc]' `
$ctx = New-Object Marshal.NdrContextHandle
$client.EfsRpcOpenFileRaw([ref]$ctx, "\\\127.0.0.1\test", 0)
```
Autoryzacja (Kerberos / NTLM) i poziomy szyfrowania (`PacketIntegrity`, `PacketPrivacy`, …) mogą być dostarczane bezpośrednio za pomocą cmdletu `Connect-RpcClient` idealne do **omijania deskryptorów zabezpieczeń** chroniących wysokoprzywilejowane nazwane rury.
---
Autoryzacja (Kerberos / NTLM) i poziomy szyfrowania (`PacketIntegrity`, `PacketPrivacy`, …) mogą być dostarczane bezpośrednio za pomocą cmdletu `Connect-RpcClient` idealne do **omijania deskryptorów zabezpieczeń** chroniących wysokoprywatne nazwane rury.
### Fuzzing RPC z uwzględnieniem kontekstu (MS-RPC-Fuzzer)
Statyczna wiedza o interfejsie jest świetna, ale to, czego naprawdę chcesz, to **fuzzing z przewodnictwem pokrycia**, który rozumie *uchwyty kontekstu* i złożone łańcuchy parametrów. Projekt open-source **MS-RPC-Fuzzer** automatyzuje dokładnie ten proces:
1. Wymień każdy interfejs/procedurę eksportowaną przez docelowy plik binarny (`Get-RpcServer`).
2. Generuj dynamiczne klienty dla każdego interfejsu (`Format-RpcClient`).
2. Generuj dynamiczne klientów dla każdego interfejsu (`Format-RpcClient`).
3. Randomizuj parametry wejściowe (długość szerokich ciągów, zakresy liczb całkowitych, enumy), szanując oryginalny **typ NDR**.
4. Śledź *uchwyty kontekstu* zwracane przez jedno wywołanie, aby automatycznie zasilać procedury następcze.
5. Wykonuj wywołania o dużej objętości przeciwko wybranemu transportowi (ALPC, TCP, HTTP lub nazwanej rurze).
@ -145,18 +199,17 @@ Invoke-MSRPCFuzzer -Pipe "\\.\pipe\efsrpc" -Auth NTLM `
```
Jedno pisanie poza zakresem lub nieoczekiwany wyjątek zostanie natychmiast ujawniony z dokładnym opnum + zafałszowanym ładunkiem, który go wywołał idealny punkt wyjścia do stabilnego dowodu koncepcji exploita.
> ⚠️ Wiele usług RPC działa w procesach uruchamianych jako **NT AUTHORITY\SYSTEM**. Każdy problem z bezpieczeństwem pamięci tutaj zazwyczaj prowadzi do lokalnej eskalacji uprawnień lub (gdy jest udostępniony przez SMB/135) *zdalnego wykonania kodu*.
> ⚠️ Wiele usług RPC działa w procesach uruchamianych jako **NT AUTHORITY\SYSTEM**. Każdy problem z bezpieczeństwem pamięci tutaj zazwyczaj przekłada się na lokalne podniesienie uprawnień lub (gdy jest wystawiony przez SMB/135) *zdalne wykonanie kodu*.
---
## Odniesienia
- [Automating MS-RPC vulnerability research (2025, Incendium.rocks)](https://www.incendium.rocks/posts/Automating-MS-RPC-Vulnerability-Research/)
- [MS-RPC-Fuzzer kontekstowy fuzzer RPC](https://github.com/warpnet/MS-RPC-Fuzzer)
- [Moduł PowerShell NtObjectManager](https://github.com/googleprojectzero/sandbox-attacksurface-analysis-tools/tree/master/NtObjectManager)
- [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
- [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
- [https://0xffsec.com/handbook/services/msrpc/](https://0xffsec.com/handbook/services/msrpc/)
- [MS-RPC-Fuzzer (GitHub)](https://github.com/warpnet/MS-RPC-Fuzzer)
{{#include ../banners/hacktricks-training.md}}