
Herramienta de explotación de vulnerabilidades de deserialización en Java con generadores de payloads para múltiples marshallers (Jackson, XStream, SnakeYAML) e indirección de referencias JNDI para ejecución remota de código.
Si has llegado aquí por Log4Shell/CVE-2021-44228, quizás quieras leer sobre los vectores de explotación y las versiones afectadas del runtime de Java: https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
Han pasado más de dos años desde que Chris Frohoff y Garbriel Lawrence presentaron su investigación sobre vulnerabilidades de deserialización de objetos en Java, que finalmente resultó en lo que fácilmente puede describirse como la mayor ola de errores de ejecución remota de código en la historia de Java.
La investigación al respecto indicó que estas vulnerabilidades no son exclusivas de mecanismos tan expresivos como la serialización de Java o XStream, pero algunas podrían aplicarse también a otros mecanismos.
Este documento presenta un análisis, incluidos detalles de explotación, de varias librerías de marshalling de código abierto en Java que permiten (o permitían) el unmarshalling de tipos arbitrarios proporcionados por el atacante, y demuestra que sin importar cómo se realice este proceso ni qué restricciones implícitas existan, es propenso a técnicas de explotación similares.
El documento completo está en marshalsec.pdf
Toda la información y el código se proporcionan únicamente con fines educativos y/o para probar tus propios sistemas contra estas vulnerabilidades.
Se requiere Java 8. Compila usando maven mvn clean package -DskipTests. Ejecuta así:
java -cp target/marshalsec-[VERSION]-SNAPSHOT-all.jar marshalsec.<Marshaller> [-a] [-v] [-t] [<gadget_type> [<arguments...>]]
donde
Se incluyen generadores de payloads para los siguientes marshallers:
Sin requisitos previos.
Requisitos previos:
El servicio a cargar está actualmente fijado (hardcoded) a javax.script.ScriptEngineFactory.
Requisitos previos:
Requisitos previos:
java -cp target/marshalsec-[VERSION]-SNAPSHOT-all.jar marshalsec.jndi.(LDAP|RMI)RefServer <codebase>#<class> [<port>]
Hay un par de propiedades del sistema que controlan los argumentos al ejecutar las pruebas (a través de maven o al usar -a)
Las pruebas se ejecutan con un SecurityManager instalado que comprueba la ejecución de comandos del sistema, así como el código que se ejecuta desde bases de código remotas. Para que esto funcione, la clase cargada en uso debe activar alguna comprobación del security manager.
| Marshaller | Impacto del Gadget |
|---|
| BlazeDSAMF(0|3|X) | Solo JDK, escalada a serialización de Java RCEs de varias librerías de terceros |
| Hessian|Burlap | RCEs de varias librerías de terceros |
| Castor | RCE de librería dependiente |
| Jackson | posible RCE solo con JDK, varios RCEs de terceros |
| Java | otro RCE de terceros |
| JsonIO | RCE solo con JDK |
| JYAML | RCE solo con JDK |
| Kryo | RCEs de terceros |
| KryoAltStrategy | RCE solo con JDK |
| Red5AMF(0|3) | RCE solo con JDK |
| SnakeYAML | RCEs solo con JDK |
| XStream | RCEs solo con JDK |
| YAMLBeans | RCE de terceros |