DEEP DIVE · PROJECT

SOC Home Lab

Como eu construí um SOC funcional em VMs Proxmox para praticar detection engineering em ambientes AD. Do problema à implementação, com regras Sigma reais e o que não funcionou.

// ~6 meses de iteração // Proxmox · 8 VMs · 32 GB RAM // research environment only // última atualização 2026-05-07

Problema

Threat hunting em AD requer prática em um ambiente onde você controla tanto o atacante quanto o defensor. Labs comerciais são caros e engessados; screenshots de blog post são superficiais.

Eu queria um ambiente onde pudesse: rodar um Kerberoast real, ver o Event 4769 chegar no Wazuh, escrever a regra Sigma, validar contra falso-positivo, e medir o MTTD de ponta a ponta. Tudo isolado da minha rede doméstica, zero custo recorrente, e — crítico — zero dependência de dados de cliente. Tudo sintético, tudo fictício, tudo RFC5737.

Você não aprende detection engineering lendo blog posts. Aprende fazendo a detecção falhar três vezes e descobrindo por quê.

Arquitetura

Um host Proxmox hospeda 8 VMs: um domínio AD completo (DC + workstations), firewall pfSense com Suricata, Wazuh manager + OpenSearch, e uma VM Kali para simular o atacante. Todo o tráfego passa pelo pfSense para garantir visibilidade de rede.

Kali (attacker) 192.0.2.10 pfSense + Suricata IDS // AD zone — 198.51.100.0/24 DC01-LAB DC02-LAB WKSTN-01..04 Sysmon + WEF Wazuh manager OpenSearch Sigma rules (git) Dashboards · Hunts 203.0.113.5 (read-only)

// IPs RFC5737 · hostnames fictícios · zero referência a infraestrutura real

Implementação

Stack escolhida por custo zero e extensibilidade — cada componente pode ser substituído pelo equivalente corporativo sem reescrever as regras.

HypervisorProxmox VE 8
Domain ControllersWindows Server 2022
WorkstationsWindows 11 Pro
Firewall · IDSpfSense + Suricata
SIEM · managerWazuh 4.7
Search · storageOpenSearch 2.11
Endpoint telemetrySysmon + WEF
Attacker toolkitKali · Impacket · Rubeus

Regras Sigma vivem em um repositório Git público. CI converte YAML Sigma → regras Wazuh via sigma-cli. Cada PR roda testes de unidade contra logs sintéticos antes de mergear.

Detecções

Cinco detecções notáveis implementadas no lab. Cada uma nasceu reproduzindo um ataque real com ferramentas públicas, capturando os eventos crus, e escrevendo a regra do zero.

T1558.003 — Kerberoastingseverity: high
# TGS request with RC4 encryption for a service account
title: Suspicious TGS Request (Kerberoasting)
id: a7f4b8c1-9d2e-4c9f-8a1b-3e5d7f9a2c4d
status: stable
logsource:
  product: windows
  service: security
detection:
  selection:
    EventID: 4769
    TicketEncryption: '0x17'
    ServiceName|endswith: '$'
  condition: selection
level: high
tags: [attack.credential_access, attack.t1558.003]
T1003.006 — DCSyncseverity: critical
# Directory replication rights used from non-DC host
title: DCSync via Replication Rights
logsource: { product: windows, service: security }
detection:
  selection:
    EventID: 4662
    Properties|contains:
      - '1131f6aa-9c07-11d1-f79f-00c04fc2dcd2'  # DS-Replication-Get-Changes
      - '1131f6ad-9c07-11d1-f79f-00c04fc2dcd2'  # DS-Replication-Get-Changes-All
  filter_dc:
    SubjectUserName|endswith: '$'
  condition: selection and not filter_dc
level: critical
tags: [attack.credential_access, attack.t1003.006]
T1558.004 — AS-REP Roastingseverity: high

Usuários com "Do not require preauth" habilitado. Detecção via Event 4768 sem PreAuth type.

T1059.001 — PS encodedseverity: medium

PowerShell -EncodedCommand com base64 longo. Sysmon Event 1, alta entropia no commandline.

T1110.001 — SSH bruteseverity: medium

pfSense logs: ≥20 falhas SSH em 60s do mesmo IP. Resposta automática: bloqueio via pfBlockerNG.

sigma-cli → Wazuhpipeline

CI converte YAML Sigma em local_rules.xml do Wazuh. PR → test → merge → deploy via Ansible.

Métricas

Números do lab nos últimos 30 dias. Ambiente de research — não comparáveis a um SOC corporativo (volume, variedade de endpoints, e skill do atacante são todos limitados).

Sigma rules

52
+4 this month

Events/day

340K
rolling 7d

MTTD

6m 48s
−22% vs baseline

TTPs covered

37
MITRE ATT&CK

False positive rate

3.2%
rolling 30d

Hunts executed

18
playbook-driven

Rules tested

100%
pre-merge CI

Uptime

99.4%
manager + search

Lições aprendidas

O que funcionou — e o que não funcionou. Honesto.

  • Funcionou: versionar regras Sigma em Git com CI. Regra sem teste é regra que vira falso positivo em produção.
  • Funcionou: separar zona de ataque em VLAN isolada no pfSense. Evita que Rubeus escape para a rede doméstica.
  • Não funcionou (v1): tentar replicar telemetria de endpoint sem Sysmon. Event log nativo do Windows é insuficiente — Sysmon é negociável apenas em ambientes com EDR pago.
  • Não funcionou (v1): Wazuh agent em modo "full events" — OpenSearch quebrou a ingestão em >500k eventos/dia. Solução: filtering na origem via Wazuh ruleset.
  • Aprendizado: detection engineering é 20% escrever regra, 80% triagem de FP. Meu primeiro Kerberoast rule quebrou em qualquer backup do AD — filtro de máquinas de backup resolveu.
  • Aprendizado: escrever a regra depois de rodar o ataque, não antes. A documentação do ATT&CK é ponto de partida, não ponto de chegada.