135, 593 - Pentesting MSRPC

Reading time: 11 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

Le protocole Microsoft Remote Procedure Call (MSRPC), un modÚle client-serveur permettant à un programme de demander un service à un programme situé sur un autre ordinateur sans comprendre les spécificités du réseau, a été initialement dérivé d'un logiciel open-source et développé et protégé par Microsoft.

Le mappage des points de terminaison RPC peut ĂȘtre accĂ©dĂ© via le port TCP et UDP 135, SMB sur TCP 139 et 445 (avec une session nulle ou authentifiĂ©e), et en tant que service web sur le port TCP 593.

135/tcp   open     msrpc         Microsoft Windows RPC

Comment fonctionne MSRPC ?

Initie par l'application cliente, le processus MSRPC implique l'appel d'une procédure stub locale qui interagit ensuite avec la bibliothÚque d'exécution cliente pour préparer et transmettre la demande au serveur. Cela inclut la conversion des paramÚtres en un format standard de représentation de données réseau. Le choix du protocole de transport est déterminé par la bibliothÚque d'exécution si le serveur est distant, garantissant que l'RPC est livré à travers la pile réseau.

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

Identification des services RPC exposés

L'exposition des services RPC Ă  travers TCP, UDP, HTTP et SMB peut ĂȘtre dĂ©terminĂ©e en interrogeant le service de localisation RPC et les points de terminaison individuels. Des outils tels que rpcdump facilitent l'identification des services RPC uniques, dĂ©signĂ©s par des valeurs IFID, rĂ©vĂ©lant les dĂ©tails du service et les liaisons de communication :

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]

L'accÚs au service de localisation RPC est activé via des protocoles spécifiques : ncacn_ip_tcp et ncadg_ip_udp pour accéder via le port 135, ncacn_np pour les connexions SMB, et ncacn_http pour la communication RPC basée sur le web. Les commandes suivantes illustrent l'utilisation des modules Metasploit pour auditer et interagir avec les services MSRPC, en se concentrant principalement sur le port 135 :

bash
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

Toutes les options sauf tcp_dcerpc_auditor sont spécifiquement conçues pour cibler MSRPC sur le port 135.

Interfaces RPC notables

  • IFID : 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe : \pipe\lsarpc
  • Description : Interface LSA, utilisĂ©e pour Ă©numĂ©rer les utilisateurs.
  • IFID : 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe : \pipe\lsarpc
  • Description : Interface LSA Directory Services (DS), utilisĂ©e pour Ă©numĂ©rer les domaines et les relations de confiance.
  • IFID : 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe : \pipe\samr
  • Description : Interface LSA SAMR, utilisĂ©e pour accĂ©der aux Ă©lĂ©ments de la base de donnĂ©es SAM publique (par exemple, les noms d'utilisateur) et forcer les mots de passe des utilisateurs indĂ©pendamment de la politique de verrouillage de compte.
  • IFID : 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe : \pipe\atsvc
  • Description : Planificateur de tĂąches, utilisĂ© pour exĂ©cuter des commandes Ă  distance.
  • IFID : 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe : \pipe\winreg
  • Description : Service de registre Ă  distance, utilisĂ© pour accĂ©der et modifier le registre systĂšme.
  • IFID : 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe : \pipe\svcctl
  • Description : Gestionnaire de contrĂŽle de service et services serveur, utilisĂ© pour dĂ©marrer et arrĂȘter des services Ă  distance et exĂ©cuter des commandes.
  • IFID : 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe : \pipe\srvsvc
  • Description : Gestionnaire de contrĂŽle de service et services serveur, utilisĂ© pour dĂ©marrer et arrĂȘter des services Ă  distance et exĂ©cuter des commandes.
  • IFID : 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe : \pipe\epmapper
  • Description : Interface DCOM, utilisĂ©e pour le craquage de mots de passe par force brute et la collecte d'informations via WM.

Identification des adresses IP

En utilisant https://github.com/mubix/IOXIDResolver, provenant de Airbus research, il est possible d'abuser de la méthode ServerAlive2 à l'intérieur de l'interface IOXIDResolver.

Cette méthode a été utilisée pour obtenir des informations sur l'interface sous forme d'adresse IPv6 de la boßte HTB APT. Voir ici pour le rapport 0xdf APT, il inclut une méthode alternative utilisant rpcmap.py de Impacket avec stringbinding (voir ci-dessus).

Exécution d'un RCE avec des identifiants valides

Il est possible d'exécuter du code à distance sur une machine, si les identifiants d'un utilisateur valide sont disponibles en utilisant dcomexec.py du framework impacket.

N'oubliez pas d'essayer avec les différents objets disponibles

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

Port 593

Le rpcdump.exe de rpctools peut interagir avec ce port.

Fuzzing automatisé des interfaces MSRPC

Les interfaces MS-RPC exposent une surface d'attaque large et souvent non documentée. Le module PowerShell open-source MS-RPC-Fuzzer s'appuie sur NtObjectManager de James Forshaw pour créer dynamiquement des stubs de client RPC à partir des métadonnées d'interface déjà présentes dans les binaires Windows. Une fois qu'un stub existe, le module peut bombarder chaque procédure avec des entrées mutées et enregistrer le résultat, rendant le fuzzing reproductible à grande échelle des points de terminaison RPC possible sans écrire une seule ligne d'IDL.

1. Inventaire des interfaces

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 extraira le UUID, la version, les chaßnes de liaison (named-pipe / TCP / HTTP) et les prototypes de procédure complets pour chaque interface qu'il rencontre et les stockera dans rpcServerData.json.

2. Exécutez le fuzzer

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

Options pertinentes :

  • -MinStrLen / -MaxStrLen – plage de taille pour les chaĂźnes gĂ©nĂ©rĂ©es
  • -MinIntSize / -MaxIntSize – plage de valeur pour les entiers mutĂ©s (utile pour les tests de dĂ©bordement)
  • -Sorted – exĂ©cute les procĂ©dures dans un ordre qui respecte les dĂ©pendances des paramĂštres afin que les sorties d'un appel puissent servir d'entrĂ©es pour le suivant (augmente considĂ©rablement les chemins accessibles)

Le fuzzer implémente 2 stratégies :

  1. Fuzzer par dĂ©faut – valeurs primitives alĂ©atoires + instances par dĂ©faut pour les types complexes
  2. Fuzzer triĂ© – ordonnancement conscient des dĂ©pendances (voir docs/Procedure dependency design.md)

Chaque appel est écrit de maniÚre atomique dans log.txt ; aprÚs un crash, la derniÚre ligne vous indique immédiatement la procédure fautive. Le résultat de chaque appel est également catégorisé en trois fichiers JSON :

  • allowed.json – l'appel a rĂ©ussi et a renvoyĂ© des donnĂ©es
  • denied.json – le serveur a rĂ©pondu avec AccĂšs refusĂ©
  • error.json – toute autre erreur / crash

3. Visualiser avec Neo4j

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

Import-DataToNeo4j convertit les artefacts JSON en une structure de graphe oĂč :

  • Les serveurs RPC, interfaces et procĂ©dures sont des nƓuds
  • Les interactions (ALLOWED, DENIED, ERROR) sont des relations

Des requĂȘtes Cypher peuvent ensuite ĂȘtre utilisĂ©es pour repĂ©rer rapidement des procĂ©dures dangereuses ou pour rejouer la chaĂźne exacte d'appels qui a prĂ©cĂ©dĂ© un crash.

⚠ Le fuzzer est destructeur : attendez-vous Ă  des plantages de service et mĂȘme des BSOD – exĂ©cutez-le toujours dans un instantanĂ© de VM isolĂ©.

ÉnumĂ©ration d'Interface AutomatisĂ©e & GĂ©nĂ©ration Dynamique de Client (NtObjectManager)

Le gourou de PowerShell James Forshaw a exposĂ© la plupart des internals de Windows RPC Ă  l'intĂ©rieur du module open-source NtObjectManager. En l'utilisant, vous pouvez transformer n'importe quel DLL / EXE de serveur RPC en un stub de client entiĂšrement fonctionnel en quelques secondes – sans IDL, MIDL ou dĂ©sĂ©rialisation manuelle requise.

powershell
# 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 *

La sortie typique expose les types de paramĂštres exactement comme ils apparaissent dans MIDL (par exemple, FC_C_WSTRING, FC_LONG, FC_BIND_CONTEXT).

Une fois que vous connaissez l'interface, vous pouvez gĂ©nĂ©rer un client C# prĂȘt Ă  ĂȘtre compilĂ© :

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

À l'intĂ©rieur du stub produit, vous trouverez des mĂ©thodes telles que :

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

L'outil PowerShell Get-RpcClient peut créer un objet client interactif afin que vous puissiez appeler la procédure immédiatement :

powershell
$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)

L'authentification (Kerberos / NTLM) et les niveaux de cryptage (PacketIntegrity, PacketPrivacy, 
) peuvent ĂȘtre fournis directement via le cmdlet Connect-RpcClient – idĂ©al pour contourner les descripteurs de sĂ©curitĂ© qui protĂšgent les pipes nommĂ©s Ă  privilĂšges Ă©levĂ©s.

Fuzzing RPC Sensible au Contexte (MS-RPC-Fuzzer)

La connaissance statique de l'interface est excellente, mais ce que vous voulez vraiment, c'est un fuzzing guidé par la couverture qui comprend les handles de contexte et les chaßnes de paramÚtres complexes. Le projet open-source MS-RPC-Fuzzer automatise exactement ce flux de travail :

  1. ÉnumĂ©rer chaque interface/procĂ©dure exportĂ©e par le binaire cible (Get-RpcServer).
  2. Générer des clients dynamiques pour chaque interface (Format-RpcClient).
  3. Randomiser les paramÚtres d'entrée (longueur des chaßnes larges, plages d'entiers, énumérations) tout en respectant le type NDR original.
  4. Suivre les handles de contexte retournés par un appel pour alimenter automatiquement les procédures de suivi.
  5. Effectuer des appels à fort volume contre le transport choisi (ALPC, TCP, HTTP ou pipe nommé).
  6. Enregistrer les statuts de sortie / dĂ©fauts / dĂ©lais d'attente et exporter un fichier d'importation Neo4j pour visualiser les relations interface → procĂ©dure → paramĂštre et les clusters de plantage.

Exécution d'exemple (cible de pipe nommé) :

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

Une seule Ă©criture hors limites ou une exception inattendue sera immĂ©diatement rĂ©vĂ©lĂ©e avec l'opnum exact + la charge utile fuzzĂ©e qui l'a dĂ©clenchĂ©e – point de dĂ©part parfait pour un exploit de preuve de concept stable.

⚠ De nombreux services RPC s'exĂ©cutent dans des processus fonctionnant en tant que NT AUTHORITY\SYSTEM. Tout problĂšme de sĂ©curitĂ© mĂ©moire ici se traduit gĂ©nĂ©ralement par une Ă©lĂ©vation de privilĂšges locale ou (lorsqu'il est exposĂ© via SMB/135) exĂ©cution de code Ă  distance.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks