Lab 10.1: Named Pipes Windows
Objetivos de Aprendizagem
Ao final deste laboratório, você será capaz de:
- Compreender o mecanismo de named pipes no Windows
- Criar um servidor e cliente de pipe em PowerShell
- Enumerar os pipes existentes em um sistema
- Entender os riscos de impersonation via pipes
- Detectar ataques que utilizam pipes
Duração Estimada
45 minutos
Pré-requisitos
- VM Windows 10/11
- Conhecimentos básicos de PowerShell
- Permissões de administrador
Contexto Profissional
Os named pipes são utilizados por:
- Aplicações Windows para comunicação local
- Serviços para receber comandos
- Malwares para comunicação furtiva (Cobalt Strike, etc.)
- Técnicas de escalonamento de privilégio (Potato attacks)
Parte 1: Enumeração dos Named Pipes
Etapa 1.1: Listar os pipes ativos
PowerShell:
# Método 1: Get-ChildItem
Get-ChildItem \\.\pipe\ | Select-Object Name
# Método 2: .NET
[System.IO.Directory]::GetFiles("\\.\pipe\")
Perguntas:
- Quantos pipes estão ativos no seu sistema?
- Você reconhece alguns nomes de pipes?
Etapa 1.2: Identificar os pipes do sistema
Os seguintes pipes são normais no Windows:
| Pipe | Serviço |
|---|---|
| lsarpc | Local Security Authority |
| samr | Security Account Manager |
| netlogon | Autenticação de domínio |
| srvsvc | Serviço de servidor |
| wkssvc | Serviço de estação de trabalho |
| spoolss | Serviço de impressão |
Compare sua lista com esses pipes padrão.
Etapa 1.3: Usar PipeList (Sysinternals)
Se disponível:
pipelist.exe /accepteula
Perguntas: 3. O PipeList mostra mais informações que o PowerShell? 4. Você consegue ver qual processo está usando cada pipe?
Parte 2: Criação de um Servidor Pipe
Etapa 2.1: Entender o fluxo
[Servidor Pipe] [Cliente Pipe]
| |
|<-- 1. Cria o pipe --> |
| |
|<-- 2. Aguarda conexão |
| |
|<-- 3. Cliente conecta |
| |
|<-- 4. Troca de dados ->|
| |
|<-- 5. Fechamento |
Etapa 2.2: Script do servidor
Crie um arquivo serveur_pipe.ps1:
# Servidor de Named Pipe
$pipeName = "TestLabPipe"
Write-Host "=== SERVIDOR NAMED PIPE ===" -ForegroundColor Cyan
Write-Host "Criando pipe: \\.\pipe\$pipeName" -ForegroundColor Yellow
# Criar o pipe servidor
Add-Type -AssemblyName System.Core
$pipe = New-Object System.IO.Pipes.NamedPipeServerStream(
$pipeName,
[System.IO.Pipes.PipeDirection]::InOut
)
Write-Host "Aguardando conexão de um cliente..." -ForegroundColor Yellow
$pipe.WaitForConnection()
Write-Host "Cliente conectado!" -ForegroundColor Green
# Criar os fluxos de leitura/escrita
$reader = New-Object System.IO.StreamReader($pipe)
$writer = New-Object System.IO.StreamWriter($pipe)
$writer.AutoFlush = $true
# Loop de comunicação
Write-Host "Pronto para receber mensagens (digite 'exit' para sair)" -ForegroundColor Yellow
Write-Host ""
while ($true) {
# Ler a mensagem do cliente
$message = $reader.ReadLine()
if ($message -eq "exit" -or $message -eq $null) {
Write-Host "Fechando a conexão..." -ForegroundColor Red
break
}
Write-Host "Recebido: $message" -ForegroundColor White
# Enviar uma resposta
$response = "Echo: $message"
$writer.WriteLine($response)
Write-Host "Enviado: $response" -ForegroundColor Gray
}
# Limpeza
$reader.Close()
$writer.Close()
$pipe.Close()
Write-Host "Pipe fechado." -ForegroundColor Red
Etapa 2.3: Executar o servidor
.\serveur_pipe.ps1
O servidor agora está aguardando uma conexão.
Parte 3: Criação de um Cliente Pipe
Etapa 3.1: Script do cliente
Crie um arquivo client_pipe.ps1:
# Cliente de Named Pipe
$pipeName = "TestLabPipe"
$serverName = "." # Local
Write-Host "=== CLIENTE NAMED PIPE ===" -ForegroundColor Cyan
Write-Host "Conectando a: \\$serverName\pipe\$pipeName" -ForegroundColor Yellow
# Criar o pipe cliente
Add-Type -AssemblyName System.Core
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream(
$serverName,
$pipeName,
[System.IO.Pipes.PipeDirection]::InOut
)
try {
# Conectar com timeout de 5 segundos
$pipe.Connect(5000)
Write-Host "Conectado ao servidor!" -ForegroundColor Green
# Criar os fluxos
$reader = New-Object System.IO.StreamReader($pipe)
$writer = New-Object System.IO.StreamWriter($pipe)
$writer.AutoFlush = $true
# Loop de envio
Write-Host "Digite suas mensagens (digite 'exit' para sair):" -ForegroundColor Yellow
Write-Host ""
while ($true) {
$message = Read-Host ">"
if ($message -eq "exit") {
$writer.WriteLine("exit")
break
}
# Enviar a mensagem
$writer.WriteLine($message)
# Ler a resposta
$response = $reader.ReadLine()
Write-Host "Resposta: $response" -ForegroundColor Gray
}
# Limpeza
$reader.Close()
$writer.Close()
$pipe.Close()
} catch {
Write-Host "Erro: $_" -ForegroundColor Red
}
Write-Host "Conexão encerrada." -ForegroundColor Red
Etapa 3.2: Testar a comunicação
-
Terminal 1: Execute o servidor
.\serveur_pipe.ps1 -
Terminal 2: Execute o cliente
.\client_pipe.ps1 -
Envie mensagens a partir do cliente
Perguntas: 5. A comunicação está funcionando? 6. Verifique se o pipe aparece na lista enquanto está ativo
Parte 4: Análise de Segurança
Etapa 4.1: Permissões nos pipes
Por padrão, os pipes herdam as permissões do processo criador.
Verificar permissões (necessita accesschk do Sysinternals):
accesschk.exe -accepteula \\.\pipe\TestLabPipe
Etapa 4.2: Risco de Impersonation
Conceito: Um servidor pipe pode "impersonar" o cliente que se conecta, ou seja, usar seu token de segurança.
Por que isso é perigoso:
- Se um usuário privilegiado se conecta a um pipe malicioso
- O servidor pode roubar seu token
- E executar comandos com seus privilégios
Etapa 4.3: Demonstração de impersonation (somente leitura)
# Este código mostra como um servidor PODERIA impersonar um cliente
# NÃO UTILIZE EM PRODUÇÃO - APENAS PARA FINS EDUCATIVOS
# No servidor, após WaitForConnection():
# $pipe.RunAsClient({
# whoami # Mostraria a identidade do cliente
# })
Perguntas: 7. Por que o impersonation é perigoso? 8. Como um atacante poderia explorar isso?
Parte 5: Detecção e Defesa
Etapa 5.1: Detectar pipes suspeitos
# Script para detectar pipes incomuns
$knownPipes = @(
"lsarpc", "samr", "netlogon", "srvsvc", "wkssvc",
"spoolss", "browser", "eventlog", "ntsvcs"
)
$currentPipes = Get-ChildItem \\.\pipe\ | Select-Object -ExpandProperty Name
$suspiciousPipes = $currentPipes | Where-Object {
$pipe = $_
-not ($knownPipes | Where-Object { $pipe -like "*$_*" })
}
if ($suspiciousPipes) {
Write-Host "Pipes potencialmente suspeitos:" -ForegroundColor Yellow
$suspiciousPipes | ForEach-Object {
Write-Host " - $_" -ForegroundColor Red
}
} else {
Write-Host "Nenhum pipe suspeito detectado." -ForegroundColor Green
}
Etapa 5.2: Monitoramento com Sysmon
Se o Sysmon estiver instalado:
- Event ID 17: Pipe Created
- Event ID 18: Pipe Connected
# Ver eventos recentes de pipe
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
ID = 17, 18
} -MaxEvents 20 | Format-Table TimeCreated, Message -Wrap
Perguntas: 9. Seu pipe de teste foi registrado? 10. Quais informações o Sysmon captura?
Entregáveis
-
Capturas de tela:
- Lista dos pipes do seu sistema
- Servidor e cliente em comunicação
- Script de detecção executado
-
Respostas às 10 perguntas
-
Análise: (1 página)
- Explique como funcionam os named pipes
- Descreva os riscos de segurança associados
- Proponha medidas de detecção
Critérios de Avaliação
| Critério | Pontos |
|---|---|
| Enumeração dos pipes | 20% |
| Servidor/cliente funcionais | 30% |
| Análise de segurança | 25% |
| Script de detecção | 25% |
Comandos de Referência
# Enumeração
Get-ChildItem \\.\pipe\
[System.IO.Directory]::GetFiles("\\.\pipe\")
# Sysinternals
pipelist.exe /accepteula
accesschk.exe \\.\pipe\NomePipe
# Sysmon
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational';ID=17,18}
Solução de Problemas
O pipe não é criado
- Verifique se o nome é único
- Execute como administrador
O cliente não consegue se conectar
- Verifique se o servidor foi iniciado primeiro
- Verifique o nome do pipe (case sensitive)
- Verifique o firewall
Timeout de conexão
- O servidor deve estar aguardando ANTES do cliente tentar conectar
- Aumente o timeout se necessário
Lab desenvolvido no contexto do curso Sistemas Operacionais - MÓDULO 10