
Análise detalhada da CVE-2021-41773, exploração de path traversal e RCE no Apache, com comandos passo a passo e análise da causa raiz a partir de um ambiente de laboratório do TryHackMe.
Writeup da sala "Modern Web Stacks" do TryHackMe, focado na exploração da CVE-2021-41773, uma vulnerabilidade de path traversal no Apache HTTP Server 2.4.49 que leva à execução remota de código quando mod_cgi está ativado.
| Item | Detalhe |
|---|
| Vulnerabilidade | CVE-2021-41773 — Path Traversal / RCE no Apache 2.4.49 |
| Serviço alvo | Servidor Apache HTTP na porta 8080 |
| Versão vulnerável | Apache/2.4.49 (Unix) |
| Causa raiz | Ordem de normalização quebrada em ap_normalize_path() |
| Impacto | Leitura arbitrária de arquivos → Execução Remota de Código via mod_cgi |
| Ferramentas usadas | curl |
O Apache 2.4.49 alterou a forma como ap_normalize_path() processa URLs. O Apache deve bloquear qualquer caminho de requisição contendo ../ antes de chegar ao sistema de arquivos — mas o filtro de traversal é executado antes da decodificação completa da URL.
Isso significa que uma requisição usando a sequência duplamente codificada .%2e/ não é reconhecida como ../ pelo filtro. No entanto, quando o Apache entrega o caminho ao SO, .%2e/ é resolvido para ../, e o filtro de traversal já foi contornado.
Sozinho, isso permite leitura arbitrária de arquivos fora da raiz web. O impacto torna-se crítico quando combinado com mod_cgi: se o caminho de traversal resolve para um executável como /bin/sh dentro de um diretório com CGI ativado (ex.: /cgi-bin/), o Apache o executa como um script CGI e passa o corpo da requisição HTTP POST para sua entrada padrão — resultando em execução remota de comandos.
Identificado o cabeçalho de resposta Server do alvo como:
Apache/2.4.49 (Unix)
Esta versão é diretamente afetada pela CVE-2021-41773.
/cgi-bin/Requisitou /cgi-bin/ e recebeu uma resposta 403 Forbidden (não 404), indicando que o diretório existe e mod_cgi provavelmente está ativado — uma pré-condição para RCE através desta CVE.
Usou curl com a flag --path-as-is para enviar a sequência de traversal codificada exatamente como digitada, sem que o curl a normalize no lado do cliente primeiro:
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
Por que --path-as-is é necessário: por padrão, o curl normaliza URLs e remove as sequências .%2e/ antes mesmo da requisição ser enviada. --path-as-is diz ao curl para enviar a URL exatamente como escrita, preservando a traversal codificada para que chegue intacta ao servidor.
O payload atravessou de /cgi-bin/ para o sistema de arquivos raiz, executou /bin/sh como um script CGI via corpo POST injetado, e retornou o conteúdo de /flag.txt.
Flag format confirmed: THM{...}
(Flag ocultada conforme as diretrizes do TryHackMe para writeups públicos.)
mod_cgi + path traversal = RCE. A leitura de arquivos sozinha já é ruim; combinada com um diretório executável CGI, torna-se execução de comandos.--path-as-is (ou uma ferramenta equivalente de requisição bruta) é essencial ao testar bypasses baseados em codificação.mod_cgi a menos que explicitamente necessário.Este writeup documenta um ambiente de laboratório (TryHackMe). Nenhum sistema não autorizado foi acessado.