Pular para o conteúdo principal

Comunicação Entre Processos (IPC) Windows

Introdução​

A comunicação entre processos (IPC) permite que processos distintos troquem dados e se sincronizem. É um conceito fundamental dos sistemas operacionais modernos, essencial para entender como os aplicativos se comunicam entre si.

Por que o IPC é importante​

Em um sistema operacional moderno:

  • Os aplicativos geralmente são compostos por vários processos
  • Os serviços do sistema precisam se comunicar entre si
  • Clientes e servidores trocam dados
  • A segurança depende do correto isolamento dos processos

Mecanismos de IPC no Windows​

Visão Geral​

MecanismoTipoAlcancePerformanceCasos de uso
Pipes anônimosStreamLocalAltaPai-filho
Named PipesStreamRedeAltaServiços, RPC
MailslotsDatagramRedeMédiaBroadcast
Shared MemoryDiretoLocalMuito altaAlta performance
SocketsStream/DatagramRedeVariávelAplicações de rede
COM/DCOMRPCLocal/RedeMédiaIntegração Windows
WMIQueryLocal/RedeBaixaAdministração

Pipes Anônimos​

Definição​

Um pipe anônimo é um canal de comunicação unidirecional entre dois processos relacionados (geralmente pai-filho).

Características​

  • Comunicação unidirecional
  • Sem nome, portanto não acessível por outros processos
  • Criado pelo processo pai
  • Herdado pelo processo filho
  • Sem acesso à rede

Exemplo em linha de comando​

dir | findstr "txt"

O caractere | cria um pipe anônimo:

  1. dir escreve sua saída no pipe
  2. findstr lê do pipe
  3. Os dados passam de um para o outro

Utilização em programação​

// Pseudo-código simplificado
HANDLE hReadPipe, hWritePipe;
CreatePipe(&hReadPipe, &hWritePipe, NULL, 0);

// O pai escreve em hWritePipe
// O filho lê de hReadPipe

Named Pipes (Pipes Nomeados)​

Definição​

Um named pipe é um canal de comunicação bidirecional acessível por seu nome, podendo atravessar a rede.

Características​

  • Comunicação bidirecional
  • Acessível por nome: \\.\pipe\NomeDoPipe
  • Pode atravessar a rede: \\servidor\pipe\NomeDoPipe
  • Suporta ACLs (Access Control Lists)
  • Modo mensagem ou byte stream

Formato do nome​

\\.\pipe\MeuPipe           (local)
\\servidor\pipe\MeuPipe (remoto)
\\127.0.0.1\pipe\MeuPipe (localhost)

Enumeração de pipes​

PowerShell:

# Listar todos os pipes ativos
Get-ChildItem \\.\pipe\

# Método alternativo
[System.IO.Directory]::GetFiles("\\.\pipe\")

Com PipeList (Sysinternals):

pipelist.exe /accepteula

Pipes Windows comuns​

PipeServiço
\pipe\lsarpcLSA (Local Security Authority)
\pipe\samrSAM (Security Account Manager)
\pipe\netlogonServiço Netlogon
\pipe\srvsvcServiço de servidor
\pipe\wkssvcServiço de estação de trabalho
\pipe\spoolssPrint Spooler

Implicações de segurança​

Os named pipes são usados para:

  • Comunicação com serviços do Windows
  • Remote Procedure Calls (RPC)
  • Impersonation de tokens (risco de segurança)
  • Técnicas de escalonamento de privilégios (Potato attacks)

Shared Memory (Memória Compartilhada)​

Definição​

A memória compartilhada permite que vários processos acessem a mesma região de memória física.

Características​

  • Acesso direto à memória (muito rápido)
  • Necessita de sincronização manual
  • Somente local
  • Implementado via File Mapping no Windows

Criação em PowerShell​

# Criar uma área de memória compartilhada
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("MeuCompartilhamento", 1024)

Casos de uso​

  • Aplicações de alta performance
  • Compartilhamento de grandes volumes de dados
  • Comunicação rápida entre processos locais

Sockets​

Definição​

Sockets permitem a comunicação em rede entre processos, localmente ou em máquinas remotas.

Tipos de sockets​

TipoProtocoloCaracterísticas
StreamTCPConexão confiável, ordenada
DatagramUDPSem conexão, rápido
RawIPAcesso de baixo nível

Portas comuns no Windows​

PortaServiçoRisco
80HTTPAtaques web
443HTTPSAtaques web
445SMBEternalBlue, movimento lateral
3389RDPBrute force, BlueKeep
5985WinRM HTTPExecução remota
5986WinRM HTTPSExecução remota
135RPCAtaques DCOM

Exemplo de servidor TCP simples​

# Servidor TCP básico
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Any, 8080)
$listener.Start()
Write-Host "Servidor ouvindo na porta 8080..."

$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$reader = [System.IO.StreamReader]::new($stream)
$message = $reader.ReadLine()
Write-Host "Recebido: $message"

$client.Close()
$listener.Stop()

COM e DCOM​

COM (Component Object Model)​

COM é um framework da Microsoft para criar componentes de software reutilizáveis.

Características:

  • Objetos acessíveis via interfaces
  • Independente da linguagem de programação
  • Utilizado pelo Office, Shell, Explorer

Exemplo PowerShell:

# Criar um objeto COM Excel
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$excel.Quit()

DCOM (Distributed COM)​

DCOM estende o COM para permitir comunicação em rede.

Riscos de segurança:

  • Usado para movimento lateral em pentest
  • Técnicas: MMC20, ShellBrowserWindow, Excel DDE
  • Porta 135 (RPC) + portas dinâmicas

WMI (Windows Management Instrumentation)​

Definição​

WMI é a implementação Microsoft do WBEM (Web-Based Enterprise Management), permitindo gerenciar e consultar sistemas Windows.

Uso básico​

# Informações do sistema
Get-WmiObject Win32_OperatingSystem

# Processos
Get-WmiObject Win32_Process | Select-Object Name, ProcessId

# Serviços
Get-WmiObject Win32_Service | Where-Object {$_.State -eq "Running"}

# Remoto
Get-WmiObject -ComputerName "ServidorRemoto" -Class Win32_OperatingSystem

WMI para administração remota​

# Executar um comando remotamente via WMI
Invoke-WmiMethod -ComputerName "Alvo" -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami > C:\result.txt"

Implicações de segurança​

WMI é usado para:

  • Administração legítima remota
  • Movimento lateral (wmic /node:)
  • Persistência via WMI Event Subscriptions
  • Execução de código sem arquivo em disco

Tabela Comparativa​

CritérioPipesNamed PipesShared MemorySocketsCOM/DCOMWMI
RedeNãoSimNãoSimSimSim
PerformanceAltaAltaMuito altaVariávelMédiaBaixa
SegurançaACLACLACLFirewallConfiguração DCOMNamespace WMI
ComplexidadeBaixaMédiaAltaMédiaAltaMédia
BidirecionalNãoSimSimSimSimSim

Segurança dos IPC​

Vetores de ataque comuns​

  1. Named Pipes:

    • Token impersonation
    • Potato attacks (PrintSpoofer, JuicyPotato)
    • Comunicação C2 (Cobalt Strike)
  2. DCOM:

    • Movimento lateral
    • Execução remota de código
  3. WMI:

    • Execução remota
    • Persistência via subscriptions
    • Reconhecimento
  4. Sockets:

    • Reverse shells
    • Backdoors
    • Exfiltração

Detecção​

Eventos Sysmon:

  • Event ID 17: Pipe criado
  • Event ID 18: Pipe conectado

PowerShell:

# Detectar pipes suspeitos
Get-ChildItem \\.\pipe\ | Where-Object {
$_.Name -notmatch "^(lsarpc|samr|netlogon|srvsvc|wkssvc)"
}

Exercício Prático​

  1. Liste todos os named pipes ativos no seu sistema
  2. Identifique qual processo utiliza cada pipe
  3. Crie um servidor e cliente de pipe simples em PowerShell
  4. Teste a comunicação

Referências​