
Shellshock
Shellshock
Descargue los archivos docker-compose.yml y poc.py. ¡Asegúrese de descargar la librería requests mediante pip install requests!!! Si usa uv, coloque la librería requests dentro de venv a través de uv!!!
| Descripción oficial de CVE |
|---|
| En versiones anteriores a GNU Bash 4.3, hubo un problema al manejar cadenas que siguen a la definición de una función en el valor de variables de entorno. Esta vulnerabilidad permitía a un atacante remoto ejecutar código arbitrario a través de un entorno manipulado. Esta vulnerabilidad se encontró en la función ForceCommand de OpenSSH sshd, en los módulos mod_cgi y mod_cgid del servidor Apache HTTP, en scripts ejecutados por clientes DHCP no especificados, y en varias situaciones donde los permisos de ejecución de Bash y el establecimiento de variables de entorno cruzan límites de privilegios diferentes. También se conoce como "ShellShock". Nota: La corrección inicial para este problema fue incorrecta, y se asignó CVE-2014-7169 para abordar esta vulnerabilidad que aún existía después de la corrección incorrecta. |

| Configuración del entorno |
|---|
Configuración del archivo Docker
| os | web server | bash version |
|---|---|---|
| Debian 10 | Apach | 4.2.37(1) |

Al ejecutar el comando docker compose up, se escribió un Dockerfile para mantener el servidor web abierto.
Como el OS, Apache, etc., del Dockerfile se descargaron de repositorios externos, se etiquetó la imagen construida y se subió a Docker Hub, y luego se especificó esa imagen en el archivo docker-compose.yml, para que no haya problemas aunque se elimine el original.

| Condiciones de vulnerabilidad |
|---|
Se necesita un shell Bash que tenga la vulnerabilidad Shellshock. Yo descargué y utilicé la versión 4.2.37(1) del shell bash.

Además, para que el código se ejecute después de registrarlo en una variable de entorno y luego llamar a bash, debe existir un programa que pueda invocar a bash. Descargué el programa CGI que se usaba en el servidor web para procesar las solicitudes del cliente. Según el estándar CGI (RFC 3875), el servidor web está diseñado para colocar toda la información de las cabeceras enviadas por el navegador en variables de entorno de Linux y procesarlas.
Bajo esta condición, el servidor web envía una solicitud y la información de la cabecera se almacena en variables de entorno (según el estándar CGI). El ataque se completa cuando CGI invoca al shell bash, que tiene la vulnerabilidad de ejecutar cadenas que siguen a la definición de una función en las variables de entorno.
Solicitud (enviar código incrustado en la cabecera User-Agent) -> CGI invoca a bash -> conexión de reverse shell
| Procedimiento de reproducción |
|---|

| Resultado |
|---|
La terminal que estaba escuchando en el paso 2 del procedimiento de reproducción se conecta al shell bash dentro del contenedor y se pueden ejecutar comandos como whoami, id, etc.

| Causa de la vulnerabilidad |
|---|
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
{
string_length = strlen (string);
temp_string = (char *)xmalloc (3 + string_length + char_index);
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
// 이하 생략
'''
La causa de la vulnerabilidad está en la función initialize_shell_variables dentro del código variables.c del shell bash. Esta función también es demasiado larga, por lo que solo mostramos la parte esencial.
'''
if (privmode == 0 && read_but_dont_execute == 0 && STREQN ("() {", string, 4))
'''
Ese if comprueba si los primeros 4 caracteres son '() {' mediante STREQN("() {", string, 4). Si coinciden, se trata como una función. Sorprendentemente, no hay ningún filtrado posterior en string, lo que causa el problema.
'''
strcpy (temp_string, name);
temp_string[char_index] = ' ';
strcpy (temp_string + char_index + 1, string);
''' El código anterior es el proceso de combinar el nombre y el valor. Dado que el valor verificado arriba, string comienza con '() {' y name es el nombre de la variable de entorno. Así, al combinar el nombre y el valor de la variable de entorno, se pasa al siguiente código para analizarlo. Como el filtro solo verifica '() {' al principio, cualquier comando como whoami, id, pwd añadido después de la función se ejecutará completamente.
'''
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);
'''
| Medidas de mitigación |
|---|
| Actualizar a una versión de Bash que sea segura contra la vulnerabilidad Shellshock. |
| No utilizar programas que invoquen al shell Bash. |