Ir al contenido

Oracle TNS

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

Una conexión Oracle no apunta simplemente a «la base de datos del puerto 1521». El cliente entrega un descriptor a Oracle Net Listener. El listener interpreta protocolo, dirección y CONNECT_DATA, y dirige la sesión hacia un gestor del servicio solicitado. Un mismo listener puede mediar varias instancias y servicios con estados diferentes.

Por eso los identificadores importan tanto como el puerto. SERVICE_NAME, SID, instancia y base de datos describen relaciones próximas, pero no intercambiables. Un error ORA-12514 puede confirmar el listener y rechazar el servicio. Otro descriptor puede alcanzar una base distinta en el mismo endpoint. La enumeración conserva el descriptor exacto antes de pasar a la identidad y a los privilegios SQL.

Los ejemplos usan TARGET_IP, FQDN, PORT, SERVICE_NAME, SID, USERNAME, SID_LIST y SERVICE_NAME_LIST como placeholders.

Nmap confirma el listener y su versión anunciada. ODAT compara respuestas para descubrir SID o service names y reúne módulos de comprobación. SQL*Plus es la referencia para validar un descriptor y consultar el contexto de una cuenta. lsnrctl y los archivos de Oracle Net solo están disponibles con acceso local, pero resuelven ambigüedades que el listener remoto no expone.

Pregunta Herramienta Validación
¿hay un listener Oracle? Nmap y ODAT tnscmd puerto y versión anunciada
¿qué destino acepta? ODAT sidguesser/snguesser conexión SQL con descriptor exacto
¿qué puede hacer la cuenta? SQL*Plus usuario, servicio, sesión, roles y grants
¿qué acceso a archivos existe? SQL y objetos DIRECTORY privilegios y ruta del servidor
¿qué ve el host local? lsnrctl, tnsnames.ora gestores, servicios y configuración efectiva

No ejecutes odat all como primera acción. Mezcla descubrimiento, autenticación, archivos y ejecución, y dificulta atribuir una respuesta a un módulo concreto.

El listener suele usar 1521/tcp, aunque puede escuchar en otras direcciones o puertos. Un descriptor contiene protocolo, host, puerto y CONNECT_DATA. Los clientes suelen identificar el destino mediante SERVICE_NAME. La sintaxis antigua puede usar SID.

Nmap -sV confirma el protocolo. oracle-tns-version solicita la versión anunciada por el listener:

Identificar el listener Oracle
nmap -sV -p 1521 --script oracle-tns-version TARGET_IP

La versión del listener no prueba que todas las instancias registradas tengan el mismo nivel de parche. Un listener puede servir a varias bases y también aceptar registro dinámico.

Los nombres pueden proceder de DNS, certificados, connection strings, tnsnames.ora, errores de aplicación o respuestas del listener. El script oracle-sid-brute prueba una lista de SID y evalúa las respuestas Oracle:

Probar candidatos de SID
nmap -p 1521 --script oracle-sid-brute TARGET_IP

El script genera un intento por candidato. Los errores del listener pueden variar por versión, rate limiting y configuración. Confirma el identificador con una conexión real y registra si funciona como SID, service name o ambos.

ODAT agrupa módulos para dialogar con el listener y descubrir SID o service names. En los ejemplos siguientes, -s fija el servidor y -p el puerto. tnscmd --version solicita la versión publicada. sidguesser y snguesser comparan las respuestas del listener para los candidatos de sus listas:

Consultar el listener y descubrir identificadores con ODAT
./odat.py tnscmd -s TARGET_IP -p PORT --version
./odat.py sidguesser -s TARGET_IP -p PORT --sids-file SID_LIST
./odat.py snguesser -s TARGET_IP -p PORT \
--service-name-file SERVICE_NAME_LIST

SID_LIST y SERVICE_NAME_LIST son archivos con un candidato por línea. Cada prueba abre conexiones y puede encontrar límites del listener, como ORA-12519 cuando no hay gestores disponibles. --sleep SECONDS introduce una pausa entre peticiones si se necesita distinguir saturación temporal de un identificador inválido.

El subcomando all combina descubrimiento, pruebas de credenciales y comprobaciones autenticadas. Se reserva para una fase en la que esas operaciones ya se entienden y su volumen encaja con la pregunta. Un resultado útil debe poder atribuirse al módulo y a la petición que lo produjo.

Easy Connect usa //host:port/service_name. La opción -L evita que SQL*Plus repita el prompt de credenciales después de un fallo:

Conectar a un service name
sqlplus -L 'USERNAME@//TARGET_IP:1521/SERVICE_NAME'

Al omitir la contraseña, SQL*Plus la solicita sin incluirla en el argumento. Una conexión automatizada puede usar Oracle Wallet y External Password Store en lugar de escribir el secreto en el comando. Para una cuenta administrativa, AS SYSDBA cambia el privilegio solicitado, no solo la etiqueta del usuario:

Solicitar una sesión SYSDBA
sqlplus -L 'USERNAME@//TARGET_IP:1521/SERVICE_NAME AS SYSDBA'

Las vistas disponibles dependen de privilegios. Empieza por identidad y servicio:

Registrar identidad e instancia
SELECT USER FROM dual;
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') FROM dual;
SELECT SYS_CONTEXT('USERENV', 'DB_NAME') FROM dual;
SELECT INSTANCE_NAME, HOST_NAME, VERSION FROM v$instance;

Si v$instance devuelve un error de privilegios, conserva ese resultado y continúa con vistas accesibles. No conviertas una vista denegada en una conclusión sobre la base completa.

Para enumerar schemas y tablas visibles:

Enumerar objetos visibles
SELECT username, account_status FROM all_users ORDER BY username;
SELECT owner, table_name FROM all_tables ORDER BY owner, table_name;

ALL_* muestra objetos accesibles por la cuenta. USER_* se limita al schema actual. DBA_* requiere privilegios más amplios. Al leer datos, aplica un límite:

Leer una muestra acotada
SELECT * FROM OWNER.TABLE_NAME FETCH FIRST 20 ROWS ONLY;

La sintaxis FETCH FIRST depende de la versión. En versiones antiguas puede usarse una condición sobre ROWNUM.

Enumerar roles y privilegios de la sesión
SELECT * FROM session_roles;
SELECT * FROM session_privs;

Los privilegios de sistema, privilegios sobre objetos y roles forman capas distintas. Los roles pueden estar deshabilitados dentro de stored procedures con definer rights. Registra el contexto donde se comprobó cada capacidad.

Oracle no entrega rutas arbitrarias directamente a UTL_FILE. Usa objetos DIRECTORY, que asocian un nombre lógico con una ruta del host. Si la cuenta puede verlos:

Enumerar objetos DIRECTORY visibles
SELECT directory_name, directory_path FROM all_directories;

Para leer o escribir hacen falta grants sobre el objeto y permisos del proceso Oracle. Una escritura mínima con UTL_FILE crea estado en el servidor:

Escribir un archivo mediante UTL_FILE
DECLARE
f UTL_FILE.FILE_TYPE;
BEGIN
f := UTL_FILE.FOPEN('DIRECTORY_NAME', 'marker.txt', 'w');
UTL_FILE.PUT_LINE(f, 'MARKER');
UTL_FILE.FCLOSE(f);
END;
/

Registra el objeto, la ruta real, el usuario del proceso y el resultado. Un bloque PL/SQL completado no demuestra por sí solo que otro servicio pueda acceder al archivo.

listener.ora define listeners estáticos y puntos de escucha. tnsnames.ora define alias de cliente. sqlnet.ora controla aspectos de resolución, autenticación y cifrado. Sus rutas dependen de ORACLE_HOME, TNS_ADMIN y la instalación.

Consultar el estado del listener local
lsnrctl status

El estado muestra puntos de escucha, servicios registrados y gestores. Compáralo con lo observable desde la red, porque las listas de control de acceso (ACL) y las direcciones de escucha pueden cambiar la vista externa.

oracle-tns-version identifica el listener. oracle-sid-brute, oracle-enum-users, oracle-brute y oracle-brute-stealth realizan descubrimiento o intentos repetidos y pueden producir resultados distintos según service name, SID, versión y política:

Identificar el listener
nmap -sV -n -Pn -p 1521 --script oracle-tns-version TARGET_IP

ODAT agrupa módulos de SID, credenciales, archivos, ejecución y configuración. No conviertas odat all en enumeración inicial. Registra módulo, descriptor de conexión, usuario, rol solicitado y petición. Valida nombres con lsnrctl status si existe acceso local o con una conexión SQL*Plus acotada.

Tras autenticar, conserva SYS_CONTEXT, container, service, instance, edition, roles y privilegios efectivos. Una cuenta puede leer una vista pero no la tabla subyacente, ejecutar un package con derechos del definidor o cambiar de container. Distingue privilegios de sistema, objeto y roles.

UTL_FILE, external tables, Java, scheduler, libraries, DB links y DIRECTORY objects conectan la base con filesystem, red u otras identidades. Cada camino requiere grants y configuración. Enumera primero objetos, propietarios, rutas y permisos. No ejecutes un job ni escribas una ruta para inferir capacidad.

ORA-12514, ORA-12505, ORA-01017 y un timeout describen fases distintas: resolución del servicio, SID, autenticación o transporte. Conserva el código y el descriptor. listener.log, Unified Auditing, el alert log y la telemetría del host pueden registrar conexiones y sentencias. Si una validación crea un objeto DIRECTORY, una tabla, un job o un fichero, documenta el estado previo, el propietario y la reversión, y verifica que el objeto y su efecto externo desaparecieron.

La página de herramientas y automatización separa listener, ODAT, SQL*Plus y NSE. Usa la checklist para cerrar contexto, roles y acceso al host. La cheatsheet conserva consultas ya explicadas.