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
| Mecanismo | Tipo | Alcance | Performance | Casos de uso |
|---|---|---|---|---|
| Pipes anônimos | Stream | Local | Alta | Pai-filho |
| Named Pipes | Stream | Rede | Alta | Serviços, RPC |
| Mailslots | Datagram | Rede | Média | Broadcast |
| Shared Memory | Direto | Local | Muito alta | Alta performance |
| Sockets | Stream/Datagram | Rede | Variável | Aplicações de rede |
| COM/DCOM | RPC | Local/Rede | Média | Integração Windows |
| WMI | Query | Local/Rede | Baixa | Administraçã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:
direscreve sua saída no pipefindstrlê do pipe- 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
| Pipe | Serviço |
|---|---|
\pipe\lsarpc | LSA (Local Security Authority) |
\pipe\samr | SAM (Security Account Manager) |
\pipe\netlogon | Serviço Netlogon |
\pipe\srvsvc | Serviço de servidor |
\pipe\wkssvc | Serviço de estação de trabalho |
\pipe\spoolss | Print 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
| Tipo | Protocolo | Características |
|---|---|---|
| Stream | TCP | Conexão confiável, ordenada |
| Datagram | UDP | Sem conexão, rápido |
| Raw | IP | Acesso de baixo nível |
Portas comuns no Windows
| Porta | Serviço | Risco |
|---|---|---|
| 80 | HTTP | Ataques web |
| 443 | HTTPS | Ataques web |
| 445 | SMB | EternalBlue, movimento lateral |
| 3389 | RDP | Brute force, BlueKeep |
| 5985 | WinRM HTTP | Execução remota |
| 5986 | WinRM HTTPS | Execução remota |
| 135 | RPC | Ataques 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ério | Pipes | Named Pipes | Shared Memory | Sockets | COM/DCOM | WMI |
|---|---|---|---|---|---|---|
| Rede | Não | Sim | Não | Sim | Sim | Sim |
| Performance | Alta | Alta | Muito alta | Variável | Média | Baixa |
| Segurança | ACL | ACL | ACL | Firewall | Configuração DCOM | Namespace WMI |
| Complexidade | Baixa | Média | Alta | Média | Alta | Média |
| Bidirecional | Não | Sim | Sim | Sim | Sim | Sim |
Segurança dos IPC
Vetores de ataque comuns
-
Named Pipes:
- Token impersonation
- Potato attacks (PrintSpoofer, JuicyPotato)
- Comunicação C2 (Cobalt Strike)
-
DCOM:
- Movimento lateral
- Execução remota de código
-
WMI:
- Execução remota
- Persistência via subscriptions
- Reconhecimento
-
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
- Liste todos os named pipes ativos no seu sistema
- Identifique qual processo utiliza cada pipe
- Crie um servidor e cliente de pipe simples em PowerShell
- Teste a comunicação