Toolkit en Rust para investigación ofensiva de la superficie de ataque ALPC/RPC en Windows.
Windows utiliza ALPC (Advanced Local Procedure Call) como mecanismo de IPC de bajo nivel. RPC sobre Windows lo usa internamente — casi todos los servicios del sistema exponen endpoints RPC que viven sobre puertos ALPC. Esta superficie está en gran parte indocumentada y es rica en vulnerabilidades históricas (EternalBlue, PrintSpooler, etc.).
Este toolkit cubre la Fase 1 de investigación: mapear, enumerar y sondear esa superficie antes de pasar a fuzzing y explotación.
| Herramienta | Función |
|---|---|
alpc-enum.exe |
Enumera todos los puertos ALPC y endpoints RPC del sistema |
rpc-scan.exe |
Escanea binarios PE para identificar interfaces RPC embebidas |
alpc-client.exe |
Cliente/servidor ALPC interactivo para probing y análisis de respuestas |
- Windows 10 / 11 (x86_64) — usar en VM de investigación
- Rust toolchain con target
x86_64-pc-windows-msvc - Visual Studio Build Tools (linker MSVC)
- Privilegios de administrador (para enumeration completa)
git clone https://github.com/Pig-Tail/alpc-toolkit.git
cd alpc-toolkit
cargo build --releaseBinarios en target\release\:
alpc-enum.exerpc-scan.exealpc-client.exe
Mapea todos los puertos ALPC visibles y los correlaciona con sus procesos propietarios.
# Enumeración completa (punto de partida recomendado)
.\alpc-enum.exe
# Solo \RPC Control\ (donde viven los endpoints RPC)
.\alpc-enum.exe --rpc-control
# Via tabla de handles del sistema (requiere admin + SeDebugPrivilege)
.\alpc-enum.exe --handlesQué buscar:
- Procesos SYSTEM con muchos handles ALPC → mayor superficie de ataque
- Puertos con nombres no estándar (no
LRPC-*,OLE*,DCOM*) → servicios custom - Puertos accesibles sin restricción → candidatos para probing
Escanea binarios PE (DLLs / EXEs) para identificar interfaces RPC embebidas. Incluye base de datos de interfaces conocidas con mapeo a MITRE ATT&CK.
# Escanear System32 (por imports)
.\rpc-scan.exe
# Escanear directorio custom — útil para EDRs, software de terceros
.\rpc-scan.exe --path "C:\Program Files\CrowdStrike"
.\rpc-scan.exe --path "C:\Program Files\SentinelOne"
# Deep scan — busca el GUID NDR Transfer Syntax en los binarios directamente
.\rpc-scan.exe --deep
# Mostrar base de datos de interfaces conocidas/abusables
.\rpc-scan.exe --knownQué buscar:
- DLLs que importan
RpcServerRegisterIfpero noRpcServerRegisterIf3→ sin security callback (versiones vulnerables) - UUIDs desconocidos en software de terceros → interfaces no auditadas
- Servidores RPC en
Program Files→ superficie de vendors
Conecta a puertos ALPC, envía mensajes y analiza atributos de respuesta (SECURITY, VIEW, CONTEXT).
# Conectar a un puerto específico
.\alpc-client.exe --port "\\RPC Control\\SomePort"
# Conectar con mensaje de conexión custom
.\alpc-client.exe --port "\\RPC Control\\SomePort" --msg "Hello"
# Probar TODOS los puertos accesibles del sistema
.\alpc-client.exe --probe-all
# Levantar un servidor ALPC de prueba (para entender el protocolo)
.\alpc-client.exe --server --name "TestResearchPort"Qué buscar:
- Respuestas con
SECURITYattribute → posible impersonation del cliente - Respuestas con
VIEWattribute → shared memory, posible heap spray si no liberan - Servidores SYSTEM que aceptan conexiones de cualquier usuario
- Respuestas con datos inesperados → lógica del servidor expuesta
alpc-toolkit/
├── Cargo.toml # Workspace root
├── crates/
│ ├── alpc-core/ # Librería compartida (tipos + FFI)
│ │ └── src/
│ │ ├── lib.rs # Módulo raíz
│ │ ├── types.rs # Estructuras ALPC undocumented (PORT_MESSAGE, etc.)
│ │ ├── ntdll.rs # FFI bindings a ntdll.dll (NtAlpc*)
│ │ ├── rpc.rs # Tipos RPC + BD de interfaces conocidas
│ │ └── helpers.rs # Utilidades: hexdump, privileges, process info
│ ├── alpc-enum/ # Herramienta de enumeración
│ ├── rpc-scan/ # Scanner de interfaces RPC
│ └── alpc-client/ # Cliente/servidor ALPC
NtAlpcCreatePort/NtAlpcConnectPortNtAlpcSendWaitReceivePort/NtAlpcAcceptConnectPortNtAlpcImpersonateClientOfPortNtQuerySystemInformation/NtQueryDirectoryObjectNtOpenDirectoryObject/NtOpenFile
.\alpc-enum.exe > surface_map.txt
.\rpc-scan.exe --deep > rpc_interfaces.txt
.\alpc-client.exe --probe-all > accessible_ports.txt# Terminal 1 — servidor
.\alpc-client.exe --server --name "Lab01"
# Terminal 2 — cliente
.\alpc-client.exe --port "\\RPC Control\\Lab01" --msg "Hello from client"Observa: tipo de mensaje, PID del cliente, atributos recibidos.
rpc-scan.exe --path "C:\Program Files"con EDR instalado en la VM- Identifica interfaces RPC en binarios del EDR
- Cruza con
alpc-enum.exe --handlespara ver qué puertos usa - Prueba conectar con
alpc-client.exe --port
# Kernel debugger
!object \RPC Control
!alpc /lpc <dirección_del_puerto>
!alpc /p <dirección_del_puerto>
# Breakpoint en creación de conexión ALPC
bp nt!AlpcpCreateClientPort
- Las estructuras ALPC son undocumented y pueden cambiar entre versiones de Windows.
OB_TYPE_INDEX_ALPC_PORT(usado en handle enumeration) varía por build. - El proyecto usa
windows-sys 0.59para los bindings Win32/WDK. - NDR Transfer Syntax GUID usado en deep scan:
8A885D04-1CEB-11C9-9FE8-08002B104860 - Referencias: Alex Ionescu, csandker, James Forshaw, ProcessHacker sources.
- RPC interface fuzzer
- ALPC message attribute manipulator
- Automated security callback detector
- Symlink race condition tester
Este toolkit está diseñado para investigación de seguridad en entornos controlados (VMs de lab). Nunca lo uses en sistemas de producción o sin autorización explícita.
MIT