💣Tomcat CGI
Atacando a Tomcat CGI
CVE-2019-0232
es un problema de seguridad crítico que podría provocar la ejecución remota de código. Esta vulnerabilidad afecta a los sistemas Windows que tienen habilitada la función enableCmdLineArguments
. Un atacante puede aprovechar esta vulnerabilidad aprovechando un fallo de inyección de comandos resultante de un error de validación de entrada del servlet CGI de Tomcat, lo que le permite ejecutar comandos arbitrarios en el sistema afectado. Las versiones 9.0.0.M1
a 9.0.17
, 8.5.0
a 8.5.39
y 7.0.0
a 7.0.93
de Tomcat están afectadas.
El servlet CGI es un componente vital de Apache Tomcat que permite a los servidores web comunicarse con aplicaciones externas más allá de la JVM de Tomcat. Estas aplicaciones externas suelen ser scripts CGI escritos en lenguajes como Perl, Python o Bash. El servlet CGI recibe solicitudes de los navegadores web y las reenvía a scripts CGI para su procesamiento.
En esencia, un servlet CGI es un programa que se ejecuta en un servidor web, como Apache2, para respaldar la ejecución de aplicaciones externas que cumplen con la especificación CGI. Es un middleware entre servidores web y recursos de información externos, como bases de datos.
Los scripts CGI se utilizan en sitios web por varias razones, pero su uso también conlleva algunas desventajas bastante importantes:
Ventajas
Desventajas
Es simple y efectivo para generar contenido web dinámico.
Incurre en sobrecarga al tener que cargar programas en la memoria para cada solicitud.
Utilice cualquier lenguaje de programación que pueda leer desde la entrada estándar y escribir en la salida estándar.
No se pueden almacenar fácilmente datos en la memoria entre solicitudes de página.
Puede reutilizar el código existente y evitar escribir código nuevo.
Reduce el rendimiento del servidor y consume mucho tiempo de procesamiento.
La configuración enableCmdLineArguments
del servlet CGI de Apache Tomcat controla si los argumentos de la línea de comandos se crean a partir de la cadena de consulta. Si se establece en true, el servlet CGI analiza la cadena de consulta y la pasa al script CGI como argumentos. Esta característica puede hacer que los scripts CGI sean más flexibles y fáciles de escribir al permitir que se pasen parámetros al script sin usar variables de entorno o entrada estándar. Por ejemplo, un script CGI puede usar argumentos de línea de comandos para cambiar entre acciones según la entrada del usuario.
Supongamos que dispones de un script CGI que permite a los usuarios buscar libros en el catálogo de una librería. El script tiene dos acciones posibles: "buscar por título" y "buscar por autor".
El script CGI puede utilizar argumentos de línea de comandos para cambiar entre estas acciones. Por ejemplo, el script se puede llamar con la siguiente URL:
Aquí, el parámetro action
se establece en title
, lo que indica que el script debe buscar por título del libro. El parámetro query
especifica el término de búsqueda "El gran Gatsby".
Si el usuario desea buscar por autor, puede utilizar una URL similar:
Aquí, el parámetro action
se establece en author
, lo que indica que el script debe buscar por nombre de autor. El parámetro query
especifica el término de búsqueda "fitzgerald
".
Al utilizar argumentos de línea de comandos, el script CGI puede cambiar fácilmente entre diferentes acciones de búsqueda según la entrada del usuario. Esto hace que el script sea más flexible y fácil de usar.
Sin embargo, surge un problema cuando está habilitado enableCmdLineArguments
en sistemas Windows porque el servlet CGI no puede validar correctamente la entrada del navegador web antes de pasarla al script CGI. Esto puede provocar un ataque de inyección de comandos del sistema operativo, que permite a un atacante ejecutar comandos arbitrarios en el sistema de destino inyectándolos en otro comando.
Por ejemplo, un atacante puede agregar un comando dir
válido y &
como separador para ejecutar dir
en un sistema Windows y listar archivos del sistema. Si el atacante controla la entrada de un script CGI que utiliza este comando, puede inyectar sus propios comandos después de &
para ejecutar cualquier comando en el servidor. Un ejemplo de esto es:
Esto pasa &dir
como argumento a hello.bat
y se ejecuta dir
en el servidor. Como resultado, un atacante puede aprovechar el error de validación de entrada del servlet CGI para ejecutar cualquier comando en el servidor.
Enumeración
Escanee el objetivo con nmap
, lo que le ayudará a identificar los servicios activos que se encuentran en funcionamiento en el sistema. Este proceso proporcionará información valiosa sobre el objetivo, ya que descubrirá qué servicios y, posiblemente, qué versiones específicas se están ejecutando, lo que permitirá comprender mejor su infraestructura y sus posibles vulnerabilidades.
Nmap - Puertos abiertos
Aquí podemos ver que Nmap ha identificado Apache Tomcat/9.0.17
en el puerto 8080
.
Encontrar un script CGI
Una forma de descubrir el contenido del servidor web es utilizando la herramienta ffuf
de enumeración web junto con la lista de palabras dirb common.txt
. Sabiendo que el directorio predeterminado para los scripts CGI es /cgi
, ya sea por conocimiento previo o por investigación de la vulnerabilidad, podemos utilizar la URL http://10.129.204.227:8080/cgi/FUZZ.cmd
o http://10.129.204.227:8080/cgi/FUZZ.bat
para realizar pruebas de fuzzing.
Extensiones de fuzzing - .CMD
Dado que el sistema operativo es Windows, nuestro objetivo es buscar scripts por lotes. Aunque la búsqueda de scripts con una extensión .cmd no tiene éxito, descubrimos con éxito el archivo welcome.bat buscando archivos con una extensión .bat.
Extensiones de fuzzing - .BAT
Al navegar a la URL descubierta, http://10.129.204.227:8080/cgi/welcome.bat
se devuelve un mensaje:
Explotación
Como se mencionó anteriormente, podemos aprovechar esto CVE-2019-0232
agregando nuestros propios comandos mediante el uso del separador de comandos por lotes &
. Ahora tenemos una ruta de script CGI válida descubierta durante la enumeración en:
Al navegar a la URL anterior, se obtiene el resultado del comando dir
por lotes; sin embargo, al intentar ejecutar otras aplicaciones de línea de comandos de Windows comunes, como whoami
no se obtiene ningún resultado.
Recupere una lista de variables de entorno llamando al comando set
:
En la lista, podemos ver que la variable PATH
no se ha configurado, por lo que necesitaremos codificar las rutas en las solicitudes:
El intento no tuvo éxito y Tomcat respondió con un mensaje de error que indicaba que se había encontrado un carácter no válido. Apache Tomcat introdujo un parche que utiliza una expresión regular para evitar el uso de caracteres especiales. Sin embargo, el filtro se puede omitir codificando la URL de la carga útil.
Caso práctico
Después de ejecutar el comando 'whoami' codificado en URL, ¿bajo qué usuario se ejecuta Tomcat?
Última actualización