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,

Auditoría de contraseñas en Oracle Database (1 de 4). Introducción y primeros pasos

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

Buenas,

He recibido durante los últimos meses alguna que otra petición para que hablara de la auditoría de productos Oracle. Me es imposible escribir entradas para cada uno de los productos de esta compañía, porque además de ser muy numerosos y complejos, algunos son sólo de aplicación en entornos muy determinados, con lo que el ejercicio sólo tendría interés para unos pocos. Hablamos de los productos y servicios tan variopintos como la gama on demand, Fusion middleware, Portal, Data mining, OLAP y dentro del mundo de aplicaciones podríamos citar la gestión centralizada de datos (MDM), sectoriales para banca, finanzas, capital humano, JD Edwards, Peoplesoft, Siebel … la lista es demasiado larga para escribirla completa.

Sin embargo, me vienen a la mente dos productos que quizás si gocen de más popularidad. En la mayoría de corporaciones son los dos entry-level products por excelencia, y es relativamente frecuente toparse con ellos. Se trata de Oracle E-Business Suite y cómo no, de Oracle Database, la base de datos. Podríamos escribir muchísimo sobre ambos, ya que son productos extremadamente extensos y complejos, pero en esta serie de artículos sólo nos vamos a centrar en uno de los productos y en una única faceta de auditoría del mismo: contraseñas en Oracle Database.

Gama de Oracle Database

Oracle Database tiene hoy en día 4 ediciones principales, con un importante nímero de versiones en cada una:

  • Express Edition
  • Standard Edition One
  • Standard Edition
  • Enterprise Edition

Todas funcionan en Linux y Windows, si bien la versión básica no puede correr en Unix ni en 64 bits. No sabría deciros qué predomina en el mercado, ya que este es un caso donde el mero hecho de correr en un derivado Unix no garantiza mejor rendimiento. Las versiones Windows tienen una tremenda popularidad, ya que en práctica igualdad de rendimiento en lo que al motor se refiere, tienen una gran ventaja sobre los derivados Unix: Un sistema operativo Windows es, por lo general, más fácil de instalar, usar y mantener, con lo que también es más fácil (y económico) contratar a personal con nociones suficientes para el mundo Microsoft. Por otro lado, también tienen una estructura de licencias completamente distinta y potencialmente menos beneficiosa, con lo que tampoco son siempre la opción a implementar.

Las diferencias entre el producto gratuito (Express Edition) y el destinado a corporaciones (Enterprise Edition) son más que apreciables. Sinceramente he visto de todo, aunque probablemente he visto con un poco más de asiduidad Enterprise Edition corriendo en Linux o Unix. La mayor incidencia sobre el rendimiento la determinan siempre la configuración y la presencia de productos de optimización, y no el sistema operativo sobre el que corren los productos.

Para todo aquel que quiera practicar lo que aquí explicaremos recomiendo la descarga e instalación de la Oracle Database 10g Express Edition, que es gratuita y relativamente sencilla de instalar. Asumiendo que la mayoría de auditores se sienten más cómodos en Windows, emplearemos una instalación para Windows, aunque aquellos que se sientan mejor con Linux pueden optar por este formato. En esencia lo que vamos a ver es independiente (con sus matices, claro) de la plataforma. Recomiendo la instalación de estos dos productos:

  • Oracle Database 10g Express Edition (el motor de base de datos)
  • Oracle Database 10g Express Client (el software cliente)

Recomiendo a todos los que quieran instalarse estos productos que lean muy detenidamente la documentación. Todo está en la documentación, e insisto que pese a ser la versión más pequeña y simple de Oracle, la puesta en marcha y mantenimiento de la misma no es trivial.

Conectar a Oracle Database

Aunque es posible realizar pentesting en caja negra, siempre es recomendable auditar las contraseñas en caja blanca o gris, ya que el hecho de que no podamos hacer intrusión no implica que las calidades de las claves sean las mejores. En algín momento necesitaremos conectar con la base de datos para ver si podemos hacernos con los hashes de las claves, o directamente para descargarlos y ser analizados. ¿Cómo conectar con Oracle?

  • SQL*Plus. Es el producto oficial de Oracle para la línea de mandatos. Para mí, salvo que se vaya a hacer desarrollo, es el más aconsejable.
  • Oracle SQL Developer. Es un producto oficial de Oracle, adecuado para desarrolladores, ya que tiene interfaz gráfico y ayudas a la productividad.
  • Otros productos comerciales. Casi todos están enfocados al desarrollo y a la utilización gráfica. Posiblemente, PL/SQL Developer sea el más conocido, aunque no es el único.

Mi primera conexión local a Oracle

Una vez instalado podremos conectar vía Application Express (Apex) o vía línea de comandos. Apex está disponible por defecto tras la instalación en http://127.0.0.1:8080/apex/.

En el caso de la edición XE que hemos recomendado, los binarios de SQL*Plus se instalan junto a la base de datos. Suponiendo que estás en Windows:

oracle audit

Durante el proceso de instalación habrás creado contraseñas (es la misma) para las cuentas SYS y SYSTEM. Para probar si todo ha ido bien, así como para hacer ajustes de configuración, trata de conectar mediante la cuenta SYSTEM:

oracle audit

Nótese que SYSTEM es el usuario con el que conectamos, password es la clave de dicho usuario y localhost es la dirección del servidor de Oracle Database.

Conexiones en remoto

Aunque también se puede emplear SQL*Plus, es preciso contar con la definición del listener Oracle para poder hacer la conexión. Esta definición se introduce en el fichero tnsnames.ora, cuyo estándar es el siguiente:

addressname =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(Host = hostname)(Port = port))
)
(CONNECT_DATA =
(SERVICE_NAME = SID)
)
)

Como podéis ver, para conectarse a una base de datos Oracle hacen falta 3 datos: la dirección del servidor, el puerto en el cual el listener está a la escucha y por íltimo el SID (System ID) o identificador de sistema. Veremos más adelante que el SID puede ser adivinado en remoto, y como más de uno podrá imaginar, a veces nos dejanos este fichero abierto al mundo (http://www.google.com/search?&q=%22tnsnames%22+filetype%3Aora, la versión Bing disponible aquí por cortesía de Chema)

Si has instalado Oracle en una máquina virtual o en un servidor, utiliza la documentación para configurar tu fichero tnsnames.ora. Ten presente que SQL*Plus lo va a buscar en determinadas ubicaciones, con lo que si no usas las que recomienda el fabricante (ver documentación) tendrás que crear variables de enterno (ver documentación). Por defecto, XE coloca el fichero en la ruta C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN, siendo sus contenidos los siguientes:

XE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = nimoy)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)

A la vista de lo anterior, ya sabéis que mi host se llama nimoy, que mi SID es XE y que el listener admite peticiones en el puerto 1521, que es el puerto por defecto.

Próxima lección

En la próxima lección veremos cómo se audita si el nombre escogido como identificador de sistema (SID), necesario para poder conectar a instancias Oracle, puede ser adivinado remotamente. Esto, como veremos, juega un papel importante en la seguridad de la instalación.

Un saludo,