Pular para o conteúdo principal

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:

  1. Quantos pipes estão ativos no seu sistema?
  2. Você reconhece alguns nomes de pipes?

Etapa 1.2: Identificar os pipes do sistema​

Os seguintes pipes são normais no Windows:

PipeServiço
lsarpcLocal Security Authority
samrSecurity Account Manager
netlogonAutenticação de domínio
srvsvcServiço de servidor
wkssvcServiço de estação de trabalho
spoolssServiç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​

  1. Terminal 1: Execute o servidor

    .\serveur_pipe.ps1
  2. Terminal 2: Execute o cliente

    .\client_pipe.ps1
  3. 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​

  1. Capturas de tela:

    • Lista dos pipes do seu sistema
    • Servidor e cliente em comunicação
    • Script de detecção executado
  2. Respostas às 10 perguntas

  3. 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érioPontos
Enumeração dos pipes20%
Servidor/cliente funcionais30%
Análise de segurança25%
Script de detecção25%

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