Comunicación entre Procesos (IPC) Windows
Introducción
La comunicación entre procesos (IPC) permite que procesos distintos intercambien datos y se sincronicen. Es un concepto fundamental de los sistemas operativos modernos, esencial para comprender cómo las aplicaciones se comunican entre sí.
Por qué el IPC es importante
En un sistema operativo moderno:
- Las aplicaciones suelen estar compuestas por varios procesos
- Los servicios del sistema deben comunicarse entre sí
- Los clientes y servidores intercambian datos
- La seguridad depende del correcto aislamiento de los procesos
Mecanismos IPC Windows
Visión General
| Mecanismo | Tipo | Alcance | Rendimiento | Casos de uso |
|---|---|---|---|---|
| Pipes anónimos | Stream | Local | Alto | Padre-hijo |
| Named Pipes | Stream | Red | Alto | Servicios, RPC |
| Mailslots | Datagram | Red | Medio | Broadcast |
| Shared Memory | Directo | Local | Muy alto | Alto rendimiento |
| Sockets | Stream/Datagram | Red | Variable | Aplicaciones de red |
| COM/DCOM | RPC | Local/Red | Medio | Integración Windows |
| WMI | Consulta | Local/Red | Bajo | Administración |
Pipes Anónimos
Definición
Un pipe anónimo es un canal de comunicación unidireccional entre dos procesos relacionados (generalmente padre-hijo).
Características
- Comunicación unidireccional
- Sin nombre, por lo tanto no accesible por otros procesos
- Creado por el proceso padre
- Heredado por el proceso hijo
- Sin acceso de red
Ejemplo en línea de comandos
dir | findstr "txt"
El carácter | crea un pipe anónimo:
direscribe su salida en el pipefindstrlee desde el pipe- Los datos pasan de uno a otro
Uso en programación
// Pseudo-código simplificado
HANDLE hReadPipe, hWritePipe;
CreatePipe(&hReadPipe, &hWritePipe, NULL, 0);
// El padre escribe en hWritePipe
// El hijo lee desde hReadPipe
Named Pipes (Pipes Nombrados)
Definición
Un named pipe es un canal de comunicación bidireccional accesible por su nombre, que puede atravesar la red.
Características
- Comunicación bidireccional
- Accesible por nombre:
\\.\pipe\NombreDelPipe - Puede atravesar la red:
\\servidor\pipe\NombreDelPipe - Soporta ACL (Listas de Control de Acceso)
- Modo mensaje o byte stream
Formato del nombre
\\.\pipe\MiPipe (local)
\\servidor\pipe\MiPipe (remoto)
\\127.0.0.1\pipe\MiPipe (localhost)
Enumeración de pipes
PowerShell:
# Listar todos los pipes activos
Get-ChildItem \\.\pipe\
# Método alternativo
[System.IO.Directory]::GetFiles("\\.\pipe\")
Con PipeList (Sysinternals):
pipelist.exe /accepteula
Pipes comunes de Windows
| Pipe | Servicio |
|---|---|
\pipe\lsarpc | LSA (Local Security Authority) |
\pipe\samr | SAM (Security Account Manager) |
\pipe\netlogon | Servicio Netlogon |
\pipe\srvsvc | Servicio de servidor |
\pipe\wkssvc | Servicio de estación de trabajo |
\pipe\spoolss | Print Spooler |
Implicaciones de seguridad
Los named pipes se utilizan para:
- Comunicación con servicios de Windows
- Remote Procedure Calls (RPC)
- Impersonation de tokens (riesgo de seguridad)
- Técnicas de escalada de privilegios (Potato attacks)
Shared Memory (Memoria Compartida)
Definición
La memoria compartida permite que varios procesos accedan a la misma región de memoria física.
Características
- Acceso directo a la memoria (muy rápido)
- Requiere sincronización manual
- Solo local
- Implementado vía File Mapping en Windows
Creación en PowerShell
# Crear una zona de memoria compartida
Add-Type -TypeDefinition @"
using System;
using System.IO.MemoryMappedFiles;
public class SharedMem {
public static MemoryMappedFile Create(string name, long size) {
return MemoryMappedFile.CreateNew(name, size);
}
}
"@
$mmf = [SharedMem]::Create("MiCompartido", 1024)
Casos de uso
- Aplicaciones de alto rendimiento
- Compartir grandes volúmenes de datos
- Comunicación rápida entre procesos locales
Sockets
Definición
Los sockets permiten la comunicación de red entre procesos, localmente o en máquinas remotas.
Tipos de sockets
| Tipo | Protocolo | Características |
|---|---|---|
| Stream | TCP | Conexión fiable, ordenada |
| Datagram | UDP | Sin conexión, rápido |
| Raw | IP | Acceso de bajo nivel |
Puertos comunes en Windows
| Puerto | Servicio | Riesgo |
|---|---|---|
| 80 | HTTP | Ataques web |
| 443 | HTTPS | Ataques web |
| 445 | SMB | EternalBlue, movimiento lateral |
| 3389 | RDP | Fuerza bruta, BlueKeep |
| 5985 | WinRM HTTP | Ejecución remota |
| 5986 | WinRM HTTPS | Ejecución remota |
| 135 | RPC | Ataques DCOM |
Ejemplo de servidor TCP simple
# Servidor TCP básico
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Any, 8080)
$listener.Start()
Write-Host "Servidor escuchando en el puerto 8080..."
$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$reader = [System.IO.StreamReader]::new($stream)
$message = $reader.ReadLine()
Write-Host "Recibido: $message"
$client.Close()
$listener.Stop()
COM y DCOM
COM (Component Object Model)
COM es un framework de Microsoft para crear componentes de software reutilizables.
Características:
- Objetos accesibles vía interfaces
- Independiente del lenguaje de programación
- Utilizado por Office, Shell, Explorer
Ejemplo PowerShell:
# Crear un objeto COM Excel
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.Quit()
DCOM (Distributed COM)
DCOM extiende COM para permitir la comunicación a través de la red.
Riesgos de seguridad:
- Utilizado para el movimiento lateral en pentesting
- Técnicas: MMC20, ShellBrowserWindow, Excel DDE
- Puerto 135 (RPC) + puertos dinámicos
WMI (Windows Management Instrumentation)
Definición
WMI es la implementación de Microsoft de WBEM (Web-Based Enterprise Management), que permite gestionar e interrogar sistemas Windows.
Uso básico
# Información del sistema
Get-WmiObject Win32_OperatingSystem
# Procesos
Get-WmiObject Win32_Process | Select-Object Name, ProcessId
# Servicios
Get-WmiObject Win32_Service | Where-Object {$_.State -eq "Running"}
# A distancia
Get-WmiObject -ComputerName "ServidorRemoto" -Class Win32_OperatingSystem
WMI para administración remota
# Ejecutar un comando remotamente vía WMI
Invoke-WmiMethod -ComputerName "Objetivo" -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami > C:\result.txt"
Implicaciones de seguridad
WMI se utiliza para:
- Administración legítima remota
- Movimiento lateral (wmic /node:)
- Persistencia vía WMI Event Subscriptions
- Ejecución de código sin archivo en disco
Tabla Comparativa
| Criterio | Pipes | Named Pipes | Shared Memory | Sockets | COM/DCOM | WMI |
|---|---|---|---|---|---|---|
| Red | No | Sí | No | Sí | Sí | Sí |
| Rendimiento | Alto | Alto | Muy alto | Variable | Medio | Bajo |
| Seguridad | ACL | ACL | ACL | Firewall | Configuración DCOM | Espacio de nombres WMI |
| Complejidad | Baja | Media | Alta | Media | Alta | Media |
| Bidireccional | No | Sí | Sí | Sí | Sí | Sí |
Seguridad de los IPC
Vectores de ataque comunes
-
Named Pipes:
- Impersonation de tokens
- Potato attacks (PrintSpoofer, JuicyPotato)
- Comunicación C2 (Cobalt Strike)
-
DCOM:
- Movimiento lateral
- Ejecución remota de código
-
WMI:
- Ejecución remota
- Persistencia vía subscriptions
- Reconocimiento
-
Sockets:
- Reverse shells
- Backdoors
- Exfiltración
Detección
Eventos Sysmon:
- Event ID 17: Pipe creada
- Event ID 18: Pipe conectada
PowerShell:
# Detectar pipes sospechosos
Get-ChildItem \\.\pipe\ | Where-Object {
$_.Name -notmatch "^(lsarpc|samr|netlogon|srvsvc|wkssvc)"
}
Ejercicio Práctico
- Liste todos los named pipes activos en su sistema
- Identifique qué proceso utiliza cada pipe
- Cree un servidor y cliente de pipe simple en PowerShell
- Pruebe la comunicación