Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)

TEMARIO

Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos
Auditoría de contraseñas en Oracle Database (2 de 4). Adivinación de Oracle SID (System ID)
Auditoría de contraseñas en Oracle Database (3 de 4). Fuerza bruta sobre claves Oracle
Auditoría de contraseñas en Oracle Database (4 de 4). Ataques de diccionario sobre claves Oracle

Hola,

En la introducción que hicimos ayer vimos que para conectar a una instancia Oracle es necesario, antes de autenticarnos, alcanzar el Oracle Listener, y para eso hacen falta 3 datos:

  • La dirección de la máquina (hostname o IP)
  • El puerto donde Oracle Listener está a la escucha
  • El SID (System ID), o identificador del sistema

El listener es un proceso que corre en el lado del servidor que como su propio nombre indica, realiza escuchas a las peticiones de conexión con el objetivo de gestionar las conexiones entrantes. Cuando se hace una petición, esta llega al listener, el cual verifica que contiene los parámetros que han sido definidos en el servidor (mediante el fichero listener.ora). Si la verificación es positiva, se permite al cliente peticionario establecer conexión con el servidor, lo que posibilita que pueda a posteriori autenticarse con su usuario y contraseña.

Este fichero está normalmente ubicado en $ORACLE_HOME/network/admin, si tenemos una versión UNIX, o en ORACLE_HOME\network\admin si tenemos una versión Windows. En el caso de la versión Express Edition que estamos utilizando para nuestros ejemplos, este fichero reside por defecto en C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN junto a los ficheros de configuración sqlnet.ora y tnsnames.ora, comentado en el artículo anterior. Por defecto, el fichero listener.ora tiene los siguientes contenidos:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
(PROGRAM = extproc)
)
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\oraclexe\app\oracle\product\10.2.0\server)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
(ADDRESS = (PROTOCOL = TCP)(HOST = nimoy)(PORT = 1521))
)
)

DEFAULT_SERVICE_LISTENER = (XE)

Del fichero anterior se deduce que para la versión de Oracle Express que estamos utilizando, el SID principal es XE, que el host se llama nimoy (es local, puede ser invocado mediante 127.0.0.1) y que el puerto es 1521. Esta información casa a la perfección con las declaraciones que hay que hacer en tnsnames.ora documentadas en el artículo anterior. Estos son los tres datos que nos permitirán conectar al listener.

¿Es el SID un dato adivinable?

La respuesta es sí. Todo se basa en que si el SID es incorrecto cuando intentamos conectar se devuelve al cliente un mensaje ORA-12505: TNS:listener does not currently know of SID given in connect descriptor, lo que puede ser utilizado para determinar que pese a que la dirección y el puerto son correctos, el SID no lo es.

Esto hace extremadamente sencillo programar una utilidad que lance peticiones al listener empleando los SID más comunes, y que verifique si se devuelven mensajes del tipo ORA-12505, lo que permite dilucidar si la base de datos está empleado un SID por defecto o adivinable en cuestión de segundos. Ejemplos de adivinadores de SID son sidguess de Red Database Security, o SIDguesser de Patrik Karlsson. La diferencia fundamental entre ambas es que sidguess permite la adivinación del SID mediante ataque de diccionario y fuerza bruta, mientras que SIDguesser sólo emplea diccionario. Para esta última modalidad, tenéis publicada una lista de SIDs comunes en http://www.red-database-security.com/scripts/sid.txt.

Otras herramientas para la adivinación de SID son:

  • Inguma, de Joxean Koret, un excelente framework que incluye un módulo específico de adivinación de SID (CSidGuess.py). Ojo: Requiere los módulos Python cx_Oracle y readline
  • The Oracle Assessment Kit (OAK), de David Litchfield. Se puede descargar en http://www.vulnerabilityassessment.co.uk/oak.htm
  • oscanner, también de Patrick Karlsson, que además de enumeración SID realiza otras tareas de auditoría en la base de datos. Se puede descargar en http://www.cqure.net/wp/oscanner/
  • También es posible usar Metasploit para estos menesteres, a través del módulo sid_brute. Otros módulos están disponibles, como spy_sid, pero debe tenerse en cuenta que en las versiones 9.2.0.8 y superiores, el listener está protegido y hay que recurrir a la fuerza bruta o adivinación. En cualquier caso, la adivinación de SIDs puede ser obtenida mediante consultas directas al listener (sid_enum), aplicando fuerza bruta y/o diccionario (sid_brute), así como realizando consultas a otros componentes que puedan contener el SID (sid_enum+spy_sid)

Algunos ejemplos:

SIDguesser en la instalación por defecto de Oracle XE

Oracle SIDguesser

sidguess (diccionario) en la instalación por defecto de Oracle XE

Oracle sidguess

sidguess (fuerza bruta) en la instalación por defecto de Oracle XE

Oracle sidguess

OAK (ora-brutesid) en la instalación por defecto de Oracle XE

OAK

OAK (ora-getsid) en la instalación por defecto de Oracle XE

OAK

inguma (sidguess) en la instalación por defecto de Oracle XE

inguma

Metasploit (sid_brute) en la instalación por defecto de Oracle XE

Oracle Metasploit

Enumeración Metasploit (sid_enum) fallida por protección de listener

Oracle Metasploit

Y que nadie olvide una de las maneras más simples de obtener los SID: empleando Oracle listener control utility. Nótese que los comandos status y services de esta utilidad no pueden ser lanzados remotamente si la autenticación contra el sistema operativo está activa (LOCAL_OS_AUTHENTICATION), cosa que sucede por defecto en las versiones 10g R1 y superiores.

Listener Control

Listener Control

A la vista de lo explicado, el primer paso fundamental para proteger las contraseñas es proteger la base de datos. La regla número uno del buen DBA es siempre instalar instancias de Oracle cuyo SID no sea adivinable y cuyo contenido no sea revelable mediante ningún tipo de consulta, y a la vista está el porqué.

Un saludo,