Saltar al contenido principal

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​

MecanismoTipoAlcanceRendimientoCasos de uso
Pipes anónimosStreamLocalAltoPadre-hijo
Named PipesStreamRedAltoServicios, RPC
MailslotsDatagramRedMedioBroadcast
Shared MemoryDirectoLocalMuy altoAlto rendimiento
SocketsStream/DatagramRedVariableAplicaciones de red
COM/DCOMRPCLocal/RedMedioIntegración Windows
WMIConsultaLocal/RedBajoAdministració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:

  1. dir escribe su salida en el pipe
  2. findstr lee desde el pipe
  3. 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​

PipeServicio
\pipe\lsarpcLSA (Local Security Authority)
\pipe\samrSAM (Security Account Manager)
\pipe\netlogonServicio Netlogon
\pipe\srvsvcServicio de servidor
\pipe\wkssvcServicio de estación de trabajo
\pipe\spoolssPrint 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​

TipoProtocoloCaracterísticas
StreamTCPConexión fiable, ordenada
DatagramUDPSin conexión, rápido
RawIPAcceso de bajo nivel

Puertos comunes en Windows​

PuertoServicioRiesgo
80HTTPAtaques web
443HTTPSAtaques web
445SMBEternalBlue, movimiento lateral
3389RDPFuerza bruta, BlueKeep
5985WinRM HTTPEjecución remota
5986WinRM HTTPSEjecución remota
135RPCAtaques 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​

CriterioPipesNamed PipesShared MemorySocketsCOM/DCOMWMI
RedNoSíNoSíSíSí
RendimientoAltoAltoMuy altoVariableMedioBajo
SeguridadACLACLACLFirewallConfiguración DCOMEspacio de nombres WMI
ComplejidadBajaMediaAltaMediaAltaMedia
BidireccionalNoSíSíSíSíSí

Seguridad de los IPC​

Vectores de ataque comunes​

  1. Named Pipes:

    • Impersonation de tokens
    • Potato attacks (PrintSpoofer, JuicyPotato)
    • Comunicación C2 (Cobalt Strike)
  2. DCOM:

    • Movimiento lateral
    • Ejecución remota de código
  3. WMI:

    • Ejecución remota
    • Persistencia vía subscriptions
    • Reconocimiento
  4. 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​

  1. Liste todos los named pipes activos en su sistema
  2. Identifique qué proceso utiliza cada pipe
  3. Cree un servidor y cliente de pipe simple en PowerShell
  4. Pruebe la comunicación

Referencias​