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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.
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.
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 :
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
# 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
'.\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 :
- Fuzzer par dĂ©faut â valeurs primitives alĂ©atoires + instances par dĂ©faut pour les types complexes
- 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Ă©esdenied.json
â le serveur a rĂ©pondu avec AccĂšs refusĂ©error.json
â toute autre erreur / crash
3. Visualiser avec Neo4j
'.\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.
# 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Ă© :
# 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 :
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 :
$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 :
- ĂnumĂ©rer chaque interface/procĂ©dure exportĂ©e par le binaire cible (
Get-RpcServer
). - Générer des clients dynamiques pour chaque interface (
Format-RpcClient
). - Randomiser les paramÚtres d'entrée (longueur des chaßnes larges, plages d'entiers, énumérations) tout en respectant le type NDR original.
- Suivre les handles de contexte retournés par un appel pour alimenter automatiquement les procédures de suivi.
- Effectuer des appels à fort volume contre le transport choisi (ALPC, TCP, HTTP ou pipe nommé).
- 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é) :
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
- Automating MS-RPC vulnerability research (2025, Incendium.rocks)
- MS-RPC-Fuzzer â context-aware RPC fuzzer
- NtObjectManager PowerShell module
- 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://0xffsec.com/handbook/services/msrpc/
- MS-RPC-Fuzzer (GitHub)
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
- Vérifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépÎts github.