ODAT
ODAT (Oracle Database Attacking Tool) est un outil de test d'intrusion open source qui teste la sécurité des bases de données Oracle à distance.
Exemples d'utilisation d'ODAT :
- Vous avez une base de données Oracle qui écoute à distance et souhaitez trouver des SID et identifiants valides pour vous connecter à la base de données.
- Vous disposez d'un compte Oracle valide sur une base de données et souhaitez augmenter vos privilèges pour devenir DBA ou SYSDBA.
- Vous avez un compte Oracle et souhaitez exécuter des commandes système (par exemple, reverse shell) afin de progresser sur le système d'exploitation hébergeant la base de données.
Testé sur Oracle Database 10g, 11g, 12c, 18c et 19c.
Version ODAT linux standalone disponible à https://github.com/quentinhardy/odat/releases/. Il est recommandé d'utiliser la version de développement (git clone), branche master-python3 (version python 3).
Journal des modifications
- Version 5.1.1 (27/04/2022) :
- affiche un message d'avertissement lorsqu'une erreur "ORA-12519 - TNS:no appropriate service handler found" se produit. Cette erreur peut être déclenchée par le serveur de base de données (listener) lorsque trop de connexions ont été établies (lors du bruteforce d'identifiants par exemple). Dans ce cas, l'option --sleep doit être utilisée (par exemple --sleep 0.2).
- Version 5.1 (12/03/2021) :
- nouvelle option dans le module all : --nmap-file pour charger toutes les bases de données Oracle depuis un fichier de sortie XML de nmap.
- nouvelle option dans le module all : -l pour charger toutes les cibles depuis un fichier texte (ip:port ou ip sur chaque ligne).
- Dans le module all, une connexion TCP est testée sur chaque cible avant de lancer les tests ODAT maintenant. --timeout-tcp-check permet de gérer la valeur du délai d'attente.
- Dans le module all, un test est maintenant effectué sur chaque cible pour vérifier si le listener TNS est bien configuré. Ce test est effectué après le test de connexion TCP.
- nouvelle option globale : --client-driver. Permet de définir le nom du client pour la connexion à la base de données (client_driver de V$SESSION_CONNECT_INFO). Utile pour les applications dont les utilisateurs finaux ne savent pas que cx_Oracle est utilisé. Par défaut, 'sql*plus' maintenant.
- ODAT accepte désormais un fichier sqlnet.ora. Un fichier par défaut se trouve dans conf/. Le délai d'attente TCP et OUTBOUND (connexion TNS) est maintenant fixé à 60 secondes par défaut.
- Version 5.0 (08/02/2021) :
- Nouveau module important : Service Name Guesser, pour rechercher des noms de service valides. Module spécifique nommé snguesser et intégré également dans le module all. Par défaut, le module all recherche désormais tous les noms de service valides après avoir recherché les SID. Les SID peuvent être identiques au nom de service. Lorsqu'un nom de service est trouvé mais pas de SID, le nom de service peut être utilisé comme SID pour la connexion.
- Option --basic-info dans le module search pour obtenir des informations techniques de base sur la base de données/instance. Elle récupère le nom de service, le SID, les bases de données, le statut d'Oracle Database Vault, le statut Java, le nom d'hôte, l'adresse IP du serveur, la politique de mot de passe, les privilèges système actuels, les rôles actuels, les correctifs (quand >= 12c et que l'utilisateur est privilégié), etc. Nécessite des privilèges élevés pour des informations très intéressantes (par exemple, politique de mot de passe et statut de verrouillage).
Fonctionnalités
Grâce à ODAT, vous pouvez :
- rechercher un SID valide sur un listener Oracle Database distant via :
- une attaque par dictionnaire
- une attaque par force brute
- l'ALIAS du listener
- rechercher des comptes Oracle en utilisant :
- une attaque par dictionnaire
- chaque utilisateur Oracle comme mot de passe (nécessite un compte avant d'utiliser cette attaque)
- exécuter des commandes système sur le serveur de base de données en utilisant :
- DBMS_SCHEDULER
- JAVA
- des tables externes
- oradbg
- télécharger des fichiers stockés sur le serveur de base de données en utilisant :
- UTL_FILE
- DBMS_XSLPROCESSOR
- des tables externes
- CTXSYS
- DBMS_LOB
- téléverser des fichiers sur le serveur de base de données en utilisant :
- UTL_FILE
- DBMS_XSLPROCESSOR
- DBMS_ADVISOR
- supprimer des fichiers en utilisant :
- obtenir un accès privilégié en utilisant les combinaisons de privilèges système suivantes (voir l'aide pour les commandes du module privesc) :
- CREATE ANY PROCEDURE
- CREATE PROCEDURE et EXECUTE ANY PROCEDURE
- CREATE ANY TRIGGER (et CREATE PROCEDURE)
- ANALYZE ANY (et CREATE PROCEDURE)
- CREATE ANY INDEX (et CREATE PROCEDURE)
- envoyer/recevoir des requêtes HTTP depuis le serveur de base de données en utilisant :
- scanner les ports du serveur local ou d'un serveur distant en utilisant :
- UTL_HTTP
- HttpUriType
- UTL_TCP
- capturer une authentification SMB via :
- un index pour déclencher une connexion SMB
- exploiter certaines CVE :
- le CVE-2012-3137
- récupérer la clé de session et le sel pour des utilisateurs arbitraires
- attaque par dictionnaire sur les sessions
- le : Un utilisateur authentifié peut modifier toutes les tables qu'il peut sélectionner même s'il ne peut normalement pas les modifier (pas de privilège ALTER).
Cette liste n'est pas exhaustive.
Carte mentale - ODAT & tests d'intrusion Oracle Database

ODAT est compatible uniquement avec Linux.
Une version standalone existe pour ne pas avoir besoin d'installer les dépendances (voir https://github.com/quentinhardy/odat/releases/).
L'ODAT standalone a été généré grâce à pyinstaller.
Si vous souhaitez installer la version de développement sur votre ordinateur, les outils et dépendances suivants sont nécessaires :
- Langage : Python 3
- Dépendances Oracle :
- Instant Oracle basic
- Instant Oracle sdk
- Bibliothèques Python :
- cx_Oracle
- passlib
- pycrypto
- python-scapy
- python-libnmap (nouveau depuis python 5.1)
- colorlog (recommandé)
- termcolor (recommandé)
- argcomplete (recommandé)
- pyinstaller (recommandé)
Installation (optionnelle, pour la version de développement)
Cette partie décrit comment installer instantclient, CX_Oracle et certaines autres bibliothèques Python sur Ubuntu afin d'avoir la version de développement d'ODAT.
N'oubliez pas qu'une version standalone d'ODAT existe à https://github.com/quentinhardy/odat/releases/ : Il n'est pas nécessaire d'installer quoi que ce soit pour utiliser la version standalone
- Clonez le dépôt pour obtenir le code source d'ODAT :
git clone https://github.com/quentinhardy/odat.git
- Mettez à jour les pages wiki dans ce dépôt pour obtenir la documentation ODAT localement :
cd odat/
git submodule init
git submodule update
-
Obtenez instant client basic, sdk (développement) et sqlplus depuis le site web Oracle :
-
Pour le moment (03/2021), la version 11.2 d'instant client Oracle Database est la meilleure version si vous souhaitez générer l'ODAT standalone avec pyinstaller.
Pour utiliser la version de développement d'ODAT, la dernière version du client Oracle peut être utilisée (par exemple version 19).
-
Installez les paquets python3-dev, alien et libaio1 (pour sqlplus) :
sudo apt-get install libaio1 python3-dev alien python3-pip
- Générez des fichiers DEB à partir des fichiers RPM avec :
sudo alien --to-deb oracle-instantclient19.3-basic-???.x???.rpm
sudo alien --to-deb oracle-instantclient19.3-devel-???.x???.rpm
- Installez instant client basic, sdk et sqlplus :
sudo dpkg -i oracle-instantclient19.3-basic-???.x???.deb
sudo dpkg -i oracle-instantclient19.3-devel_???_???.deb
- Ajoutez ces lignes dans votre fichier /etc/profile pour définir les variables d'environnement Oracle :
export ORACLE_HOME=/usr/lib/oracle/19.3/client64/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
export PATH=${ORACLE_HOME}bin:$PATH
/usr/lib/oracle/19.3/client64/lib/
- Mettez à jour le chemin ld en utilisant :
sudo -s
source /etc/profile
pip3 install cx_Oracle
python3 -c 'import cx_Oracle'
Cette commande devrait simplement retourner sans erreurs.
- Installez certaines bibliothèques Python :
sudo apt-get install python3-scapy
sudo pip3 install colorlog termcolor pycrypto passlib python-libnmap
sudo pip3 install argcomplete && sudo activate-global-python-argcomplete
Bon travail si vous n'avez pas d'erreurs :)
Documentation et exemples
La documentation et les exemples se trouvent sur le WIKI
Donation
Si vous souhaitez soutenir mon travail en faisant un don, je l'apprécierai grandement :
- Via BTC : 36FugL6SnFrFfbVXRPcJATK9GsXEY6mJbf