1 cis1010sd03 estado del arte de la aplicación de técnicas

CIS1010SD03
ESTADO DEL ARTE DE LA APLICACIÓN DE TÉCNICAS ANTIFORENSES EN BASES DE
DATOS ORACLE. CONCEPTOS Y RETOS PARA LOS INFORMÁTICOS FORENSES
Autores:
GUILLERMO ALFONSO FERRO RODRIGUEZ
PEDRO ALEJANDRO SANTIESTEBAN
http://pegasus.javeriana.edu.co/~CIS1010SD03/
PONTIFICIA UNIVERSIDAD JAVERIANA
FACULTAD DE INGENIERÍA
CARRERA DE INGENIERÍA DE SISTEMAS
BOGOTÁ D.C.
1
ESTADO DEL ARTE DE LA APLICACIÓN DE TÉCNICAS ANTIFORENSES EN BASES DE
DATOS ORACLE. CONCEPTOS Y RETOS PARA LOS INFORMÁTICOS FORENSES
Autores:
GUILLERMO ALFONSO FERRO RODRIGUEZ
PEDRO ALEJANDRO SANTIESTEBAN
Trabajo de grado presentado para optar el título de Ingeniero de Sistemas
Director:
Ingeniero Jeimy José Cano Martínez, PhD
PONTIFICIA UNIVERSIDAD JAVERIANA
FACULTAD DE INGENIERÍA
CARRERA DE INGENIERÍA DE SISTEMAS
BOGOTÁ D.C.
2
PONTIFICIA UNIVERSIDAD JAVERIANA
FACULTAD DE INGENIERÍA
CARRERA DE INGENIERÍA DE SISTEMAS
Rector Magnífico
Padre Joaquín Emilio Sánchez García S.J.
Decano Académico Facultad de Ingeniería
Ingeniero Francisco Javier Rebolledo Muñoz
Decano del Medio Universitario Facultad de Ingeniería
Padre Sergio Bernal Restrepo S.J.
Director Carrera de Ingeniería de Sistemas
Ingeniero Luis Carlos Díaz Chaparro
Director Departamento de Ingeniería de Sistemas
César Julio Bustacara Medina
3
Nota de Aceptación
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
Jeimy José Cano Martínez
Director del Proyecto
________________________________________
José Luis Lara
________________________________________
Julio Carreño
4
Artículo 23 de la Resolución No. 1 de Junio de 1946
“La Universidad no se hace responsable de los conceptos emitidos por sus alumnos en sus proyectos de
grado. Sólo velará porque no se publique nada contrario al dogma y la moral católica y porque no
contengan ataques o polémicas puramente personales. Antes bien, que se vean en ellos el anhelo de buscar
la verdad y la Justicia”
5
CONTENIDO
TABLA DE ILUSTRACIONES ......................................................................................................... 9
RESUMEN EJECUTIVO ................................................................................................................. 12
1
DESCRIPCIÓN GENERAL DEL TRABAJO DE GRADO ................................................ 14
1.1
Formulación .................................................................................................................................14
1.2
Justificación..................................................................................................................................15
1.3
Objetivo general ...........................................................................................................................17
1.4
Objetivos específicos....................................................................................................................18
2
REVISIÓN DE LITERATURA............................................................................................ 19
2.1
Administración Bases de datos ....................................................................................................19
2.1.1
2.2
Estado Actual .......................................................................................................................19
Bases de datos Oracle ...................................................................................................................22
2.2.1
Conceptos básicos de Bases de datos Oracle .......................................................................22
2.2.2
Arquitectura Oracle ..............................................................................................................22
2.3
TECNICAS ANTI-FORENSES ..................................................................................................27
2.3.1
Definición .............................................................................................................................28
2.3.2
Objetivos ..............................................................................................................................29
2.3.3
Destrucción de evidencia......................................................................................................29
2.3.4
Ocultación de evidencia .......................................................................................................29
2.3.5
Eliminación de fuentes de evidencia ....................................................................................30
2.3.6
Falsificación de evidencia ....................................................................................................30
2.4
ATAQUES EN ORACLE ............................................................................................................31
2.4.1
SQL INJECTION .................................................................................................................31
2.4.2
TIPOS DE ATAQUES SQL INJECTION ...........................................................................33
2.4.3
SQL MANIPULATION .......................................................................................................34
2.4.4
CODE INJECTION..............................................................................................................35
2.4.5
FUNCTION CALL INJECTION .........................................................................................35
2.4.6
BUFFER OVERFLOWS .....................................................................................................37
2.5
TÉCNICAS FORENSES EN BASES DE DATOS ORACLE ....................................................37
2.5.1
ENTORNO ...........................................................................................................................38
2.5.2
PRINCIPALES FUENTES DE EVIDENCIA EN ORACLE ..............................................38
2.5.3
HERRAMIENTAS ÚTILES EN UN ENTORNO ORACLE ..............................................80
6
2.6
CASO DE ESTUDIO ...................................................................................................................86
2.6.1
2.7
EVIDENCIA DE LAS ACCIONES DEL ATACANTE .....................................................86
TECNICAS ANTI FORENSES EN BASES DE DATOS ORACLE..........................................87
2.7.1
Técnicas anti forenses en contra del Redo Log ....................................................................87
2.7.2
Técnicas anti forenses contra los rastros dejados por la eliminación de objetos ..................88
2.7.3
Técnicas anti forenses en contra de las tablas de auditoria ..................................................88
2.8
GUíA METODOLOGICA PARA EL ANáLISIS DE BASES DE DATOS ORACLE ..............88
2.9
RECOMENDACIONES PARA LOS INVESTIGADORES FORENSES EN INFORMÁTICA
EN BASES DE DATOS ORACLE. ........................................................................................................91
3
CONCLUSIONES ................................................................................................................ 92
4
TRABAJOS FUTUROS ....................................................................................................... 93
5
ANEXOS .............................................................................................................................. 94
5.1
Anexo 1 ........................................................................................................................................94
5.2
Anexo 2 ........................................................................................................................................95
5.3
Anexo 3 ........................................................................................................................................96
5.4
Anexo 4 ........................................................................................................................................97
5.5
Anexo 5 ........................................................................................................................................98
5.6
Anexo 6 ........................................................................................................................................99
5.7
Anexo 7 ......................................................................................................................................100
5.8
Anexo 8 ......................................................................................................................................101
5.9
Anexo 9 ......................................................................................................................................102
5.10
Anexo 10 ....................................................................................................................................103
5.11
Anexo 11 ....................................................................................................................................104
5.12
Anexo 12 ....................................................................................................................................106
5.13
Anexo 13 ....................................................................................................................................107
5.14
Anexo 14 ....................................................................................................................................108
5.15
Anexo 15 ....................................................................................................................................109
5.16
Anexo 16 ....................................................................................................................................110
5.17
Anexo 17 ....................................................................................................................................111
5.18
Anexo 18 ....................................................................................................................................112
5.19
Anexo 19 ....................................................................................................................................113
5.20
Anexo 20 ....................................................................................................................................114
5.21
Anexo 21 ....................................................................................................................................115
5.22
Anexo 22 ....................................................................................................................................116
5.23
Anexo 23 ....................................................................................................................................117
7
5.24
Anexo 24 ....................................................................................................................................118
5.25
Anexo 25 ....................................................................................................................................123
5.26
Anexo 26 ....................................................................................................................................134
5.27
Anexo 27 ....................................................................................................................................135
5.28
Anexo 28 ....................................................................................................................................136
5.29
Anexo 29 ....................................................................................................................................137
5.30
Anexo 30 ....................................................................................................................................138
5.31
Anexo 31 ....................................................................................................................................139
5.32
Anexo 32 ....................................................................................................................................140
5.33
Anexo 33 ....................................................................................................................................141
5.34
Anexo 34 ....................................................................................................................................142
5.35
Anexo 35 ....................................................................................................................................143
5.36
Anexo 36 ....................................................................................................................................144
5.37
Anexo 37 ....................................................................................................................................146
5.38
Anexo 38 ....................................................................................................................................149
5.39
Anexo 39 ....................................................................................................................................150
5.40
Anexo 40 ....................................................................................................................................151
5.41
Anexo 41 ....................................................................................................................................152
5.42
Anexo 42 ....................................................................................................................................153
5.43
Anexo 43 ....................................................................................................................................154
5.44
Anexo 44 ....................................................................................................................................156
5.45
Anexo 45 ....................................................................................................................................157
5.46
Anexo 46 ....................................................................................................................................158
5.47
Anexo 47 ....................................................................................................................................159
5.47.1
5.48
6
Recaudo de la información .................................................................................................160
Anexo 48 ....................................................................................................................................164
TRABAJOS CITADOS ...................................................................................................... 166
8
TABLA DE ILUSTRACIONES
Ilustración 1: Promedio de ataques bloqueados por día [1]. ........................................................................17
Ilustración 2: Ventajas de hacer las cosas bien [1] .......................................................................................20
Ilustración 3: Rastros en el audit trail de un intento de ejecutar una sentencia con privilegios insuficientes
[25] ...............................................................................................................................................................58
Ilustración 4: Audit trail justo después de iniciar sesión [25] ......................................................................58
Ilustración 5: Audit trail justo después de cerrar sesión [25] .......................................................................59
Ilustración 6: Campo LOGOFF$TIME de la tabla AUD$ [25] ...................................................................59
Ilustración 7: Volcado de los predicados LIKE_PREDS [34] .....................................................................77
Ilustración 8: Creación diccionario de datos ................................................................................................83
Ilustración 9: Mapa de Acción .....................................................................................................................88
Ilustración 10: Sofisticación Vs. Conocimiento del atacante [41]. ..............................................................94
Ilustración 11: Intrusiones de seguridad en 2010 [1] ...................................................................................95
Ilustración 12: Actualizaciones de seguridad [1] .........................................................................................96
Ilustración 13: Estructura de la base de datos Oracle [6]...........................................................................97
Ilustración 14: Técnicas Anti-forenses [3] ...................................................................................................98
Ilustración 15: Vulnerabilidad usada para comprometer el sistema [9] .......................................................99
Ilustración 16: Configuración de los Redo Logs en la creación de la base de datos ..................................100
Ilustración 17: Bloque de datos Oracle [19]...............................................................................................102
Ilustración 18: Consulta de verificación del estado de las funciones de auditoria [21] ............................103
Ilustración 19: Volcado de información a partir de los tipos de dato de la tabla OBJ$ [19] ......................105
Ilustración 20: Entradas en el listener log generadas al ejecutar sidguess.exe [25] ...................................106
Ilustración 21: Registro de eventos de conexiones privilegiadas SYSDBA y SYSOPER en Windows [25]
....................................................................................................................................................................107
Ilustración 22: Evidencia de inicio de sesión cuando la auditoria esta desactivada [25] ...........................107
Ilustración 23: Localización traza ..............................................................................................................108
Ilustración 24: Traza sin formato ...............................................................................................................108
Ilustración 25: Sentencias de volcado ........................................................................................................109
Ilustración 26: Volcado NOSYS ................................................................................................................109
Ilustración 27:Comando Time ....................................................................................................................110
Ilustración 28: Comando Date....................................................................................................................110
Ilustración 29: Comando net user...............................................................................................................111
Ilustración 30: Detalles de usuario .............................................................................................................111
Ilustración 31: Lista de conexiones y puertos ............................................................................................112
Ilustración 32: Ubicación Home ................................................................................................................113
Ilustración 33: Ubicación Archivo de Inicio ..............................................................................................113
Ilustración 34: Validación Ruta diccionario Logminer ..............................................................................115
Ilustración 35: Configuración ruta diccionario ..........................................................................................115
Ilustración 36: Validación Pos activación ..................................................................................................115
Ilustración 37: Agregando archivos de investigación ................................................................................116
Ilustración 38: Tipos de datos LogMiner ...................................................................................................117
Ilustración 39: Creando el usuario a explotar .............................................................................................118
Ilustración 40: Revisando los privilegios del usuario ................................................................................118
Ilustración 41: Verificando los permisos Java del usuario .........................................................................119
Ilustración 42: Sentencia de inyección para obtener privilegios Java arbitrarios......................................119
Ilustración 43: Verificación de inserción de nuestra Política Java .............................................................120
Ilustración 44: Sentencia para ejecutar comandos de sistema operativo ....................................................120
9
Ilustración 45: Creación de un usuario en el sistema operativo .................................................................121
Ilustración 46: Agregando el usuario al grupo de administradores del sistema operativo .........................121
Ilustración 47: Lateral Injection al re direccionar la salida de un error .....................................................122
Ilustración 48: Ejecución de un paquete de SYS con parámetros inválidos para ejecutar nuestro ataque .122
Ilustración 49: Proceso para darle formato al archivo trc...........................................................................124
Ilustración 50: Sentencia 1 Ejecución de un procedimiento para explotar vulnerabilidad de aurora.........124
Ilustración 51: Sentencia 2 Permisos para modificar la entrada y salida del sistema ................................125
Ilustración 52: Sentencia 3 Creación de archivo de salida OUT.LST ........................................................125
Ilustración 53: Creación de un usuario dentro del sistema operativo .........................................................125
Ilustración 54: Ejecución de permisos para Otorgar perfil de DBA ..........................................................126
Ilustración 55: Flujo de información para crear el overflow ......................................................................126
Ilustración 56: Set Role as DBA ................................................................................................................126
Ilustración 57: Evidencia del ataque en los Redo Logs..............................................................................127
Ilustración 58: Verificación de la evidencia obtenida en el volcado generado por la herramienta
"dumpaction.exe" .......................................................................................................................................128
Ilustración 59: XML para filtrar entradas sospechosas de un Redo Log ....................................................129
Ilustración 60: Entradas relacionadas a BONIFACIO en la tabla de auditoría AUD$ ..............................130
Ilustración 61: Código de acción relacionado al valor hallado en la tabla AUD$ .....................................130
Ilustración 62: Técnica anti forense de eliminación de la evidencia almacenada en la tabla AUD$ .........131
Ilustración 63: Sentencia de uso de Orablock para hallar evidencia relacionada a la tabla AUD$ en el Data
File SYSTEM01.DBF ................................................................................................................................132
Ilustración 64: Archivo de estructura de la tabla AUD$ ............................................................................132
Ilustración 65: Evidencia de filas eliminadas de la tabla AUD$ ................................................................133
Ilustración 66 : Diagrama de flujo para detectar vulnerabilidades de SQL Injection – Adaptado de [12] 134
Ilustración 67: Volcado Hexadecimal de un bloque asignado a la tabla SOURCE$ [19]..........................135
Ilustración 68: Información contenida en las filas eliminadas asociadas al objeto 51850 [19] .................135
Ilustración 69: Volcado Hexadecimal de los bloques asignados a la tabla IDL_UB1$ [19] .....................137
Ilustración 70: Diferencia entre autenticación de la cuenta SYS con y sin "AS SYSDBA" [25] ..............138
Ilustración 71: Búsqueda ruta trace files ...................................................................................................139
Ilustración 72: SPFile Texto.......................................................................................................................140
Ilustración 73: Ruta Listener logs [26] .......................................................................................................141
Ilustración 74: Versión ...............................................................................................................................142
Ilustración 75: Descripción de la columna COL_USAGE$ [34] ...............................................................143
Ilustración 76: Filt1.xml .............................................................................................................................144
Ilustración 77: Filt-bool.xml ......................................................................................................................144
Ilustración 78: Filt-grant.xml .....................................................................................................................145
Ilustración 79:Filt-xid.xml .........................................................................................................................145
Ilustración 80: Parámetros de la herramienta Orablock .............................................................................145
Ilustración 81: Errores del TNS Listener [23] ............................................................................................146
Ilustración 82: Entradas en el listener log para los comandos SERVICES y STATUS [25] .....................146
Ilustración 83: Entradas en el audit trail para intentos de conexión de usuarios no existentes [25] ..........147
Ilustración 84: Entrada del audit trail usando la columna COMMENT$TEXT [25] ................................147
Ilustración 85: Evidencia del uso de orapwdbrute.exe [25] .......................................................................147
Ilustración 86: Consulta para extraer la fecha en que se bloquea una cuenta ............................................148
Ilustración 87: Entradas en el listener log generadas al ejecutar sidgusser.exe [25] ..................................149
Ilustración 88: Búsqueda SID y Serial # ....................................................................................................150
Ilustración 89: Encabezado de un archivo Oracle ......................................................................................151
Ilustración 90: Ejemplo de verificación del tamaño de un archivo Oracle ................................................151
Ilustración 91: Encabezado de un bloque en un archivo Oracle Redo Log................................................152
10
Ilustración 92: Estructura del encabezado de un Red Log – Adaptado de [16] .........................................153
Ilustración 93: Encabezado de una fila eliminada [19] ..............................................................................154
Ilustración 94: Extracción de información de columnas de una fila eliminada [19] ..................................154
Ilustración 95: Volcado hexadecimal de una fila [19] ...............................................................................155
Ilustración 96: Discriminación de columnas a partir de un volcado hexadecimal [19] .............................155
Ilustración 97: Volcado Hexadecimal de un bloque asignado a la tabla MY_TEMP_TABLE [19] .........156
Ilustración 98: TimeStamp tabla dual [36] .................................................................................................157
Ilustración 99: TimeStampLogMiner [36] .................................................................................................157
Ilustración 100: SentenciaSpool [36] .........................................................................................................158
Ilustración 101: Estructura LogMiner Redo Logs [36] ..............................................................................158
Ilustración 102: Verificación Serial Commit Number [36] ........................................................................159
11
RESUMEN EJECUTIVO
A partir de los diferentes mecanismos de control que provee Oracle podemos recrear todo tipo de
actividades que se hayan realizado en la base de datos, en esta investigación inicialmente mostraremos la
motivación y el porque es necesario este trabajo, desde las estadísticas de intrusión hasta las tendencias
actuales que demuestran que las bases de datos son el principal objetivo de los atacantes a la hora de
buscar información sensible de las corporaciones. Posteriormente en el Capítulo 2 se realiza la toda la
revisión de Literatura existente, esta revisión se divide en:
 Administración bases de datos
En esta sección se verifica cada una de las tendencias actuales que se presentan con las bases de datos,
desde las estadísticas de intrusión hasta políticas y buenas prácticas que se deben tener en cuenta por los
DBA´s que son los encargados de la administración de la seguridad. También se muestra cual es el estado
actual del manejador de Base de datos Oracle con respecto a otros manejadores y cuáles han sido su fallas
y sus aciertos en lo que a temas de seguridad se refiere.
 Bases de datos Oracle
En esta sección se explican los conceptos básicos de la arquitectura de las base de datos Orcale, desde los
espacios en memoria hasta la arquitectura física y lógica de manejador de bases de datos. También
podemos encontrar el primer acercamiento a los diferentes medios de almacenamiento de evidencia y los
principales mecanismos de recuperación de información.
 Técnicas anti-forenses
En esta sección se presentan las diferentes agrupaciones de técnicas anti-forenses las cuales son:
 Destrucción de evidencia
 Ocultación de evidencia
 Eliminación de fuentes de evidencia
 Falsificación de evidencia
 Ataques en Oracle
12
Dentro de esta sección podemos encontrar 2 clasificaciones de ataques a nivel general la primera se
dividió de la siguiente forma:
 Ataques de primer orden
 Ataques de segundo orden
 Inyección lateral
 Buffer overflows
La otra Clasificación es la siguiente:
 Sql manipulation
 Code injection
 Function call injection
 Buffer overflows
 Técnicas forenses en bases de datos Oracle
Se explican las principales fuentes de evidencia, se explica su configuración y sus diferentes formas de
análisis. Dentro de las fuentes de evidencia que se encuentran en esta sección podemos ver:
 Redo Logs
 Archivos TNS Logs
 Archivos Trace de Oracle
 Datafiles Oracle
 AUD$

Caso de estudio
Vemos de manera práctica lo presentado en la sección anterior, mostrando detalladamente el ataque
escogido y estudiándolo a la luz de las posibles pruebas y reconstrucción de eventos del ataque.

Recomendaciones para los investigadores forenses en informática en bases de datos
Oracle.
Finalmente en esta sección presentamos las consideraciones que debe poseer un informático forense a la
hora de realizar una investigación que implique un sistema gestor de base de datos de Oracle.
13
1
DESCRIPCIÓN GENERAL DEL TRABAJO DE GRADO
1.1 FORMULACIÓN
A medida que los sistemas avanzan y toman protagonismo en un mundo cada vez más exigente y
productivo, se perfila de manera cada vez más evidente la necesidad de hacer a los sistemas más seguros,
ya que el avance no sólo se presenta en la eficacia y productividad, sino también en la calidad y en la
cantidad de los ataques informáticos que aquejan los sistemas actualmente. Ver Anexo 1
Como se puede ver en la Ilustración No. 1 cada día es más notorio que la tendencia es que los atacantes
sean cada vez más efectivos y que el conocimiento de los mismos sea cada vez menor. Este asunto es
preocupante ya que esta tendencia de los ataques y la facilidad de los mismos es clara y se encuentra en
aumento, lo cual tendrá como consecuencia que los eventos de seguridad informática sean cada vez más
específicos, eficaces y elaborados.
Es necesario también que los involucrados en la administración de la seguridad de los sistemas de bases de
datos no sólo conozcan muy bien sus plataformas sino que además también conozcan las posibles fallas de
seguridad que nativamente poseen, ya que si sabemos nuestras debilidades es más sencillo saber dónde
investigar e intentar fortalecerlas para que cada vez sean menos los incidentes a los cuales podríamos
exponer nuestras corporaciones.
En la actualidad las bases de datos no se escapan de la tendencia anteriormente evidenciada ya que estas
son las herramientas de mayor importancia para las corporaciones y la vida cotidiana en general, el
comercio web y las transacciones. El constante crecimiento de internet ha hecho que las bases de datos
tengan que ser accesibles de manera rápida y eficiente pero también de manera más insegura, por lo cual,
lo que antes era accesible por diferentes tipos de capas ahora es accesible casi que de manera inmediata.
Indirectamente todos los datos que nosotros suministramos de manera web como nuestros nombres,
nuestras relaciones, nuestras contraseñas y todo tipo de información que componga nuestra vida digital,
finalmente quedara en un repositorio de datos en alguna parte del mundo, y como si esto fuera poco no
solo nuestra información personal se encuentra almacenada en la bases de datos, sino que además, estos
sistemas se encargan de administrar un gran porcentaje de la economía mundial. Al ser el lugar donde
permanece más tiempo la información y donde se puede encontrar mayor cantidad de esta, los atacantes
14
buscaran la forma de infiltrarse dentro de la base de datos para cometer sus ilícitos. Por todo lo anterior
encontramos que la seguridad de las bases de datos es un tema que debe ser estudiado a profundidad y de
manera concienzuda, evitando e identificando los posibles tipos de técnicas que los criminales puedan
llegar a usar para lograr su objetivo, con el fin de volver mucho más seguros lo repositorios en los cuales
la información sensible de la empresa se encuentra [1].
Para este caso estudiaremos en detalle los ataques más comunes y los tipos de técnicas anti-forenses que
utilizan los criminales para alterar, ocultar y eliminar las posibles evidencias que puedan quedar de sus
actos, sobre las bases de datos Oracle específicamente, ya que Oracle es uno de los manejadores de bases
de datos más utilizado a nivel mundial, por lo cual es de esperarse que los atacantes aprenderán y
desarrollarán todo tipo de técnicas para evadir los mecanismos de seguridad. Esto hace que el estudio de
las técnicas anti-forenses mencionadas que usen los atacantes, sea un estudio necesario para toda la
comunidad de informáticos forenses y administradores de bases de datos que serán los encargados de
realizar las investigaciones.
Teniendo en cuenta el panorama anteriormente visto, este documento, posee como objetivo principal tratar
de dar respuesta a la pregunta: ¿Cómo identificar, investigar y prevenir el uso de técnicas anti forenses en
Bases de datos Oracle?
1.2 JUSTIFICACIÓN
Oracle es uno de los manejadores de bases de datos más usados a nivel mundial, esto implica que los
investigadores forenses deben estar preparados para enfrentarse a investigaciones que involucren bases de
datos Oracle. A medida que estos manejadores van avanzando, también es necesario avanzar en las
técnicas y procedimientos usados para realizar una investigación forense que pueda identificar de manera
efectiva y eficiente los hechos acontecidos en la escena del crimen, además de los procedimientos usados
para realizar el ataque o la intrusión dentro de la base de datos. En la revisión realizada en este trabajo, se
identificaron artículos que hablan de ataques específicos, limitados documentos con información sobre
métodos para adelantar investigaciones forenses en bases de datos Oracle y muchos menos sobre las
posibles técnicas anti-forenses que un atacante podría usar para evitar que sus acciones sean descubiertas
por un examinador forense.
La seguridad total es imposible, ya que no existe ningún sistema que no se encuentre en relación con un
entorno o con otro sistema bien sea humano o digital. Si tenemos esto como premisa, podemos determinar
15
que la seguridad de un sistema está determinada por la inseguridad a la cual se encuentre expuesto, lo que
permite crear políticas y estrategias que incrementan y ayudan a complicar el acceso de los usuarios no
permitidos, haciendo de esta manera, sistemas más seguros [2]. Actualmente los atacantes no solo se han
enfocado en realizar el ataque sino en, además, hacer todo lo posible para que sea virtualmente imposible
recrear los hechos, haciendo que sus huellas sean eliminadas o distorsionadas para no ser atrapados, “Haz
difícil que te encuentren e imposible de probar que te encontraron” [2], es la premisa actual de todo
atacante, esto ha hecho que las investigaciones sean cada vez más desafiantes y mucho más exigentes para
los investigadores forenses.
Al ser las bases de datos una de las herramientas más usuales y que más servicios le presta a los procesos
dentro de nuestra sociedad, es necesario identificar y poder recrear los hechos acontecidos dentro de una
base de datos en el momento de adelantar una investigación forense, analizándolo todo bajo los principios
de las posibles técnicas anti-forenses enunciadas por Harris (Eliminación de la fuente, ocultamiento,
borrado y la falsificación de las evidencias Digitales) [3], ya que con esto se podría lograr acotar de
manera más precisa cuál fue el rumbo de acción del atacante y de esta manera lograr resultados más
exactos y confiables.
Ya que la informática forense tiene como propósito “apoyar el proceso investigativo utilizando la
evidencia digital que sustente y verifique las afirmaciones que sobre los hechos delictivos se han
materializado en el caso bajo estudio” [4], es completamente válido y además necesario sugerir una
práctica o crear una guía metodológica que permita a los investigadores forenses tener una guía que les
permita identificar que la evidencia recolectada dentro de la investigación no haya sido modificada o
alterada de ninguna manera.
La seguridad de las bases de datos ya no es un tema de apostar a la no ocurrencia de un posible ataque
como podría haber sucedido hace 10 años, sino que la pregunta real es ¿cuándo nos van a atacar? [1].
Según un estudio hecho por Xforce de IBM solamente los ataques por SQL injection se han multiplicado
de manera vertiginosa en el 2008 y es una tendencia que se encuentra en crecimiento, demostrando así que
el problema es real y que es ahora cuando debemos tomar cartas sobre el asunto.
16
Ilustración 1: Promedio de ataques bloqueados por día [1].
Teniendo como base que la seguridad sobre las bases de datos es un tema que debe ser tratado a la mayor
brevedad, es necesario identificar quiénes serán los actores que se encargarán de mantener la información
que se encuentra en nuestra base de datos segura. Esta respuesta, aunque aparentemente obvia, es
fácilmente olvidada y difuminada entre la cantidad de usuarios, desarrolladores y administradores de los
sistemas utilizados para el almacenamiento de información.
Este trabajo de grado tiene como objetivo lograr que por medio de la computación anti-forense se pueda
aprender a reconocer y entender las limitaciones de seguridad que posee el manejador de bases de datos
Oracle, para comprender en materialización de sus vulnerabilidades, las fuentes de información y puntos
específicos de análisis que deben ser considerados por los informáticos forenses y así apoyar el análisis de
resultados de incidentes sobre este tipo de elemento informático. También se pretende proveer un marco
de elementos conceptuales y prácticos acerca de este manejador de bases de datos. Los posibles tipos de
ataques que se pueden realizar sobre esta plataforma, además de los diferentes tipos de técnicas utilizados
para ocultar y alterar las evidencias, deben ser prioridades en los estudios en el área, para que las
investigaciones forenses puedan ser concluyentes y confiables.
En una segunda instancia propondremos una guía metodológica que provea los elementos necesarios para
evidenciar el uso de técnicas anti-forenses sobre las bases de datos Oracle.
1.3 OBJETIVO GENERAL
Desarrollar una guía metodológica para un análisis forense sobre bases de datos Oracle, teniendo en
cuenta los rastros de las principales técnicas anti-forenses y herramientas de identificación, investigación y
prevención disponibles en la actualidad.
17
1.4 OBJETIVOS ESPECÍFICOS

Estudiar la arquitectura de las bases de datos Oracle, identificando los componentes de seguridad
y sus posibles brechas.

Realizar un análisis acerca de cuáles son los rastros más significativos y de qué manera se
materializan las técnicas anti forenses en las bases de datos Oracle.

Estudiar cómo se adelanta una investigación o análisis forense en una base de datos y especificar
los detalles de la misma sobre Oracle.

Identificar y comprender las principales categorías de ataques
informáticos dentro de los
ambientes de bases de datos Oracle.

Explorar qué tipo de herramientas existen o se utilizan para soportar las investigaciones en Bases
de Datos Oracle.
18
2
REVISIÓN DE LITERATURA
2.1 ADMINISTRACIÓN BASES DE DATOS
2.1.1 Estado Actual
Actualmente y aunque parezca completamente incoherente, la administración de la seguridad de bases de
datos ha quedado relegada a un segundo plano y en muchas de las corporaciones no la tienen en cuenta,
pues no representa un valor agregado en primera instancia para el funcionamiento del negocio. Este tipo
de pensamiento ya no es viable en un mundo en el cual la conectividad ha crecido de tal manera que es
posible realizar transacciones desde cualquier parte del globo haciendo uso de internet. La mayoría de las
bases de datos actualmente se rigen por políticas de facilidad y comodidad más que por las políticas de
seguridad [1]. Ver Anexo 2
Tan solo en 2008, las bases de datos fueron los objetivos principales de los atacantes con un 75% de
registros de intento de ataques y un 30% de intrusiones exitosas. Esto es entendible ya que las bases de
datos son el lugar en el cual la información permanece más tiempo y donde aparentemente no presenta un
control más exigente que el que preste el manejador.
La tendencia de las corporaciones a publicar sus servicios de manera web y dar facilidades de
interconexión entre los partners, ha dado un rumbo peligroso al manejo de la información, puesto que la
mayoría de bases de datos se encuentran atadas a una interfaz web, es necesario usar políticas de
seguridad, porque de no ser así sería el escenario perfecto para un atacante [1], [5].
Otros factores que también influyeron dentro de la explosión WEB fueron el comercio electrónico, la
facilidad de compra y venta de artículos, y la automatización de las finanzas. Estos fueron eventos de
suma importancia para que las bases de datos y las aplicaciones WEB surgieran con gran fuerza pero
también con muchos inconvenientes y problemas que representan oportunidades de negocio para los
hackers, y dolores de cabeza para los DBA1 y los expertos en seguridad [5].
Aunque los manejadores de bases de datos han incrementado notoriamente su seguridad, hay gran
cantidad de componentes que aún no se pueden controlar. Oracle ha publicado 69 alertas de seguridad
hasta el momento. Sus parches críticos de actualización y alertas de seguridad, arreglan un alto porcentaje
de bugs y posibles brechas que posee la herramienta, Solo hasta el parche 68 los bugs solucionados
ascendían a más de 50.
1
DBA: Administrador de Bases de Datos (DatabaseAdministrator)
19
La seguridad de las bases de datos definitivamente tiene que ser un asunto de los usuarios, de las
corporaciones y de los DBA, ya que nadie más que ellos, conoce al detalle las mismas. En noviembre de
2008 ForresterResearch demostró por medio de una gran encuesta, que los DBA dedican menos del 5 %
de su tiempo para los temas de seguridad de la base de datos. Los administradores de las bases de datos
actualmente se encuentran tan atareados con las tareas de almacenamiento, tunning up, migraciones y
copias de seguridad que no le dan el tiempo ni la importancia necesarios, a la administración de las
políticas de seguridad, dice el analista de Forrester Noel Yuhanna. [1].
Ilustración 2: Ventajas de hacer las cosas bien [1]
Según un estudio realizado por el grupo Aberdeen, las ventajas que poseen las empresas que hacen una
auditoria a sus sistemas de seguridad son notables porque poseen un aumento ostensible en la prevención
de incidentes de seguridad informática y por ende un incremento en la productividad de las corporaciones,
ya que se disminuyen los tiempos en los cuales los sistemas se encuentran sin servicio. La seguridad de las
bases de datos debe ser una tarea de los DBA´s. Las principales tareas que pueden ser desarrolladas por
ellos para mantener la confidencialidad de las bases de datos son:
1. Cifrado de las bases de datos: Las bases de datos pueden ser cifradas completamente o
parcialmente. Si es cifrada completamente, puede que el rendimiento se reduzca dependiendo del
tamaño de la base de datos. En caso de que sea cifrada parcialmente, puede tenerse un cifrado de
tablas, de columnas, de filas o hasta de celdas específicamente. Para la toma de decisiones acerca
del nivel al cual se debe tener el cifrado de datos, tenemos que tener en cuenta qué aplicaciones
dependen de la base de datos, qué impacto podría tener en los procesos empresariales y que
medidas habría que tomar para que este impacto sea mínimo.
20
2. Manejo de políticas de contraseñas: Según Alexander Kornbrust esta es la práctica más importante
para la administración de seguridad de una base de datos ya que “en mi opinión, este tema es el
más importante, porque aunque usted aplique las mejores prácticas en seguridad de bases de
datos, son inútiles si alguien se hace de las contraseñas legítimas, todo lo demás es más o menos
una pérdida de tiempo”2.
3. Actualizaciones y parches de seguridad: Es importante que los DBA´s mantengan sus bases de
datos actualizadas ya que gran parte de los ataques se realizan haciendo uso de la falencia de los
parches y actualizaciones de seguridad. Ver Anexo 3
Un estudio realizado por la asociación de usuarios independientes de Oracle demostró que un 26%
de los usuarios actualizan sus sistemas 6 meses después de que ha sido liberado un parche de
seguridad y que el 11% jamás los actualizan [1].
Aunque los DBMS actuales poseen gran cantidad de mecanismos para la prevención y análisis de
incidentes forenses, como lo son la autenticación, la autorización, el control de acceso y otras
técnicas un poco más elaboradas como es la auditoria y el monitoreo, solamente el 25 % de las
corporaciones hacen uso de estas. [1]
4. Configuración de privilegios: Todos los usuarios deben tener la menor cantidad de permisos de
usuario, única y exclusivamente lo necesario para poder realizar sus tareas ya que muchas veces
los usuarios tienen más privilegios de los que necesitan y pueden comprometer la seguridad de la
información con o sin intención.
Tras revisar brevemente el estado actual de la seguridad en las bases de datos y las acciones al
respecto por parte de los administradores de estas, pasaremos a estudiar en más detalle el DBMS
Oracle (que es el que concierne directamente a este trabajo), trataremos los conceptos básicos de
arquitectura y la manera en que se encuentran organizados los archivos de una base de datos de este
tipo, así mismo las estructuras de memoria más importantes y los procesos más relevantes para
entender el funcionamiento básico de Oracle y así tener mayor probabilidad de éxito a la hora realizar
una investigación forense en este entorno.
2
Traducción libre del autor.
21
2.2 BASES DE DATOS ORACLE
Hablar de una base de datos segura o hablar del mejor motor de bases de datos es muy sutil si lo vemos
desde el punto de vista del conocimiento, pues en la medida en que una persona conoce las capacidades y
las debilidades de un motor de bases de datos, aumenta su habilidad para administrarla y por ende su
capacidad de garantizar la seguridad de la información contenida en la misma. Entre más características o
capacidades posee un motor de bases de datos, mayor se hace el rango de información que un DBA debe
cubrir para garantizar la óptima administración de su manejador. El hecho de cómo saber cómo funciona
su DBMS permite garantizar, que mientras se cumplan las políticas de seguridad planteadas por los
expertos en seguridad, la información almacenada estará más segura y conservara su integridad. [5]
Como Oracle es un DBMS con tantas funcionalidades, no es el punto central de este trabajo describirlas y
analizarlas todas, pero si debemos estudiar los conceptos básicos antes de poder enfrentarnos
adecuadamente a una investigación forense. A continuación se tratan dichos conceptos de manera breve.
2.2.1 Conceptos básicos de Bases de datos Oracle
Oracle es el servidor de bases de datos más popular y es usado en diversas áreas de mercado, esto se debe
a que lleva un largo tiempo compitiendo en este sector y desde sus comienzos ofreció un motor de bases
de datos relacional que corría en diversos sistemas operativos; y aunque aún lo hace, su entorno preferido
parece inclinarse hacia Linux. Con la explosión del comercio electrónico Oracle ganó popularidad como la
base de datos escogida para aplicaciones web. Al sacar la base de datos de un entorno controlado de
acceso limitado a las máquinas de la empresa y pasarla al entorno web, obtenemos grandes ventajas, pero
asimismo la acercamos al atacante y por ende debemos ser
mucho más cuidadosos a la hora de
administrar la seguridad. Es por esto que es de vital importancia comenzar conociendo las funcionalidades
básicas del RDBMS para así poder entender posteriormente, en qué debilidades se basan los atacantes a la
hora de planear un crimen en un entorno Oracle. [5]
2.2.2 Arquitectura Oracle
“Un servidor Oracle es el componente que permite una administración y desarrollo de bases de datos.
Tiene tres posibilidades de ejecución [6]:

Local o basada en host. El servidor se ejecuta en la misma máquina en la que se conectan los
clientes. La versión personal de Oracle produce servidores de este tipo.
22

Cliente-Servidor. Enfoque más típico. El servidor reside en un ordenador distinto respecto al que
los usuarios van a usar para conectarse a la base de datos.

Cliente-Servidor de Aplicaciones-Servidor. Los usuarios acceden a un servidor de aplicaciones
(Oracle Application Server) que, a su vez, accede al servidor Oracle. Los tres elementos (cliente,
servidor de aplicaciones, servidor Oracle) pueden estar en tres máquinas distintas.
Elementos del servidor Oracle
El servidor Oracle está formado por dos elementos:
La instancia de la base de datos
“Consta de datos (estructuras de memoria) y de procesos en memoria (procesos background) necesarios
para dar servicio a los usuarios de la base de datos. Puede haber más de una instancia si se distribuye la
base de datos en más de una máquina. Cada instancia abre una y sólo una base de datos” [6].
Ficheros en disco.
Representan la base de datos en sí. Se dividen en: [6]:

Estructuras lógicas: Tablespaces, objetos del esquema de usuario.

Estructuras físicas: Los ficheros de datos almacenados en disco. Los ficheros de datos (asociados
a los tablespaces), los ficheros redo log y los ficheros de control.
Conexiones
Para establecer una sesión con la base de datos, el usuario necesita conectarse con la instancia de la
base de datos. Normalmente esto significa utilizar una herramienta cliente como SQL*Plus o ejecutar una
aplicación de desarrollo de bases de datos (como Oracle Forms); entonces se ejecuta un proceso de
usuario [6].
Cuando esto ocurre, en el servidor se establece un proceso de servidor. Este proceso es el encargado de
comunicar al usuario con la instancia Oracle en nombre del proceso de usuario. Cada vez que el usuario
ejecuta instrucciones SQL, éstas son transmitidas a la instancia Oracle por el proceso servidor [6].
23
Cada sesión es una conexión de un usuario con el servidor Oracle. Un usuario puede establecer múltiples
sesiones (si se conecta desde diferentes herramientas y máquinas) [6].
Estructura de las bases de datos Oracle
Desde el punto de vista de Oracle, una base de datos es una colección de datos tratados como una única
unidad. Una base de datos Oracle contiene tres tipos de ficheros [6]:

Archivos de datos. Contiene los datos actuales de la base de datos así como el diccionario de
datos.

Archivos rehacer (Redo Logs). Almacenan datos recuperables en caso de error grave.

Archivos de control. Necesarios para mantener la integridad de la base de datos.

Archivos de parámetros. Que definen algunas características de una instancia Oracle.

Archivos de contraseñas. Que sirven para autentificar a los usuarios.

Copias de archivos rehacer. Utilizadas para la recuperación de datos.
Instancia de la base de datos Oracle
La instancia de la base de datos es uno de los dos elementos de cualquier base de datos Oracle. Sirve
para gestionar la información de la base de datos y proporcionar servicio a los usuarios que acceden a la
misma [6].
Está compuesta de:

Estructuras en memoria.

Procesos en segundo plano
Estructuras en memoria
SGA
Es la abreviatura de System Global Area, Área Global de Sistema. Está situada al inicio de los datos de la
instancia y contiene los datos e información de control de la instancia [6].
Está formada por las siguientes estructuras Ver Anexo 5.4 :
24

Shared pool, fondo común compartido. Almacena las últimas instrucciones SQL y PL/SQL
ejecutadas. Posee dos estructuras internas:
o
Caché de instrucciones (Library cache). Almacena las últimas instrucciones SQL y
PL/SQL ejecutadas. Administra los datos mediante algoritmo LRU.
o
Caché del diccionario de datos. Almacena las últimas definiciones de la base de datos
utilizadas (tablas, índices, privilegios, usuarios,..etc.). Cada vez que una instrucción
utiliza un nombre de la base de datos (tabla, índice,...) se comprueba en el diccionario de
datos y se almacena en este caché. De este modo la siguiente vez no hace falta acceder al
diccionario de datos real.

Caché buffer de la base de datos. Almacena los últimos bloques de datos accedidos por los
usuarios.

Buffer de archivo rehacer. Almacena los últimos cambios realizados a los bloques de datos de la
base de datos.

Large pool. Opcional. Se utiliza como memoria de sesión y para realizar operaciones de backup.

Java pool. Opcional. Se utiliza como caché de los comandos Java [6].
PGA
Zona global de los programas (Program Global Area). En ella se almacenan los datos correspondientes a
un proceso (sólo un proceso puede utilizar esta área). Incluye [6]:

Áreas de ordenamiento. Para acelerar las tareas de ordenamiento de datos.

Información de sesión. Usuario, privilegios, etc.

Estado del cursor. Tareas SQL actualmente en ejecución.

Espacio de pila. Variables y otros datos.
En Oracle los procesos pueden ser de estos tipos [6]:

Proceso de usuario. Lanzado por el usuario para pedir interacción con la base de datos.
25

Proceso de servidor. Hacen de enlace entre los procesos de usuarios y el servidor Oracle. Se
utilizan como manejadores de los procesos de usuario. Los comandos de usuario se envían a
estos procesos que se encargan de solicitar peticiones a la base de datos mediante el interfaz
de programas de Oracle (OPI, Oracle Program Interface).

Procesos en segundo plano (background). Cada instancia de Oracle arranca una serie de
procesos background. Los procesos obligatorios son [6]:

DBWR (DataBaseWRiter). Proceso encargado de escribir en los ficheros de datos los
buffers más antiguos de la memoria, para que la base de datos vaya almacenando los
cambios.

LGWR (LoGWRiter). Escribe los datos a los ficheros rehacer (redo) desde la caché de
archivos rehacer.

CKPT. Actualiza todas las cabeceras de los ficheros de datos para que aparezca la nueva
disposición de datos. Esto ocurre cuando se genera un punto de comprobación.

SMON (System MONitor). Permite recuperar la instancia de la base de datos en caso de
caída fatal (cuando el sistema falla por ejemplo). Cuando se reinicia de nuevo la
instancia de la base de datos.

PMON (ProcessMONitor). Es el encargado de gestionar adecuadamente los procesos
que fallan. Ante caídas de procesos, PMON se encarga de restaurar los datos
adecuadamente.

SQL *Net Listener. Es el encargado de encaminar por una red solicitudes de un cliente a
un servidor de base de datos Oracle. Este procesoestá tanto en el cliente como en el
servidor. Puede encaminar solicitudes que se dirigen a varias instancias.”
Oracle provee funcionalidades para casi todos los gustos y necesidades, pero por cada necesidad que
satisface también genera una nueva oportunidad para el atacante. “El código detrás del RDBMS ha sido
sujeto de varias sobrecargas y otros problemas de seguridad, como PL/SQL Injection en paquetes y
procedimientos por defecto, que han requerido parches de actualización en el pasado” [5] [7].
Asumiendo que no vamos a ser atacados podríamos dedicarnos a disfrutar de las grandes funcionalidades
que provee Oracle, pero seamos realistas, hoy en día casi que podemos tener la certeza de que teniendo
26
nuestra base de datos en un entorno web, es decir, más cerca del atacante, muy seguramente esta va a ser
atacada, y por eso para poder defenderla comenzamos por entender la arquitectura web que maneja
Oracle. “La pregunta hoy en día no es ¿Voy a ser atacado?, sino ¿Cuándo y cómo voy a ser atacado?”
[5].
Para entender el funcionamiento de una base de datos Oracle se hace importante estudiar: la disposición
física de la base de datos, los procesos y la manera en que estos interactúan con la red, la autenticación y
autorización, y finalmente la disposición lógica [5].
Procesos Oracle y Oracle en la Red
El elemento más crucial de interacción con la red posiblemente sea el TNS Listener.
El TNS Listener Oracle
El TNS listener es el centro de actividad de todas las comunicaciones en Oracle, sus siglas hacen
referencia a “Transparent Network Substrate” que es el protocolo usado para la comunicación entre
cliente y servidor. Cuando un servidor de base de datos arranca por primera vez, este se registra con el
TNS Listener usando el comando service_register_NSGR, esto le permite al TNS Listener saber que la
base de datos está preparada para recibir conexiones [5] [7].
Después de hacer una revisión sobre los conceptos básicos del DBMS Oracle podemos pasar a revisar en
qué consisten las técnicas anti forenses, cómo se clasifican, cuáles son las principales técnicas usadas por
los atacantes para cubrir sus crímenes y posteriormente relacionar los conceptos tratados en este capítulo
con dichas técnicas para poder definir las principales fuentes de evidencia en Oracle, es decir, en dónde
debe buscar un investigador forense los rastros de ataques a la base de datos, en qué debe fijarse, cómo
debe buscar y qué herramientas se sugiere usar.
2.3 TECNICAS ANTI-FORENSES
“Nadie puede diseñar un sistema, que alguien más no pueda comprometer o vulnerar”. [4]
Las técnicas anti forenses han existido desde el mismo momento en que nacieron las técnicas de
investigación y los procesos puntuales de recolección de evidencias. Estas surgieron como la necesidad de
evitar que las pruebas de un crimen sean factores determinantes a la hora de demostrar el grado de
implicación de un sospechoso dentro de un crimen. Por esta razón los criminales alteran, borran, evitan y
falsifican las evidencias para que de esta manera los resultados de las investigaciones no arrojen a los
27
criminales como culpables y queden sus fechorías impunes, ya que las pruebas no fueron lo
suficientemente contundentes como para demostrar su culpabilidad.
Por esta razón es necesario estudiar de manera exhaustiva cuántas y cuáles son las posibles técnicas que
los criminales puedan llegar a usar para alterar el curso de una investigación. En esta sección hablaremos
de las diferentes clasificaciones de las técnicas anti-forenses y el porqué es necesario tenerlas en cuenta a
la hora de realizar una investigación.
2.3.1 Definición
Existen gran cantidad de aproximaciones hacia la definición de técnica anti forense, pero solamente hasta
la publicación de Arriving at an anti-forensicsconsensus: Examining how to define and control the antiforensics problem de Ryan Harris se llegó a una estandarización de los principios básicos que se deben
tener en cuenta, para los expertos en seguridad y específicamente en las investigaciones forenses. [3]
Según Ryan Harris “las técnicas anti forenses comprenden cualquier intento por comprometer la
disponibilidad o usabilidad de la evidencia para el proceso forense”. De modo que una técnica antiforense es todo aquello que pueda comprometer la disponibilidad de la evidencia incluyendo evitar que la
evidencia se genere, esconder a la evidencia existente o manipular la evidencia para que no esté al alcance
del investigador. La usabilidad se puede comprometer por obstrucción de la evidencia en si misma o
destruyendo su integridad. Entendiendo evidencia como "cualquier información que, sujeta a una
intervención humana u otra semejante, ha sido extraída de un medio informático". [3] [4]
Existen tres tipos de evidencia digital
 Aquellos registros que se encuentren almacenados en el equipo de tecnología informática como lo
son los correos electrónicos archivos de aplicaciones ofimáticas e imágenes.
 Registros generados por los equipos de tecnología informática (registros de auditoría, registros de
transacciones, registros de eventos, etc.).
 Registros que parcialmente han sido generados y almacenados en los equipos de tecnología
informática. (hojas de cálculo financieras, consultas especializadas en bases de datos, vistas parciales
de datos, etc.). [4]
28
Según Harris existen cuatro clases fundamentales de técnicas anti-forenses, las cuales son:
 Destrucción de evidencia
 Ocultación de evidencia
 Eliminación de fuentes de evidencia
 Falsificación de evidencia [3]
2.3.2 Objetivos
Los objetivos de las técnicas anti forenses- según GARFINKEL:
 Limitar la detección de un evento que haya ocurrido.
 Distorsionar la información residente en el sitio.
 Incrementar el tiempo requerido para la investigación del caso.
 Generar dudas en el informe forense o en el testimonio que se presente.
 Engañar y limitar la operación de las herramientas forenses informáticas.
 Diseñar y ejecutar un ataque contra el investigador forense que realiza la pericia.
 Eliminar los rastros que pudiesen haber quedado luego de los hechos investigados. [8]
2.3.3 Destrucción de evidencia
La evidencia puede ser destruida para prevenir que sea encontrada o para reducir su usabilidad en caso de
que sea encontrada. Como las acciones de destrucción trabajan sobre evidencia existente, el proceso de
destrucción en sí puede generar nueva evidencia. Por ejemplo, sobrescribir un archivo obstruye la
evidencia en el archivo pero la aplicación que se usa para sobrescribirlo puede crear nueva evidencia. La
destrucción dentro de las bases de datos puede manejarse de diferentes maneras, entre ellas se encuentra el
borrado de los Logs que genera el sistema, que permiten realizar la auditoria de los eventos del sistema
como qué acciones se realizaron, quiénes las realizaron y en qué intervalo de tiempo las realizaron. [3]
2.3.4 Ocultación de evidencia
La evidencia no es destruida o manipulada, sin embargo, es escondida de la vista casual para reducir su
disponibilidad para el investigador. Muchas veces encontrar la evidencia escondida no es necesario sino
que el hecho de hallar herramientas de ocultación puede ser evidencia en sí mismo. Al esconder evidencia
los archivos pueden ser colocados en lugares poco comunes para explotar las limitaciones de las
29
herramientas de software forense o renombrado para tomar ventaja de los puntos ciegos inherentes del
investigador. [3]
2.3.5 Eliminación de fuentes de evidencia
La eliminación de las fuentes es todo acto que impida que una evidencia pueda ser generada. Por ejemplo,
en bases de datos la eliminación de los Logs, posibles fuentes de evidencia, pueden ser destruidos para
asegurarse de que la evidencia nunca sea generada. La ausencia total de evidencia puede ser indicio de un
crimen bien planeado. Es claro que en el momento en que se elimina una fuente, las pruebas que esta
posiblemente albergaría ya no se generarán, pero este evento también puede considerarse como evidencia
del uso de técnicas anti-forenses [3].
2.3.6 Falsificación de evidencia
La evidencia puede falsificarse para redirigir la culpabilidad, para explotar debilidades del proceso y de
las herramientas o bien para corromper la validez de la evidencia de manera que no sea útil para el
investigador. Falsificar evidencia puede ser crear evidencia que parece ser algo que no es, esto puede ser
crear evidencia que funciona como ataque a las herramientas o al proceso forense en sí. Algunas de las
categorías anteriores pueden necesitarse para conseguir el objetivo final de esta. Un ejemplo de esto puede
ser usar las cuentas de otras personas para realizar ataques y así desviar la culpa del real perpetrador.
[3]Ver Anexo 5.
30
2.4 ATAQUES EN ORACLE
En lo que a ataques a bases de datos Oracle respecta, podemos encontrar varias categorías, pero sin duda
la mayoría van a estar relacionadas directa o indirectamente con SQL Injection y especialmente con
modificaciones y combinaciones de este tipo de ataque. Comenzaremos entonces por estudiarlo desde lo
particular y simple para luego abordar las combinaciones y categorías de ataques más complejos.
2.4.1 SQL INJECTION
El “SQL Injection” es un ataque simple y conocido, pero no por eso deja de representar una amenaza para
cualquier base de datos, trátese de Oracle, MySQL o cualquier otra. De hecho, contrario a lo que se
pensaría al hablar de un ataque del cual se tiene tanta información en la actualidad, tras varias encuestas y
estudios realizados en el año 2010 por OWASP (Open Web Application Security Project) se determinó
que entre las mayores brechas de seguridad que terminan comprometiendo datos, los ataques de este tipo
predominan con un 60% del total si contamos los casos en que este ataque es combinado con malware [9].
Ver Anexo 6
“Muchos desarrolladores de aplicaciones subestiman el riesgo de ataques SQL Injection a aplicaciones
web que usen Oracle como base de datos de respaldo final” [10], aunque Oracle represente una alternativa
muy confiable, ningún desarrollador o analista de seguridad debe bajar sus defensas frente a los ataques de
SQL Injection. Debemos percatarnos de que por su amplia divulgación y su alto porcentaje de efectividad,
la sofisticación de estos ataques se encuentra en aumento y así mismo deberían aumentar los esfuerzos por
detectar vulnerabilidades, corregir fallas y proteger las aplicaciones e interfaces con el fin de garantizar la
seguridad e integridad de la información [9]. Entre el 2007 y el 2010 los ataques de inyección, entre los
cuales encontramos el SQL Injection como el principal representante, pasaron del segundo lugar al
primero en el Top 10 presentado por OWASP anualmente en el cual se clasifican los principales ataques y
vulnerabilidades en aplicaciones web. En el segundo lugar actualmente se encuentra el Cross Site
Scripting (XSS), que como veremos más adelante también representa una amenaza para Oracle [11] [12].
OWASP califica los ataques de inyección de fácil uso, frecuencia común, detectabilidad promedio e
impacto severo; pueden ser realizados por cualquier persona que pueda enviar datos no confiables al
sistema, incluyendo usuarios externos, usuarios internos, y administradores del sistema. Entre las
principales consecuencias podemos encontrar perdida de información, falta de responsabilidad,
31
denegación de servicios y en algunos casos pueden llevar a la toma de posesión total del servidor por parte
del atacante [11].
Los ataques de SQL Injection se aprovechan principalmente, de las malas prácticas de desarrollo de
aplicaciones, explotando la falta de un manejo adecuado de la entrada de datos por parte del usuario que
posteriormente serán usados en sentencias SQL [10]. Los atacantes engañan al motor de la base de datos
para que este ejecute comandos no deseados, suministrando cadenas de texto hechas especialmente para
este fin, consiguiendo así acceso no autorizado a la base de datos para visualizar o manipular información
restringida [12].
La mayoría de estos ataques se presentan en interfaces web, por el hecho de que en una aplicación web el
atacante puede realizar ataques de SQL Injection sin ninguna autenticación en la base de datos o la
aplicación. Dicho esto, es claro que estas representan una vulnerabilidad para las organizaciones y por
ende debe realizarse un análisis cuidadoso del beneficio de proveer acceso web frente al costo de la
posible pérdida de información [10] [12].
Las técnicas de SQL Injection pueden variar, pero todas explotan una misma vulnerabilidad: “Cadenas de
texto validadas o no validadas que son concatenadas en una sentencia SQL dinámica, e interpretadas como
código por el motor SQL” [12].
Oracle se ha manejado bien frente a los ataques de SQL Injection por varias características entre las cuales
es de destacar el uso de bind arguments(variables de enlace)que si bien fueron diseñadas principalmente
para mejorar el desempeño, proveen también una fuerte protección contra dichos ataques cuando se
programa SQL dinámico pues obligan a la base de datos a utilizar exclusivamente el valor de la variable y
no interpretar su contenido de ningún modo [12] [10] [13]. Aunque Oracle puede proveer mayor
protección frente a estas técnicas, que otras bases de datos, aplicaciones sin las defensas apropiadas
pueden ser vulnerables [10].
Para inmunizar cualquier código contra ataques SQL Injection, deben usarse bind arguments, bien sea
automáticamente en SQL estático o explícitamente en SQL dinámico, y adicionalmente validar y
desinfectar cada entrada concatenada a SQL dinámico. La validación comprueba que la entrada cumpla
ciertos criterios (Ej. que no contenga comillas simples independientes) y la desinfección modifica la
entrada para asegurar que es válida (Ej. doblar las comillas simples) [12]. Oracle provee un paquete
PL/SQL llamado DBMS_ASSERT, el cual contiene funciones que permiten validar y desinfectar cadenas
de entrada [12].
32
En el Anexo 26 se presenta un diagrama de flujo que expone los pasos para medir la vulnerabilidad de
cualquier código SQL.
Para detalles más específicos sobre cómo protegerse frente a técnicas de SQL Injection al programar en
PL/SQL, se recomienda revisar el tutorial provisto por Oracle titulado “SQL Injection Tutorial” el cual es
gratuito, descargable y contiene lecciones por capítulos con evaluaciones interactivas al final de capa
sección [12].
2.4.2 TIPOS DE ATAQUES SQL INJECTION
Tras revisar varias categorizaciones de los ataques de inyección se decidió unir las dos que consideramos
más relevantes y acertadas, relacionándolas entre sí como se expondrá a continuación. Los ataques de
inyección son comúnmente divididos en:
2.4.2.1 ATAQUES DE PRIMER ORDEN
El atacante simplemente ingresa una cadena de texto maliciosa y provoca que el código modificado sea
ejecutado inmediatamente. El ejemplo más común consiste en modificar la cláusula WHERE de una
consulta de autenticación para que siempre retorne verdadero [12].
2.4.2.2 ATAQUES DE SEGUNDO ORDEN
El atacante inyecta en datos almacenados permanentemente que son considerados una fuente confiable
(Ej. una fila de una tabla) y posteriormente otra actividad ejecuta el ataque indirectamente [12]. Este tipo
de ataques requieren un mayor conocimiento de la aplicación objetivo y aprovechan la naturaleza stateless
de muchas aplicaciones web que acostumbran pasar información entre páginas almacenando valores en la
base de datos, generando así una vulnerabilidad [10].
2.4.2.3 INYECCIÓN LATERAL
El atacante puede explotar procedimientos PL/SQL que ni siquiera reciben entrada de usuario. Contrario a
lo que se puede pensar, cuando una variable cuyo tipo es de fecha o numérico, y está concatenada en el
texto de una sentencia SQL, puede existir una vulnerabilidad [12].
Adicionalmente podemos dividir los ataques de SQL Injection a Oracle en las siguientes categorías [10]:
1. SQL Manipulation
2. CodeInjection
3. FunctionCallInjection
33
4. Buffer Overflows
Las dos primeras categorías pueden incluirse dentro de los ataques de primer orden mencionados
anteriormente, son las más comunes, y se aplican a todos los tipos de bases de datos. Aunque la segunda
sea menos común en Oracle que en otras bases de datos, por el hecho de no soportar peticiones de
múltiples sentencias SQL por base de datos, se pueden presentar casos de Code Injection en Oracle
cuando se trabaja con SQL dinámico en PL/SQL [10] [12] [13].
Las últimas dos categorías contienen ataques más específicos a Oracle, son menos comunes que las
primeras, y por ende se encuentra menos documentación disponible sobre estas, lo cual incrementa su
aparición como vulnerabilidades en la mayoría de auditorías de seguridad realizadas a aplicaciones web
[10]. A continuación se expone con mayor detalle cada uno de los tipos de Inyección en Oracle, pero se
hará énfasis en los últimos dos tipos por las razones mencionadas anteriormente.
2.4.3 SQL MANIPULATION
SQL Manipulation representa el tipo más común de ataque de SQL Injection. El atacante intenta modificar
la sentencia SQL adicionando elementos a la cláusula WHERE o extendiendo la consulta con operadores
como UNION, INTERSECT o MINUS [10]. El ejemplo clásico de este ataque se presenta en la
autenticación de usuarios de una aplicación donde se ejecuta una consulta como la siguiente:
SELECT * FROM usuarios
WHERE nombreusuario= „miusuario‟ and contraseña = „micontraseña‟
El atacante podría manipular la sentencia SQL con una consulta como esta:
SELECT * FROM usuarios
WHERE nombreusuario= „miusuario‟ and contraseña = „micontraseña‟ or „1‟ = „1‟
Si no se tienen las medidas adecuadas de verificación en la aplicación, la consulta anterior retornaría
verdadero para todas las filas basándose en la precedencia de operadores [10].
También suele ser común el uso del operador UNION para retornar filas de otra tabla. Por ejemplo se
puede intentar listar todos los productos disponibles de una tienda y usando este operador hacer que se
listen también todos los usuarios de la base de datos [10].
34
2.4.4 CODE INJECTION
Este ataque consiste en inyectar comandos o sentencias dentro de una sentencia SQL. Este tipo de ataque
no es tan común en Oracle como en otras bases de datos debido a que Oracle no proporciona ninguna
sentencia correspondiente a la sentencia EXECUTE (SQL Server), ni permite la solicitud de ejecución de
varias sentencias por base de datos [10].
Sin embargo algunas API‟s permiten ejecutar dinámicamente bloques anónimos de PL/SQL los cuales son
vulnerables ante un ataque de Code Injection.
Por ejemplo, un atacante puede manipular el bloque PL/SQL, que ejecuta un proceso almacenado de la
base de datos que cifra y almacena una contraseña de usuario [10]:
BEGIN ENCRYPT PASSWORD ('Javeriana', 'micontraseña'); END;
Y convertirlo en el siguiente [10]:
BEGIN ENCRYPT PASSWORD ('Javeriana', 'micontraseña'); DELETE FROM users WHERE upper
(username) = upper ('admin'); END;
2.4.5 FUNCTION CALL INJECTION
Los ataques de FunctionCallInjection insertan funciones Oracle o funciones tradicionales dentro de
sentencias SQL vulnerables con el fin de invocar llamadas de sistema operativo o manipular información
almacenada en la base de datos [10].
Oracle permite ejecutar funciones como parte de sentencias SQL y adicionalmente provee más de 1000
funciones contenidas en aproximadamente 175 paquetes, de las cuales sólo algunas pocas son útiles para
ataques de SQL Injection. Cualquier función tradicional o que esté almacenada en un paquete tradicional
puede ser invocada desde una sentencia SQL [10].
Principalmente, sólo las funciones ejecutadas dentro de sentencias INSERT, UPDATE o DELETE pueden
modificar información almacenada en la base de datos. Usando las funciones estándar de Oracle, un
atacante puede enviar información a otras máquinas o ejecutar nuevos ataques desde el servidor de la base
de datos. Muchas aplicaciones basadas en Oracle incluyen paquetes que pueden ser explotados por un
atacante. Estos pueden contener funciones que cambien contraseñas o realicen actividades sensibles de
transacciones [10].
35
El principal asunto a tener en cuenta cuando tratamos Function Call Injection, es que cualquier sentencia
SQL generada dinámicamente es vulnerable, incluso las sentencias más sencillas. A continuación se
mostrara un ejemplo que corrobora lo recientemente afirmado [10]:
SELECT TRANSLATE(„entradaDeUsuario‟,
„0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ‟,
„0123456789‟)
FROM dual;
Esta sentencia que hace uso de la función TRANSLATE de la base de datos, no es vulnerable a otros tipos
de inyección pero puede ser manipulada de la siguiente manera para realizar un ataque de Function Call
Injection [10]:
SELECT TRANSLATE ('' || UTL_HTTP.REQUEST('http://192.168.1.1/') || '',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789')
FROM dual;
La anterior sentencia hace un REQUEST a una página de un servidor web. El atacante podría manipular
dicha sentencia para recopilar información de la base de datos y enviarla a al servidor web especificado en
la URL, o bien, si la base de datos está tras un firewall, podría atacar otros servidores en la red interna
[10].
Las funciones tradicionales también pueden ser ejecutadas en este tipo de ataques, particularmente las que
se encuentran marcadas como “PRAGMA TRANSACTION”, pues pueden ser ejecutadas bajo cualquier
circunstancia especial, y por estar marcadas de esta manera pueden escribir en la base de datos incluso
dentro de una sentencia SELECT [10].
Un claro ejemplo del uso de este ataque fue presentado el presente año por David Litchfield en la
conferencia de seguridad “BlackHat DC 2010”, en su ataque, Litchfield combina Lateral Injection,
Function Call Injection y PL/SQL Injection para aprovechar la implementación implícita de Java en
Oracle, que ha sido denominada Aurora, y así tomar control total de la base de datos [14] [15].
El ataque comienza obteniendo privilegios arbitrarios de Java desde una sesión con pocos privilegios,
haciendo uso del paquete DBMS_JVM_EXP_PERMS, el cual usualmente permite importar o exportar las
políticas de java entre distintos servidores de la base de datos. Este paquete, puede ser ejecutado por el rol
36
PUBLIC,
es
decir,
por
cualquier
usuario
común
e
incluye
un
procedimiento
llamado
IMPORT_JVM_PERMS que recibe como argumento una Java Policy. Un atacante puede crear su propia
Policy y enviarla como argumento a esta función, y al hacer esto, como el procedimiento se ejecuta con
privilegios de SYS, la Policy creada por el atacante es adicionada a la tabla JAVA$POLICY$,
permitiéndole al atacante concederse a sí mismo permisos Java arbitrarios como por ejemplo el permiso
Java execute para todos los archivos [14] [15].
2.4.6 BUFFER OVERFLOWS
Varias funciones estándar de Oracle son susceptibles a Buffer Overflows que pueden ser aprovechados
mediante el uso de SQL Injection sobre bases de datos que no tengan las actualizaciones y parches de
seguridad adecuados. Algunos de los paquetes y funciones estándar de la base de datos que son
vulnerables
sonTZ_OFFSET,
TO_TIMESTAMP_TZ,
AND
BFILENAME,
FROM_TZ,
NUMTOYMINTERVAL, y NUMTODSINTERVAL [10].
Un ataque de Buffer Overflow es ejecutado usando los métodos de Function Injection descritos
anteriormente para llamar las funciones vulnerables mencionadas en el párrafo anterior. Haciendo uso de
Buffer Overflowsse puede llegar a obtener acceso remoto al sistema operativo. Adicionalmente, algunas
aplicaciones y servidores web no manejan adecuadamente la pérdida de conexión de la base de datos
debida a desbordamientos, haciendo de este tipo de ataques un potencial ataque de DoS 3 que será efectivo
por ejemplo si un proceso web se queda colgado esperando a que la conexión con un cliente termine [10].
Tras categorizar los principales tipos de ataques a bases de datos Oracle y con la ayuda de las secciones
anteriores, pasaremos a revisar las técnicas forenses que pueden ser usadas cuando se investiga un entorno
Oracle en busca de rastros de los ataques expuestos anteriormente.
2.5 TÉCNICAS FORENSES EN BASES DE DATOS ORACLE
Entender los conceptos básicos de Oracle y los principales tipos de ataques expuestos en secciones
anteriores nos permite comprender con mayor facilidad dónde están situadas las principales fuentes de
evidencia en Oracle y de qué manera se manifiestan los diversos tipos de ataques en las diversas
estructuras de la base de datos. Para hacer más claros, específicos y repetibles los análisis expuestos a
continuación, se hace esencial definir un entorno y posteriormente aventurarse a explorar con
detenimiento las estructuras de la base de datos.
3
DoS: Denegación de servicio (Denial Of Service)
37
2.5.1 ENTORNO
Todos los análisis y conclusiones que serán expuestos en las siguientes secciones se llevaran a cabo en una
instalación de Oracle 11g release 1 recién instalada, es decir, sin haber aplicado parches de seguridad,
corriendo en un servidor Windows server 2008 Enterprise. Definir claramente el entorno de análisis se
hace importante pues las conclusiones que se expondrán posteriormente pueden no aplicar para otras
versiones de Oracle corriendo en otros sistemas operativos [16].
Se trabajara sobre una versión sin parches de la base de datos pues algunos de dichos parches corrigen
vulnerabilidades expuestas en este trabajo, y con la intención de reforzar la importancia tanto de la
instalación de parches como de la adecuada administración de la base de datos en general, nos
enfocaremos en el estudio de las vulnerabilidades de una instancia de la base de datos recién instalada.
2.5.2 PRINCIPALES FUENTES DE EVIDENCIA EN ORACLE
Cuando se habla de análisis forense en bases de datos Oracle se hace imposible no mencionar a David
Litchfield, considerando como uno de los pioneros y mayores promotores tanto de la investigación de
vulnerabilidades, como del respectivo análisis de rastros que quedan en la etapa posterior a un ataque a
una base de datos Oracle. Por esto decidimos retomar la clasificación propuesta por dicho investigador en
el 2007 sobre las principales fuentes de evidencia [17]:

Redo Logs

Archivos TNS Logs

Archivos Trace de Oracle

Datafiles Oracle

Apache Logs(Servidor de aplicación Oracle)
A continuación, examinaremos en detalle las cuatro primeras fuentes mencionadas, explicando que tipos
de evidencia se pueden encontrar en cada una y que estrategias y/o herramientas podemos utilizar cuando
llevamos a cabo una investigación forense sobre una base de datos Oracle. Dado que el foco de la
investigación son los rastros propios del manejador, el análisis de los rastros de los logs de apache estará
fuera del alcance de este documento.
2.5.2.1 REDO LOGS
38
El RDBMS de Oracle fue pensado para proveer poder de recuperación y por esto mismo es que cada vez
que ocurre un evento en la base de datos, por ejemplo la creación de una tabla, se guarda un registro
exacto en un log de manera que si es necesario en caso de un fallo, cualquier cambio pueda ser realizado
de nuevo. Esto tiene un valor grandísimo para un investigador forense pues dependiendo de la
configuración de la base de datos, cualquier acción ejercida por un atacante que haya cambiado el estado
de la base de datos debe quedar registrada en los Logs [16].
2.5.2.1.1 ¿Cómo operan los Redo Logs?
Cada cambio a la base de datos genera un registro del evento conocido como “redo entry” y es escrito en
los buffers de la base de datos en la memoria SGA del servidor. Cada 3 segundos o cuando sucede un
COMMIT, el LGWR descarga estos buffers a un conjunto de archivos en disco conocidos como “The
Online Redo Log” [16].
Al instalar Oracle y crear la base de datos, se configura cuántos grupos de archivos de redo log se tendrán,
cuántos archivos contendrá cada grupo, y qué tamaño se le asignara a cada uno de dichos archivos. En
nuestro caso escogimos la opción por defecto que es de un grupo de Redo Logs conformado por 3 archivos
redo log cada uno con un tamaño de 51200K. A continuación se muestra una captura de pantalla del
proceso de configuración de los Redo Logs y otros archivos de la base de datos durante la creación de la
base de datos. Ver Anexo 7
Cuando uno de los archivos de este conjunto se llena, el servidor cambia al siguiente archivo. Cuando
todos los archivos se llenan, el servidor retorna al primero y comienza a sobrescribir entradas anteriores.
Para evitar perder información que puede ser requerida para recuperar la base de datos, Oracle tiene un
proceso de Archivo en segundo plano (ARCn) que guarda los archivos de Redo Logs cuando se llenan. Sin
embargo es importante notar que no todas las bases de datos tienen la función de archivado activada,
dependiendo de si un servidor tiene esta función activada se dice que trabaja en modo ARCHIVELOG o
NONARCHIVELOG. Este punto es muy importante para el examinador forense pues si esta función no
está activada, la evidencia de ataques puede ser sobrescrita rápidamente [16].
Como la cantidad de consultas que modifiquen el estado de la base de datos tiene un efecto en la rapidez
con que se sobrescriba evidencia, un atacante puede usar esto como ventaja. Se puede revisar si la función
de archivado esta activa mirando el valor del parámetro LOG_ARCHIVE_START en el archivo de
39
parámetros de inicio del servidor o ejecutando el siguiente comando SQL durante la investigación de
respuesta en vivo [16]:
SELECT VALUE FROM V$PARAMETER WHERE NAME = „log_archive_start‟;
2.5.2.1.2 ¿Por qué no simplemente usar “ALTER SYSTEM DUMP LOG FILE”?
El archivo binario de Redo Log puede descargarse a un archivo ASCII legible en cualquier editor de texto
usando este comando, aunque parezca que esto permite realizar un análisis sin necesidad de interpretar la
versión binaria esto es incorrecto pues el analista forense no siempre tiene acceso a un servidor de bases
de datos Oracle que pueda usar para descargar el archivo, no se puede usar el servidor comprometido pues
al hacerlo se sobre escribirán porciones del disco en el sistema comprometido con la posibilidad de
destruir evidencia en forma de archivos eliminados. Adicionalmente el archivo generado no muestra toda
la información que realmente existe en el archivo original pues el proceso de LGWR va asignando
números de secuencia a los archivos y sólo los archivos con el número actual de secuencia serán
descargados. Por último, el texto de cualquier sentencia DDL4 puede ser encontrado en el archivo binario
mas no en el archivo descargado con el comando DUMP implicando que el investigador forense no vea
toda la evidencia disponible [16].
2.5.2.1.3 Formato binario de un Redo log
Muchos de los archivos binarios Oracle y particularmente los archivos de log que son los que nos
interesan en esta sección, tienen dos encabezados, el encabezado del archivo como tal, y el encabezado del
Redo log en sí, adicionalmente, cada bloque posee su encabezado. A continuación explicaremos
brevemente cada uno [16]:
 El encabezado del archivo: contiene información del archivo en sí como tipo, cantidad de bloques y
tamaño de los bloques, Magic (identificador de un archivo Oracle), Checksum de integridad.
 El encabezado del Redo Log: contiene información pertinente a la instancia de la base de datos en sí
misma. Por ejemplo El SID de la Base de datos, la versión de la base de datos, la fecha en que
comenzó el logging y cuatro SCN„s5 que son usados para indicar una instancia particular de un estado.
2.5.2.1.4 Encabezado del archivo
Así se ve el encabezado del archivo de ejemplo REDO01.log. Ver Anexo 40.
4
5
DDL: Lenguaje de definición de datos (Data DefinitionLanguage)
SCN: Numero de cambio del sistema (SystemChangeNumber)
40
Tipo de archivo: 0x22 es el identificador que corresponde a los archivos de Redo log. [16]
Tamaño del archivo: Tamaño de bloque * (numero de bloques +1) [16]
Para nuestro caso 512 es el tamaño de un bloque pues es el valor asignado por Windows, y tenemos un
total de 102400 + 1 bloques pues se debe sumar el bloque del encabezado en sí. Finalmente al realizar la
multiplicación obtenemos el tamaño total del archivo que es de (Ver Anexo 40.):
512* 102401 = 52429312 bytes y lo podemos confirmar revisando las propiedades del archivo.
Magic: Es un marcador usado por Oracle para identificar sus archivos. [16]
2.5.2.1.5 Encabezado de un bloque
Cada bloque cuenta con su propio encabezado de 16 bytes, incluso si una Redo Entry debe ser dividida en
dos bloques. Por esta razón es de gran importancia considerar este aspecto, especialmente a la hora de
buscar cadenas de caracteres en los Redo Logspues dichas cadenas pueden encontrarse divididas en dos
bloques y por ende estarán divididas por un encabezado de bloque como se muestra en el siguiente
ejemplo. [16]
En el Anexo 41 podemos ver como la sentencia CREATE PROCEDURE se encuentra truncada por el
encabezado de un nuevo bloque, que podemos identificar por la estructura mostrada. A la hora de realizar
una investigación forense, los dos aspectos más importantes de este encabezado son el desplazamiento y la
suma de verificación. [16]
El Desplazamiento nos indica cuántos bytes debemos movernos desde el comienzo del bloque para llegar
al comienzo de la siguiente redo entry cuando se ha tenido que truncar alguna. [16]
La suma de comprobación nos permite verificar la integridad de un bloque. Para esto cada uno de ellos es
dividido en sub bloques de 64 bytes y para realizar la verificación de los mismos se lleva a cabo el
siguiente proceso para cada uno de los sub bloques mencionados [16]:
1. XOR entre el primer conjunto de 16 bytes con el segundo.
2. XOR entre el segundo conjunto de 16 bytes con el tercero.
3. XOR entre los resultados de los puntos 1 y 2
4. XOR entre el primer y el segundo bloque de 4 bytes del resultado del punto 3
5. XOR entre el resultado del punto 4 y el tercer conjunto de 4 bytes resultante del punto 3
6. XOR entre el resultado del punto 5 y el cuarto conjunto de 4 bytes resultante del punto 3
41
7. El punto 6 resulta en cuatro bytes llamados DWORD (Double Word) de este resultado debemos
comparar los 16 bits más significativos con los 16 menos significativos, si son iguales entonces la
suma de verificación es correcta.
Si los 16 bits más significativos de la DWORD resultante no coinciden con los 16 menos significativos,
significa que hay algún problema con el bloque. La suma de verificación puede ser “reparada” realizando
un XOR entre el resultado del punto 7 y la suma de verificación que aparece en el encabezado del bloque.
[16]
Por ejemplo si la suma de verificación de un bloque es 0x4E50 y la DWORD resultante después de llevar
a cabo todas las operaciones XOR pertinentes es 0x59B109B1 entonces tendremos 0x59B1 para los 16
bits más significativos y 0x09B1 para los menos significativos. Al realizar un XOR entre estos dos
conjuntos de bits obtendremos 0x5000, si la suma de verificación fuera correcta, deberíamos haber
obtenido 0x0000. Como este no es el caso, hacemos un XOR entre el resultado obtenido tras el proceso de
verificación (DWORD) y la suma de verificación original para obtener lo siguiente [16]:
0x4E50 XOR 0x5000 = 0x1E50
Si a continuación cambiáramos la suma de verificación por 0x1E50, la verificación sería exitosa, aunque
el bloque estuviera corrupto. Esta situación será analizada más adelante en la sección2.7.1Técnicas anti
forenses en contra del Redo Log [16].
Con el fin de brindar mayor claridad al proceso de verificación, explicamos la secuencia de pasos de
manera gráfica y detallada en el Anexo 8.
2.5.2.1.6 Encabezado del Redo Log
En el Anexo 42 podemos ver que se tienen 4 SCN6 o números de cambios del sistema distintos: de inicio,
siguiente, habilitado y de hilo cerrado. Cada uno de estos tiene asociado un timestamp. Estos números de
cambios del sistema le permiten a Oracle indicar una instancia particular de un estado, es decir, si el
estado de la base de datos cambia por ejemplo por la ejecución de una sentencia INSERT seguida de un
COMMIT, Oracle puede seguir este cambio usando un SCN. Si se requiere restaurar la base de datos a un
estado anterior, esto puede ser logrado usando los SCN para indicar cuál “versión” o a qué punto de la
base de datos desea retornar específicamente. [16]
6
System Change Number, también conocidos como System commit numbers
42
2.5.2.1.7 ¿Cómo se registra el tiempo en los Redo Logs
Cada entrada Redo tiene asociada una estampilla de tiempo medida en segundos que puede ser usada por
el examinador forense para construir una línea de tiempo. Es importante notar que dicha estampilla es
relativa al momento en que la entrada fue escrita en el archivo y no a cuando sucedió el evento
relacionado y esto puede implicar un retardo entre el momento en que sucede un evento y el instante en
que este se escribe en disco. Específicamente se puede afirmar que no se debe confiar totalmente en la
precisión de las estampillas para operaciones DML7 mas por otro lado puede considerarse adecuada la
estampilla de las operaciones DDL para construir una línea de tiempo pues son comprometidas
inmediatamente [16].
2.5.2.1.8 ¿Qué es una RedoEntry?
UnaRedo Entrycontiene todos los cambios para un SCN dado. La entrada tiene un encabezado y uno o
más “vectores de cambio”. Puede haber uno o más vectores de cambio para un evento dado. Por ejemplo,
si un usuario realiza un INSERT en una tabla que tiene un índice entonces se crean varios vectores de
cambio. Habrá un vector Redo y un vector Undo para el INSERT y luego una fila para el índice y un
commit. Cada vector de cambio tiene su propio código de operación que puede ser usado para
diferenciarlos [16]:
5.1 Undo Record
5.4 Commit
11.2 INSERT on single row
11.3 DELETE
11.5 UPDATE single row
11.11 INSERT multiple rows
11.19 UPDATE multiple rows
10.2 INSERT LEAF ROW
10.4 DELETE LEAF ROW
13.1 Allocate space [e.g. after CREATE TABLE]
24.1 DDL
El examinador forense debe desplazarse por cada entrada Redo, deducir qué paso e intentar separar las
entradas normales de las que parezcan ser parte de un ataque [16].
7
Lenguaje de manipulación de datos (Data ManipulationLanguage)
43
2.5.2.1.9 Examinando operaciones DML
Las sentencias de manipulación de datos causan cambios en el estado de la base de datos y por lo tanto se
crea una RedoEntry. Si un atacante realiza cualquiera de esas operaciones entonces se deben poder
encontrar en el Redo Log [16].
Por ejemplo en el archivo hexadecimal generado por un INSERT podemos encontrar el objeto en el cual
fueron insertados datos. Un examinador forense, durante la investigación, habrá descargado la lista de
objetos, los tipos, y los propietarios de cada objeto en la base de datos. Usando esto, puede ver en cuál
tabla se insertó y cuántos datos se insertaron [16].
Después de un vector de cambio Redo INSERT hay dos vectores de cambio, un encabezado Undo y un
Undo. El Undo contiene el Id del usuario asociado con el INSERT. Haciendo uso de esto el investigador
forense puede confirmar si el usuario encontrado tenía permisos de inserción en la tabla o si usó alguna
modalidad de SQL Injection para efectuar un ataque [16].
2.5.2.1.10 Examinando operaciones DDL
Una manera fácil y rápida de descargar sentencias DDL de los Redo Logs es usar una utilidad como
“strings”, grep” o “findstr”. Sin embargo se debe tener cuidado pues si el texto de una sentencia DDL
pertenece a la frontera de dos bloques, el texto se cortara en la mitad. Así, si se busca por “GRANT” y el
“GRA” está en el final de un bloque y el “NT” esta al comienzo del siguiente, no se encontrará [16].
2.5.2.1.11 Realizar un post-mortem de los Redo Logs después de un ataque
Muchos ataques en Oracle se basan en distintas vulnerabilidades SQL Injection pero sin importar la
modalidad, las acciones del atacante aparecen en los Redo Logs. Es críticamente importante para un
examinador forense notar que a pesar de que una acción DML sea iniciada por otro usuario, la entrada
Redo mostrara el Id del usuario de la cuenta que posee el Stored Procedure vulnerable lo cual tiene
sentido pues es la cuenta que está ejecutando la sentencia en realidad [16].
Como fuente adicional de información y como complemento a la evidencia que se ha mostrado se puede
obtener de los Redo Logs, tenemos la información contenida en los Data Files de Oracle. Por este motivo
la siguiente sección tiene como objeto estudiar la manera de detectar objetos eliminados examinando
dichos Data Files y recuperar evidencia que pueda ser relacionada con los eventos en los Redo Logs con
el fin de llevar a cabo una investigación forense confiable.
44
2.5.2.2 ORACLE DATAFILES
“Una base de datos se divide en unidades lógicas denominadas TABLESPACES. Un tablespace no es un
fichero físico en el disco, simplemente es el nombre que tiene un conjunto de propiedades de
almacenamiento que se aplican a los objetos (tablas, secuencias…) que se van a crear en la base de datos
bajo el tablespace indicado. Un datafile es la representación física de un tablespace. Es el "fichero de
datos" donde se almacena la información físicamente.” [18]
2.5.2.2.1 OBJETOS ELIMINADOS (DROPPED OBJECTS)
Después de tener éxito atacando un servidor de bases de datos, el atacante seguramente tratara de ocultar
sus actos, lo cual incluye “eliminar” los objetos que se crearon durante el ataque tales como tablas,
funciones o procedimientos. En la mayoría de los casos, aunque un objeto haya sido “bajado” (dropped),
habrá pedazos restantes de este que pueden ser “cosidos” para dar una imagen clara de las acciones del
atacante. Sin embargo dependiendo de con que velocidad se realice la investigación pertinente, dicha
evidencia puede perderse parcial o totalmente. [19]
2.5.2.2.1.1 Bloques de datos Oracle
Antes de investigar los objetos borrados es pertinente analizar los bloques de datos Oracle. Todo archivo
de datos, está dividido en bloques. El tamaño de cada bloque está definido por el servidor usando el
parámetro de inicialización DB_BLOCK_SIZE. Existen diferentes tipos de bloques que almacenan
información diferente como datos de tablas, datos de índices, datos de agrupamiento, ente otros. Cada
bloque está dividido en sub secciones. En el Anexo 9 se puede ver una ilustración de un bloque de datos
Oracle y sus secciones [19].
En la sección 2.5.2.1.3 hablamos acerca de los encabezados de un archivo, de un redo log y de un bloque,
estos encabezados son muy similares a los tratados en dicha sección. Después del encabezado tenemos un
directorio de tabla y un directorio de filas, ambos de tamaño variable. El directorio de filas contiene
información sobre cuantas filas de datos hay en el bloque y por cada una de estas tiene una entrada de dos
bytes que apunta a los datos reales de la fila. Este apuntador se añade al corrimiento (offset) dentro del
archivo del comienzo del bloque del directorio de filas para dar un desplazamiento a la ubicación de la
fila de datos. [19]
45
La información de filas se escribe de abajo hacia arriba consumiendo el espacio libre del bloque, cuando
esté está lleno, el servidor comienza a llenar un nuevo bloque. Cada fila en el bloque tiene un encabezado
de tres bytes. [19]
El primer byte es un marcador que contiene flags indicando el estado de la fila. Por ejemplo si una fila es
borrada, el quinto bit del primer byte es “encendido”. Un estado común para el conjunto marcador del
primer byte de una fila es 0x2C, que se convertiría en 0x3C cuando se encienda el flag de borrado. Este es
un indicador clave cuando se están buscando objetos [19]. Ver Anexo 43.
El segundo byte del encabezado de una fila es usado para determinar el estado de bloqueo, y el tercer byte
contiene la cantidad exacta de información (columnas) que efectivamente hay en la fila. Si la cantidad de
información supera los 255 bytes, entonces el encabezado de la fila es de 4 bytes para permitir hasta
65536 bytes. Justo después del encabezado de la fila se encuentran los datos como tal. Cada columna es
precedida por un byte indicando su tamaño. Si alguna determinada columna es nula, se representa con un
0xFF. En el Anexo 43 se presenta un ejemplo [19].
En este volcado hexadecimal podemos identificar que estamos tratando con una fila borrada pues el
primer byte del encabezado se encuentra en 0x3C. Adicionalmente podemos deducir que tenemos 17
columnas pues 0x11 equivale a 17 en decimal. Justo después del encabezado encontramos un contador de
longitud que nos indica cuántos bytes debemos desplazarnos para encontrar el siguiente contador y así
sucesivamente hasta llegar al número total de columnas, que en este caso como lo mencionamos es de 17.
Ver Anexo 43.
Cuando una fila es eliminada, tanto el espacio que habían ocupado los datos, como la entrada en el
directorio de filas quedan disponibles, pero mientras que llega el momento de ser utilizados de nuevo, esta
información permanece ahí disponible y recuperable para una investigación. Cuando tanto la entrada en el
directorio de filas como el espacio que antes ocupaba la fila permanecen sin ser reutilizados, Litchfield
llama a estos conjuntos filas borradas enlazadas y afirma que pueden ser detectadas fácilmente como se
mostrara más adelante. Cuando la entrada en el directorio de filas ha sido reutilizada pero el espacio que
ocupaba la fila aún no ha sido usado de nuevo, Litchfield las bautiza filas borradas flotantes y menciona
que son más difíciles de detectar que las enlazadas pero que con un poco más de esfuerzo también puede
conseguirse. [19]
46
2.5.2.2.1.2 ¿Cómo ubicar filas eliminadas?
Es importante poder señalar cuando una fila ha sido eliminada pues cuando un objeto (tabla) es eliminado,
todas las filas de datos relacionadas con dicho objeto son eliminadas, es decir, una fila eliminada es un
indicio de una tabla eliminada. Localizar una fila borrada es fácil, basta con tomar un bloque Oracle,
encontrar el directorio de filas y por cada entrada en este buscar la fila a la cual se está apuntando. Usando
el primer byte del encabezado de cada fila, nos desplazamos hasta el quinto bit y revisamos si esta
“encendido”, lo cual indicara que dicha fila ha sido eliminada (Existe algunas pocas excepciones en las
cuales aun si el quinto bit no está encendido, pueden existir filas eliminadas como lo es el caso de una fila
de la tabla OBJ$ que ha sido eliminada, estos casos son considerados “rarezas” de Oracle). Podemos saltar
de fila en fila sin tener en cuenta la información haciendo uso del último byte del encabezado de cada fila
para desplazarnos hasta el comienzo de la siguiente fila hasta el final del archivo. Una vez que hemos
recorrido todas estas filas borradas enlazadas cualquier información que no haya sido revisada, se
encuentra o bien flotando o ha quedado como restante de una operación de actualización anterior. Este
proceso debe ejecutarse para cada bloque asignado a tablas u objetos de interés. [19]
2.5.2.2.1.3 ¿Cómo ubicar bloques asignados a objetos de interés?
Existe una serie de tablas de interés cuando queremos localizar objetos eliminados, por ejemplo la tabla
OBJ$, también algunos grupos e índices. Sin importar de qué caso se trata, el proceso para ubicar la
información de tablas, grupos o índices eliminados es el mismo. Como se mencionó, cada bloque tiene un
encabezado dentro del cual podemos ubicar el ID del objeto al cual se encuentra asociado desplazándonos
24 bytes, haciendo uso de esta información es fácil ubicar los objetos de interés simplemente con abrir el
Data File y comparar en cada bloque el ID para ver si corresponde al del objeto en el cual estamos
interesados. Si el ID corresponde, analizamos el bloque en cuestión, en caso contrario proseguimos a
comparar el ID del siguiente bloque. [19]
2.5.2.2.1.4 Creación y eliminación de objetos
Es esencial comprender qué sucede cuando un objeto de la base de datos es creado pues esto determina y
ayuda a entender muchas de las ubicaciones en las cuales buscaremos más adelante. Cada vez que se crea
un objeto, se inserta una fila en la tabla OBJ$. Esta tabla tiene tres índices I_OBJ1, I_OBJ2 e I_OBJ3, y
una entrada es generada en cada uno de ellos cuando un objeto es creado. El I_OBJ2 indexa el nombre del
objeto y el ID del propietario. Dependiendo el tipo de objeto que es creado, se insertan otros valores en
otros lugares. Por ejemplo, cuando se crea una tabla, se inserta una fila a la tabla TAB$ y una o más filas a
la tabla COL$ dependiendo de las columnas de la nueva tabla. En el fondo, tanto la tabla TAB$ como
47
COL$ existen en el grupo C_OBJ# y es allí donde las filas son creadas realmente. La tabla COL& tiene un
índice I_COL1 que indexa el ID de objeto de la tabla y los nombres de columna de la tabla así que
información sobre la tabla también es insertada en este índice. Cuando se crea una función o un
procedimiento, una o más filas son insertadas en las tablas SOURCE$, IDL_UB1$ e IDL_CHAR$.
Pequeñas cantidades de información sobre el objeto son almacenadas en toda la base de datos, siendo esto
lo que eventualmente nos dará pistas cuando estemos tratando de ubicar un objeto eliminado.Todas estas
tablas, índices y grupos, son de interés para el investigador y deben ser examinados exhaustivamente. [19]
Ahora que hemos estudiado lo que sucede cuando un objeto es creado, pasaremos a entender lo que
sucede cuando un objeto es eliminado. Cuando se elimina un objeto, la fila en la tabla OBJ$ se marca
como eliminada cambiando el marcador de 0x2C a 0x3C, lo que como explicamos anteriormente, equivale
a “encender” el quinto bit del primer byte del encabezado de la fila. Toda la información como el nombre
del objeto, su ID, etc, aún persisten, solo que la fila es marcada como eliminada. Podríamos comparar esta
situación con la que tiene lugar cuando eliminamos un archivo en Windows y el sistema operativo
simplemente deja de mostrar dicho archivo mientras que la información permanece guardada en los
clústeres del disco magnéticamente hasta que se realice una sobre escritura, caso en el cual aún se puede
recuperar la información con técnicas y herramientas forenses especiales como File Scavenger. Así como
simplemente se marcan como eliminadas las filas en la tabla OBJ$, sucede con las demás tablas que han
almacenado información referente al objeto y con la información almacenada en los índices respectivos.
[19]
Para versiones iguales o posteriores a Oracle 10g como es nuestro caso, Oracle provee una funcionalidad
llamada flash back, que permite trabajar sobre estados pasados de la base de datos sin necesidad de
realizar una restauración a un estado anterior en el tiempo. Esta funcionalidad permite realizar consultas
que retornan información del pasado, restaurar tablas a estados anteriores mientras la base de datos sigue
en línea y rastrear y archivar automáticamente cambios transaccionales en los datos. [20]
Si se tiene activada la funcionalidad flash back (activada por defecto), cuando se elimina un objeto, se crea
una fila en la tabla de papelera de reciclaje RECICLBIN$. Si por algún motivo, en un momento posterior
la papelera de reciclaje es vaciada o el objeto en cuestión es vaciado de la papelera, dicha fila es marcada
como eliminada. Nuevamente, la información sigue ahí, solo que el marcador es cambiado de 0x2C a
0x3C. El espacio de cualquiera de las filas mencionadas que han sido marcadas como eliminadas, puede
ser reutilizado en cierto punto, destruyendo evidencia. Sin embargo como existen diversas ubicaciones
donde se almacena información de un objeto dado, existe una buena posibilidad de que no todas las filas
48
eliminadas relacionadas al objeto eliminado hayan sido reutilizadas cuando se lleve a cabo la
investigación de un servidor comprometido. [19]
2.5.2.2.1.5 ¿Cómo rastrear la evidencia?
Oracle provee varias funciones de auditoría integradas en sus versiones posteriores a la 9g, y aunque en el
caso de 11g vienen activadas por defecto, dichas características no siempre están activadas.
Adicionalmente muchas empresas se ven abrumadas por la cantidad de opciones a elegir y en muchos
casos optan por activarlas todas, lo cual genera registros muy extensos y por ende incómodos de leer y
analizar, así que finalmente deciden volver a desactivar todas las características. Usualmente las
compañías usan firewalls y sistemas de detección de intrusos para determinar si la red y/o el sistema
operativo están siendo usados anormalmente o abusados, entonces, ¿por qué no proteger el activo más
valioso de la compañía, la información? La auditoría de Oracle puede ayudar a detectar accesos no
autorizados o uso inadecuado de la información contenida en la base de datos. Para verificar el estado de
los parámetros de auditoría podemos usar la siguiente sentencia [21] [22] Ver Anexo 10:
SHOW PARAMETER AUDIT
Para activar las funciones de auditoría se debe modificar el parámetro AUDIT_TRAIL, el cual puede
recibir cualquiera de las siguientes opciones [21]:

none o false: Auditoría desactivada

db o true: Auditoría activada, con todos los registros almacenados en el proceso de auditoría de la
base de datos (SYS.AUD$).

db,extended: Igual que db, pero las columnas SQL_BIND y SQL_TEXT también son activadas.

xml: Auditoría activada, con todos los registros almacenados en formato XML.

xml,extended: Igual que xml, pero las columnas SQL_BIND y SQL_TEXT también son activadas.

os: Auditoria activada, con todos los registros dirigidos al proceso de auditoría del sistema operativo.
Como hemos mencionado antes, las opciones de auditoría de Oracle vienen desactivadas en algunas
versiones y en caso de ser activadas por una organización su utilización suele resultar fallida debido a un
manejo inadecuado. Supongamos que un DBA sospecha que uno de sus servidores ha sido comprometido
y no se tenían activadas las funciones de auditoría de Oracle. ¿Existe alguna evidencia para sustentar que
fue cometido un ataque? [22] [19]
49
2.5.2.2.1.6 ¿Cómo detectar tablas eliminadas?
Consideremos el volcado hexadecimal mostrado en la Ilustración 93, tomado del archivo SYSTEM.DBF
el cual es usado por el tablespace SYSTEM. Como podemos ver en el rectángulo azul, este bloque ha sido
asignado al objeto con ID 0x12 o 18 en decimal, que corresponde a la tabla OBJ$. Varios bytes más
adelante podemos observar un encabezado de una fila que ha sido marcada como eliminada (rectángulo
rojo) con el valor 3C. Ver Anexo 43.
Cuando mapeamos todas las entradas en el directorio de filas y bloqueamos los datos para cada entrada,
encontramos que existen un par de “lagunas”. Estas lagunas son filas borradas flotantes, en otras palabras,
hay información de filas presente mas no existen entradas para ésta en el directorio de filas. EL 0x3C
mostrado en la Ilustración 93 representa una fila borrada flotante. Con el comienzo del directorio de filas
en 0x189D379D debería haber una entrada de0x1759 pero no la hay, lo cual confirma que es una fila
borrada flotante. Aunque se puede ver en el ASCII de la derecha el nombre MY_TEMP_TABLE,
necesitamos extraer el resto de la información. [19]
2.5.2.2.1.7 ¿Cómo extraer la información?
El encabezado de la fila mostrado en la Ilustración 93 es 3C 01 11, como explicamos anteriormente, el
ultimo byte nos indica que tenemos 0x11 o 17 columnas, y antes de las datos de la columna siempre
encontramos un contador de la longitud de los datos. Entonces para extraer los datos recorremos las
columnas teniendo en cuenta las longitudes indicadas en dichos contadores. Ver Anexo 43.
Ahora nuestra labor consistirá en hacer que dicha información sea humanamente comprensible, para esto
debemos revisar los tipos de las columnas de la tabla que estemos estudiando, para nuestro caso las
columnas de la tabla OBJ$ tienen los tipos mostrados en el Anexo 11 [19].
Podemos notar que la tabla llamada MY_TEMP_TABLE fue creada por el usuario con ID 55, a las
17:07:37 del 23 de Marzo de 2007. También podemos ver que la tabla tiene 51846 como identificador de
objeto. Si realizamos una búsqueda en el Data file por el ID del objeto codificado (04 C3 06 13 2F),
encontraremos que también existe evidencia de esta tabla en la tabla MON_MODS$, los índices
I_MON_MODS$_OBJ y RECYCLEBIN$_OBJ, y en el grupo C_FILE#_BLOCK#. Una vez que hemos
localizado todos los demás ítems que han sido eliminados por el atacante, localizaremos la tabla eliminada
como tal y veremos, si es el caso, la información que contiene. [19]
50
2.5.2.2.1.8 ¿Cómo detectar funciones eliminadas?
Cuando una función es eliminada, extrañamente, el primer byte del encabezado de la fila asociada a dicha
función en la tabla OBJ$, permanece intacto, es decir, no se enciende el quinto bit del primer byte para
indicar una eliminación. En su lugar, son modificados los últimos dos bytes de la columna STIME y se
colocan en 0x3C, que como hemos visto, es el marcador típico para indicar algún objeto eliminado.
Aunque no se conoce la razón por la cual las funciones eliminadas son marcadas de esta manera
particular, conocerla nos permite localizarlas fácilmente. Ahora supongamos que en los bloques asignados
a la tabla OBJ$ no encontramos ningún indicio de una función eliminada, esto no implica necesariamente,
que no se hayan creado y eliminado funciones sino que existe la posibilidad de que la evidencia haya sido
sobrescrita. Para verificar esta posibilidad debemos examinar las tablas SOURCE$ e IDL_UB1 [19].
En el Anexo 27 podemos ver como el directorio de filas contiene varias entradas que apuntan a filas
borradas enlazadas, y la manera en que dicho enlace realiza se muestra en el Anexo 28. Todas estas filas
están asociadas al ID de objeto C3 06 13 33 que en decimal equivale a 51850. Con el fin de saber que
contenía dicho objeto podemos extraer el texto de la información borrada, es decir el contenido de dichas
filas [19]. Ver Anexo 27.
Este código pertenece a una función llamada EXTRACT_SYS_PASSWORD y aunque no sabemos quién
la creo, al no tener evidencia en los bloques de la tabla OBJ$, podemos ver que realiza una inserción de
datos en la tabla MY_TEMP_TABLE, que recientemente habíamos detectado como eliminada. Lo que
hace esta función es extraer el hash del password de la cuenta SYS e insertarlo en la tabla mencionad.
Para saber si el ataque fue exitoso debemos examinar la tabla IDL_UB1$, esta tiene un ID con valor 73,
entonces hacemos un volcado de todos los bloques asociados al objeto con ID 73. Dicho volcado se
muestra en el Anexo 29 y en este podemos encontrar algunas entradas borradas enlazadas relacionadas
con el mismo ID de objeto (51850), también podemos ver varios segmentos del texto de la función,
incluida su “sustancia” es decir, la inserción del password de la cuenta SYS en la tabla
MY_TEMP_TABLE. [19]
2.5.2.2.1.9 ¿Cómo encontrar la tabla MY_TEMP_TABLE?
De la información extraída de la tabla OBJ$ sabemos que el ID de objeto de la tabla eliminada es 51846,
entonces localizamos los bloques asociados a esta tabla en los data files pertenecientes al tablespace
USERS y buscamos el ID de objeto mencionado 24 bytes dentro del encabezado del bloque. El volcado
hexadecimal del Anexo 44 muestra uno de dichos bloques y como el directorio de filas no está vacío,
51
existe información. Podemos encontrar dicha información al final del bloque encerrada en verde, y
notaremos que en efecto, es el hash del password de la cuenta SYS. [19].
De todo lo anterior podemos concluir que el 23 de Marzo de 2007 a la 17:07:37, el usuario SCOTT creó
una tabla llamada MY_TEMP_TABLE con ID 51846. También en algún momento se creó la función
EXTRACT_SYS_PASSWORD con ID de objeto 51850 con el fin de insertar el hash del password del
usuario SYS en la tabla mencionada anteriormente. El hash del password efectivamente se encuentra en la
tabla, y aunque es muy probable que dicha función haya sido usada para obtener el hash, no podemos
asegurarlo, pues además del texto de la función, no existe ningún otro vínculo directo entre las dos. Dicho
esto podemos afirmar que existe una gran probabilidad de que la función EXTRACT_SYS_PASSWORD
haya sido creada como una función auxiliar de inyección en un ataque de PL/SQL injection en contra de
un paquete propiedad de SYS. [19]
Tras analizar la evidencia encontrada en los Data Files de Oracle y relacionarla con los eventos de los
Redo Logs, podemos conformar un buen conjunto de evidencia pertinente para una investigación forense.
De todos modos existen otras fuentes de información que aún no hemos revisado. A continuación se
explicará lo relativo al archivo donde se almacena el registro de eventos relacionados con el listener de
Oracle, hablaremos sobre las trazas de auditoría sobre el tráfico de red y veremos cómo hallar evidencia
adicional en el registro de comandos emitidos al listener.
2.5.2.3 TNS LISTENER, LISTENER LOG Y AUDIT TRAIL
El listener de Oracle, es el componente de software de la base de datos que maneja el tráfico de red entre
la base de datos, los clientes, y otras bases de datos. Oracle provee la opción de llevar un registro de las
actividades relacionadas con el TNS Listener en un archivo llamado Listener log. Este archivo permite
recolectar y analizar estadísticas del uso de la red, así como información sobre las peticiones de conexión
realizadas por los clientes, y registro de comandos RELOAD, START, STOP, STATUS, o SERVICES,
emitidos por la utilidad de control del listener (lsnrctl). [23] [24]
Oracle 11g tiene activada por defecto la opción de llevar los registros de eventos (LOG_STATUS=ON),
pero en algunas versiones anteriores o incluso en una 11g mal configurada podría estar desactivada, así
que como primera medida en este capítulo se recomienda revisar el estado del parámetro LOG_STATUS
y activar el registro en caso de estar desactivado. Cuando el registro está activado, el directorio por defecto
dependiendo
de
la
versión
puede
ser:
$ORACLE_HOME/network/admino
52
C:\app\<USUARIO>\diag\tnslsnr\<NOMBRE_DE_LA_MAQUINA>\listener\alerty el archivo de registro
es <SID>.log o log.xml [23]
En el registro del archivo podemos encontrar un timestamp, comando emitido, y código de resultado. Si se
retorna un error de Oracle, también incluirá el mensaje de error. En el Anexo 37 presentamos un cuadro
donde se muestran algunos errores TNS que pueden significar ataques o actividad inapropiada referente al
TNS Listener y posteriormente pasaremos a estudiar en más detalle todo lo referente al archivo de registro
de eventos del listener o listener log [23].
2.5.2.3.1 Evidencia de ataques al mecanismo de autenticación
Un aspecto clave a la hora de realizar una investigación sobre la base de datos, es preguntarse ¿Existió una
brecha de seguridad?, y la mejor manera de abordar esta pregunta es revisando si se realizó un inicio de
sesión exitoso o no, pues aunque no todos los ataques requieren una autenticación previa, la gran mayoría
de hecho si la requiere. A continuación revisaremos la evidencia que dejan los ataques en contra del
mecanismo de autenticación en el archivo listener log y la traza de auditoría (asumiendo que el comando
CREATE SESSION está siendo auditado), para revisar si un intento de autenticación fue exitoso o no.
[25]
2.5.2.3.1.1 Localizando intentos por obtener el SID de la base de datos
Para poder acceder al RDBMS, un atacante debe conocer el identificador de servicio de la base de datos o
SID. En versiones anteriores a la 10g se podían usar los comandos SERVICES o STATUS para obtenerlo
del TNS Listener, y la ejecución de dichos comandos generaba entradas en el archivo listener log [25].Ver
Anexo 37.
A partir de la versión 10g, obtener el SID dejo de ser una tarea tan sencilla pero aparecieron nuevas
estrategias de las cuales se hablara a continuación.
2.5.2.3.1.2 Ataques de fuerza bruta para obtener el SID de la base de datos
Como se mencionó en el numeral anterior, a partir de la versión 10g, los atacantes debieron idear nuevas
formas de obtener el SID de la base de datos. Una de dichas estrategias consiste en tratar de adivinarlo por
medio de un ataque de fuerza bruta. Existen herramientas disponibles en internet que se encargan de
realizar esta tarea, entre ellas podemos encontrar sidgusser.exe de CQure.net, sidguess.exe de
Red
Database Security, y ora-brutesid.exe de DatabaseSecurity.com. Cada una de las herramientas
mencionadas genera entradas similares en el listener log y a la vez cada una tiene sus particularidades. Las
entradas de log presentadas en el Anexo 38, fueron generadas por el listener después de ejecutar
53
sidgusser.exe [25]. Sidguesser.exe crea sus propios TNS packets para hacer parecer que el intento de
conexión lo realizó un cliente haciendo uso de JDBC, un atacante podría implementar su propia
herramienta de fuerza bruta usando JDBC y las entradas en el listener log se verían iguales a las generadas
por sidgusser.exe. Las entradas presentadas en el Anexo 12 fueron generadas por el listener tras ejecutar
sidguess.exe [25].
Esta herramienta usa librerías de Cliente Oracle, y provee información “extra” en el listener log tal como
el hostname del cliente que se está conectando (APOLLO) y el nombre de usuario del SO de la persona
que está ejecutando la herramienta (DAVID). Aunque a primera vista, esto puede parecer evidencia útil,
se debe tener en cuenta que estos datos están bajo el control del cliente y podrían ser “disfrazados”, por
ende no existe ningún impedimento para que un atacante escriba su propia herramienta de fuerza bruta, en
la cual el hostname sea, por dar un ejemplo, “GW.ORACLE.COM” y el nombre de usuario sea
“L.ELLISON” (Lawrence Ellison, fundador y figura principal de Oracle). Así como el atacante puede
enviar datos “disfrazados”, también puede elegir no enviar ninguna información adicional, dicha falta de
información “extra” se convierte en una “firma” de la herramienta en sí misma. [25]
Asumiendo que un atacante logra obtener el SID de la base de datos, entonces procederá a autenticarse.
2.5.2.3.1.3 Detectando ataques de enumeración de usuarios
Durante la etapa de autenticación Oracle, el cliente presenta su nombre de usuario al servidor en un
paquete. Si el nombre de usuario existe en la base de datos entonces el servidor emite una clave de sesión
y el cliente envía su contraseña cifrada en un segundo paquete. Si el usuario no existe el servidor envía de
vuelta un error ORA-01017: invalidusername/password; logon denied. Debido a estos dos
comportamientos, un atacante puede determinar si un usuario existe o no. Como el cliente solo necesita
enviar el primer paquete para determinar si el usuario existe, nunca se hace un intento completo de
autenticación. En este punto juega un papel importante el audit trail de Oracle, pues si la cuenta no existe,
se genera una entrada con código de retorno 1017 como se muestra en el Anexo 37 [25].
Sin embargo si la cuenta existe, no se genera ninguna entrada en el audit trail porque la autenticación
nunca se completa. Si el audit trail muestra una gran cantidad de entradas de usuarios no existentes,
especialmente en un periodo corto de tiempo y provenientes de la misma ubicación, esto probablemente
indique un ataque de enumeración de usuarios. Para conocer la ubicación desde la cual se realizan los
intentos, usamos la columna COMMENT$TEXT, la cual contiene la dirección IP del sistema que está
intentando iniciar sesión. [25]. Ver Anexo 37.
54
Dependiendo de la herramienta que haya sido usada para realizar el ataque de enumeración de usuarios, el
archivo listener log, también puede ser una buena fuente de evidencia. Un atacante no tiene necesidad de
crear distintas conexiones TCP para enviar distintos intentos de enumeración, una vez conectado al
servidor, puede enviar tantos intentos como desee usando el mismo circuito TCP. Solo algunas
herramientas avanzadas como ora-brutesid.exe mantienen la misma conexión TCP para realizar todos los
intentos, sin embargo, la mayoría de herramientas de enumeración no usan la misma conexión sino que se
reconectan al listener antes de hacer un nuevo intento, llenando el listener log de entradas. [25]
En la Imagen presentada en el Anexo 13 podemos ver varias entradas “establish” en un corto periodo de
tiempo asociadas a la dirección 192.168.1.64. El fragmento del listener log en sí mismo, no provee
suficiente evidencia para afirmar que se realizó un ataque de enumeración de usuarios, sin embargo al
combinar esta evidencia con la recolectada previamente del audit trail, parece mucho más probable pues
los timestamps de los dos coinciden y las cuentas listadas en el audit trail no existen. Como se mencionó
anteriormente, una herramienta más avanzada como ora-brutesid.exe no se reconectara antes de realizar
cada intento de enumeración y por ende solo aparecerá una entrada “establish” en el listener log,
dejándonos únicamente con la evidencia del audit trail que muestra intentos de autenticación para varias
cuentas inexistentes. [25]
2.5.2.3.1.4 Detectando ataques de adivinación de contraseñas
Una vez que un atacante tiene una lista de usuarios puede proceder a intentar adivinar sus contraseñas.
Una herramienta de fuerza bruta simple creará una conexión al servidor por cada intento de adivinar una
contraseña y esto implicara conectarse nuevamente al listener lo cual se registrará como una entrada
“establish” en el listener log. Las entradas generadas por múltiples intentos de adivinar una contraseña
son exactamente iguales a las generadas por un ataque de fuerza bruta que intenta enumerar las cuentas de
la base de datos. Si nos fijamos en dichas entradas, notaremos que el número de puerto del cliente que se
está intentando conectar va incrementándose. Este es el comportamiento estándar cuando es creada una
nueva conexión TCP. Sin embargo no podemos afirmar definitivamente que tuvo lugar un ataque de
fuerza bruta pues podría tratarse sencillamente, por ejemplo, de un servidor de aplicación mal configurado
tratando de autenticarse con un nombre de usuario o contraseña erróneos. Por lo tanto la dirección IP
almacenada en la entrada del listener log será un indicador importante a la hora de decidir si se trata de un
host conocido o de un posible atacante. [25]
Una herramienta de fuerza bruta avanzada como orapwdbrute.exe (www.databasesecurity.com), no se
reconectara para cada intento, sin embargo existe una “particularidad” en la manera en que Oracle graba el
55
código de retorno en el audit trail para algunos de los intentos realizados por esta herramienta en los
cuales es arrojado el siguiente error diciendo que se envió una contraseña nula [25]:
ORA-1005: null password provided; logon denied
Al parecer, Oracle se confunde levemente al recibir múltiples intentos de una misma conexión demasiado
rápido, orapwdbrute.exe puede realizar 170 intentos por segundo sobre la red, lo cual nos deja con solo 15
millones de intentos por adivinar la contraseña en un día, más que suficientes para cubrir todos las
contraseñas posibles de hasta 5 caractéres de longitud. El Anexo 37 contiene un fragmento del audit trail
que muestra el código de retorno 1005 del cual estamos hablando [25].
Aunque el error indique que se envió una contraseña nula, al realizar una captura del tráfico de red, se
puede verificar que no fue así, como lo afirma la entrada. [25]
Otra fuente importante de evidencia que puede indicar un intento de fuerza bruta, especialmente si no se
tiene activada la auditoria, es la columna LCOUNT de la tabla USER$. Si la funcionalidad account
lockout esta activada, por cada intento fallido de inicio de sesión, el valor en esta columna para el usuario
en cuestión es incrementado en 1. Esto lo podemos verificar haciendo uso de la siguiente sentencia [25]:
SQL> SELECT NAME, LCOUNT FROM USER$ WHERE LCOUNT>0;
Si account lockout esta activada y la cuenta es bloqueada, entonces el valor de LCOUNT no pasará del
umbral de bloqueo especificado. Entonces, si el perfil del usuario especifica 10 intentos fallidos de
contraseña antes de que la cuenta sea bloqueada, el valor de LCOUNT siempre tendrá un máximo de 10.
Si la cuenta es desbloqueada, usando la sentencia ALTER USER <NAME> ACCOUNT UNLOCK,
entonces le valor de LCOUNT será reiniciado en cero. EL valor de LCOUNT también será colocado en
cero cuando el usuario logra iniciar sesión exitosamente. Finalmente, en lo que respecta a la columna
LCOUNT, si el usuario en cuestión tiene un perfil en el cual el campo FAILED_LOGIN_ATTEMPTS
está establecido en UNLIMITED el valor de LCOUNT no variará y será siempre cero [25].
Asumiendo que account lockout esta activada para el usuario, existe otro rastro de información que puede
llegar a ser útil cuando se esté construyendo un línea de tiempo de eventos. Hay una columna de fecha que
graba el momento en que la cuenta fue bloqueada. Ver Anexo 37.
Es importante tener en cuenta que si la cuenta es desbloqueada en algún punto, la columna LTIME
mantendrá el valor de la última vez que la cuenta fue bloqueada, esta no es despejada como LCOUNT.
56
2.5.2.3.1.5 Ataques de fuerza bruta contra la cuenta SYS
¿Cuál es la diferencia entre intentar autenticarse con la cuenta SYS con el parámetro AS SYSDBA y
hacerlo sin dicho parámetro? En una primera inspección podría parecer que solo se trata de un cambio en
una bandera de un bit [25]. Ver Anexo 30.
El byte enmarcado en rojo en el Anexo 30 indica el nivel de privilegio solicitado de la conexión. El sexto
bit es “encendido” si nos estamos conectando como SYSDBA y el séptimo es “encendido” si nos
conectamos como SYSOPER. Aun si ninguno de estos dos bits se encuentra “encendido”, un atacante
puede intentar iniciar sesión como SYS y resolver si tiene la contraseña correcta: si la contraseña no es
correcta, recibirá un error ORA-01017: invalidusername/password; logon denied. Si la contraseña es
correcta recibirá un ORA-28009: connectiontosysshould be as sysdbaorsysoper. Esta diferencia en las
respuestas le permite al atacante saber si ha conseguido obtener la contraseña correcta y luego podrá
iniciar sesión usando “AS SYSDBA”. Mientras que sólo se cambia un bit en lo que respecta al tráfico de
red, hay un mundo de diferencia en lo que le concierne al audit trail. Si no se especifica “AS SYSDBA” o
“AS SYSOPER” durante el intento de inicio de sesión, se genera una entrada en la tabla de auditoría
AUD$. Si el intento no tiene éxito al adivinar la contraseña, el código de retorno es 1017; si el atacante
logra adivinar la contraseña, el código de retorno será 28009. Sin embargo si el atacante coloca el nivel de
privilegio en SYSDBA o SYSOPER, entonces no quedará nada registrado en el audit trail, y por ende
cuando se trata de conexiones privilegiadas SYSDBA y SYSOPER debemos buscar en otros lugares. En
esos casos Oracle escribe una entrada en el sistema de registro del sistema operativo. En Windows este
sistema es el “Registro de Aplicación” (Application Log) del “servicio de registro de eventos”
(EventLoggingService) y podemos acceder a dicho registro de eventos ingresando en Panel de Control,
Herramientas Administrativas, Administración del computador, Visor de Eventos, Aplicación. [25] Ver
Anexo 13.Si existen múltiples entradas en el log del sistema operativo con el código de estado 1017,
indica un ataque de fuerza bruta en contra de la cuenta SYS con el bit de privilegios “encendido”. [25]
2.5.2.3.1.6 Intentos de aprovechar la falla en AUTH_ALTER_SESSION
Asumiendo que un usuario tiene un nombre de usuario y su respectiva contraseña, o bien ha logrado
conseguir uno, puede intentar aprovechar la bien conocida falla en la etapa final de la autenticación. Una
vez que el nombre de usuario y la contraseña de un cliente son validados, el cliente ejecuta una sentencia
ALTER SESSION con privilegios SYS, por ende un atacante podría cambiar la sentencia de un ALTER
SESSION a un GRANT DBA que posteriormente se ejecutaría con éxito cuando el cliente inicia sesión.
Aunque esta falla fue detectada y corregida hace algún tiempo, es importante saber cómo detectar los
intentos por explotarla aun en sistemas que ya no son vulnerables. Siempre que la auditoria esté activada
57
para CREATE SESSION, cuando un atacante intente ejecutar cualquier sentencia SQL para la cual aún no
tiene permisos de ejecución, se generara un error ORA-00604: error ocurred at recursive SQL level 1.
Ora-01031: insuficientprivileges. Esto aparece en el audit trail con un código de 604. [25]
Ilustración 3: Rastros en el audit trail de un intento de ejecutar una sentencia con privilegios insuficientes [25]
2.5.2.3.1.7 ¿La auditoría esta desactivada?
Si la auditoría no está activada, aún puede existir evidencia que muestre que usuarios iniciaron sesión y en
qué momento lo hicieron. La vista fija (fixedview) V$ACTIVE_SESSION_HISTORY utiliza un buffer
circular (de tamaño fijo) en el SGA para almacenar información de muestreo tomada cada segundo sobre
las
sesiones
activas.
Estas
sesiones
son
descargadas
del
SGA
a
la
tabla
WRH$_ACTIVE_SESSION_HISTORY con cierta frecuencia como parte de un repositorio automático de
carga de trabajo. Por lo tanto, estos datos históricos contienen información que puede ser útil para un
investigador forense, pues graban efectivamente quién y cuándo inició una sesión. [25]
En el Anexo 13 podemos ver que el usuario con ID 24 (dbnsmp) inició sesión el 27 de Marzo de 2007 a
las 7:02. En la ausencia de información de auditoría, estos datos pueden ser extremadamente útiles para
determinar quién inicio sesión y cuándo lo hizo. [25]
En lo que respecta al audit trail, debemos ser cuidadosos en un aspecto, cuando un usuario inicia sesión
exitosamente, una fila se inserta en el audit trail. Dicha fila tiene un campo ACTION# con valor 100
(LOGON), el campo RETURNCODE estará en cero por tratarse de un inicio de sesión exitoso y la
columna TIMESTAMP# reflejará cuando ocurrió dicho inicio de sesión. [25]
Ilustración 4: Audit trail justo después de iniciar sesión [25]
Sin embargo, cuando el usuario cierra sesión, si revisamos de nuevo el audit trail, podemos ver que el
campo ACTION# ha cambiado de 100 a 101 (LOGOFF) pero el campo TIMESTAMP# permanece igual.
58
Ilustración 5: Audit trail justo después de cerrar sesión [25]
Al construir
una línea de tiempo es importante tener en cuenta esta situación pues el campo
TIMESTAMP# en realidad esconde el momento en que el usuario se conectó. De todos modos, si
examinamos la columna LOGOFF$TIME en la tabla AUD$ del Audit trail, podemos reconciliar los
tiempos de inicio y fin de sesión [25]:
Ilustración 6: Campo LOGOFF$TIME de la tabla AUD$ [25]
Concluyendo esta sección, podemos decir que potencialmente podemos encontrar evidencia de ataques de
autenticación tanto en el archivo listener log, como en la tabla AUD$ del Audit trail. Debemos recordar
que herramientas distintas dejan rastros distintos. Se debe prestar especial atención al código de retorno en
el audit trail, muchas entradas con código 1017 y posiblemente algunas con 1005, seguidas de una entrada
con código 0, indican un ataque de fuerza bruta exitoso en contra del sistema de autenticación. También es
importante recordar que Oracle tiene muchas cuentas y contraseñas por defecto, que seguramente serán la
primera elección del atacante a la hora de realizar ataques de autenticación. [25]
2.5.2.4 Trace Files
Los trace files de Oracle, o archivos de seguimiento, son archivos especiales que contienen información
relacionada a una sesión que se encuentra bajo seguimiento. Los trace files son creados por los procesos
de background. Usualmente estos archivos poseen información sobre la puesta a punto de las bases de
datos, pero para nuestro caso también nos servirán para el recaudo de información que nos permitan
evidenciar una intrusión maliciosa [26] [27].
59
2.5.2.4.1 Validación
Los archivos de seguimiento de Oracle se encuentran activados para los procesos primarios como LGWR,
si se encuentra activado, o SMON. Si se quiere saber la ruta donde se están almacenando los archivos de
seguimiento de Oracle, podemos hacer uso de la siguiente sentencia [28] [29] [30]. Ver Anexo 31.
2.5.2.4.2 Activación
Para activar los trace files podemos hacerlo de dos formas, la primera es a nivel usuario para que todo lo
que haga dentro de su sesión se vea reflejado y almacenado dentro de archivo de trace. La segunda forma
es haciendo que el trace no se limite únicamente a un usuario, sino que quede a nivel global para que de
esta manera, los manejos de sesión de cada uno de los usuarios, independientemente de la base de datos,
queden almacenados para un posterior estudio [28].
Para esta investigación solamente las enunciaremos y las explicaremos brevemente sin entrar a un mayor
nivel de detalle, en caso de querer información más detallada acerca del tema favor referirse a [28].
2.5.2.4.2.1 Grados de almacenamiento
Para poder realizar el almacenamiento de registros dentro de los .TRC files debemos tener en cuenta en
qué grado lo estamos haciendo. Oracle nos permite almacenarlos a diferentes niveles de exactitud que van
del 0 al 16 [28].

Level 0 = ninguna estadística es generada

Level 1 = seguimiento estándar de salida incluyendo análisis, ejecución y consultas.

Level 2 = igual que el nivel 1.

Level 4 = Igual que el nivel 1 solo que incluye información de los atamientos (BIND)

Level 8 = igual que el nivel 1 solo que también posee información de los waits

Level 12 = Igual que el nivel 1 solo que posee información de los binds y los wait
2.5.2.4.2.2 Activación Global
Inicialmente comenzaremos con las formas de activación globales. Estas son las menos aconsejables ya
que van en detrimento directo del rendimiento de las bases de datos, porque almacena información de
todos los usuarios. En caso de que se encuentre configurado con el mayor nivel de detalle, se demora más
cada una de las consultas dentro de la transacción puesto que tendrá que ir primero al trace file a realizar
el registro y después resolver la consulta, lo cual se podría volver muy complicado dependiendo del
60
número de usuarios que posea la base de datos. En caso de que sea totalmente necesario, existen las
siguientes maneras de activarlo [27] [28] [29].

Se puede usar la sentencia ALTER para modificar los parámetros del spfile. Para hacerlo utilizamos la
siguiente sentencia [27] [28].
alter system set sql_trace=true scope=spfile;

El paquete monitor (DBMS_MONITOR) también nos permite configurar el trace file para el manejo de
instancias [27] [28].
execdbms_service.create_service('Test Service','test network');
2.5.2.4.2.3 Actividad por sesión
Para generar un trace file por sesión necesitamos tener en cuenta a qué usuario vamos a realizar el
seguimiento. Para esto necesitamos el SID y serial# del usuario. Para hallarlo usamos la consulta
presentada en el Anexo 39 [27] [28].
En la imagen anterior podemos ver que la sentencia, nos muestra el SID y el serial# de cada uno de los
usuarios que se encuentran conectados actualmente a la base de datos [28].
Para poder generar un buen archivo de traza, primero debemos configurar los parámetros de tiempo para
que cuando cree las entradas de almacenamiento, tenga en cuenta el tiempo de la entrada con su
timestamp. También debemos configurar el tamaño con el valor máximo que puede llegar a tomar el
archivo de traza, para esto utilizamos las siguientes sentencias [28].
exec dbms_system.set_bool_param_in_session(144,947,'timed_statistics',true);
exec dbms_system.set_int_param_in_session(144,947,'max_dump_file_size',2147483647);
Una vez tenemos el nombre de usuario al cual queremos realizar el seguimiento, lo activamos únicamente
para ese usuario de la siguiente manera [28]:
execdbms_system.set_sql_trace_in_session(144,947,true);
Para acabar la traza utilizamos la siguiente sentencia:
execdbms_system.set_sql_trace_in_session(144,947,false);
61
Con la anterior sentencia estamos haciendo un seguimiento al usuario Bonifacio. Una vez hemos esperado
a que el usuario haga sus funciones dentro de la base podemos ver el archivo de traza ubicado dentro de la
ruta que nos proporciona el procedimiento de la sección 1 de este numeral. Ahora que tenemos el archivo
de traza del usuario nos surgen varias preguntas, ¿Cuál es el nombre del archivo que contiene la traza del
usuario? , ¿Cómo accedo a él?, ¿En dónde puedo encontrar el archivo generado?, ¿necesito algún
programa especial para poder ver de manera estructurada el contenido del archivo? Las respuestas a estas
preguntas las expondremos a continuación [27] [31].
Para poder acceder a los archivos de traza entramos a la ruta que nos fue especificada anteriormente
cuando corrimos el procedimiento de la sección de validación. Una vez dentro de esta ruta, nos aparecen
todas las trazas del sistema y las trazas que nosotros especificamos. Es importante que cuando hayamos
creado una traza tengamos en cuenta la hora en la cual iniciamos la recolección de datos, ya que los
nombres de los archivos son administrados por el sistema [31]. Ver Anexo 14
Los archivos traza especificados por el usuario poseen la siguiente estructura, <SID>_ora_<numero de
sistema>.trc. Una vez hemos identificado el archivo que contiene la traza del usuario especificado,
podemos abrirlo de dos maneras. La primera es usando un editor de texto para abrir el archivo sin formato,
la segunda es usando la herramienta TKPROF. Si abrimos el archivo con un editor de texto se pueden ver
desorganizadas las entradas que fueron generadas cuando iniciamos la traza del usuario, pero es muy
complicado entender la secuencia de eventos dentro del archivo ya que se encuentra sin formato [31]
[24].Ver Anexo 14.
Utilizando la siguiente forma podemos analizar todas las sentencias que ejecutó el sistema y que ejecutó el
usuario. Para entrar al editor, utilizando Windows, iniciamos una consola y entramos a la funcionalidad
tkprof, seguido de la ruta donde se encuentra el archivo traza y la opción con la cual queremos iniciar el
volcado. Existen muchas opciones, pero para funciones forenses utilizaremos la opción SYS=NO que
elimina todas las sentencias ejecutadas por SYS y sólo deja aquellas que sean ejecutadas por el usuario.
Ver Anexo 15 [31].
2.5.2.5 Live Response
Cuando se presente un posible evento forense dentro de una base de datos Oracle, es importante analizar
todos los posibles lugares en los cuales pueda residir información que pueda ser usada en una corte como
evidencia, por esto es importante que en caso de que tengamos la oportunidad de acceder al sistema justo
después de que el ataque se haya presentado podamos obtener la información que se encuentra dentro de
62
la memoria Volátil (Memoria RAM) garantizando la fiabilidad, la veracidad y la integridad de la misma.
Es importante tener en cuenta que esta información sólo podrá obtenerse en caso de que el sistema
comprometido no haya sido apagado para efectos de aislamiento, ya que la información que resida dentro
de la memoria volátil será permanentemente eliminada y por ende se estaría descartando evidencia
potencial. Es importante que el proceso que se sigue para el manejo de la información adquirida sea
completamente documentado y respaldado ya que los resultados que se obtengan de la adquisición de esta
información no pueden ser reproducidos. Esto lo hace blanco de desacreditaciones [26] [32].
Aunque existen amenazas que puedan alterar la información que hay dentro de la memoria Volátil, como
por ejemplo que el atacante modifique el proceso NTDLL.dll8 para que cuando el investigador forense
utilice alguna de sus herramientas para captura de evidencia el proceso realice rutinas que el atacante
haya programado para entorpecer y complicar la investigación, es importante tener esta información por
las siguientes razones [32]:

No todos los atacantes comprometerán los procesos que administran la información volátil.

La mayoría de los atacantes no llegan hasta ese nivel para encubrir sus huellas.

En caso de que la información volátil no muestre ningún tipo de evento sospechoso y otros
logs si lo hagan, ya se puede garantizar que se ha hecho uso de una técnica anti forense.
Teniendo en cuenta el porqué es importante la información volátil es necesario determinar un modo de
proceder para garantizar que la información que se obtenga sea fiable.
2.5.2.5.1 Secuencia de administración para Live Response
Al enfrentarnos a un evento forense debemos tener en que cuenta que hay que ser lo menos invasivos
posible ya que cualquier cosa que hagamos puede alterar la información volátil dentro del sistema o
podría sobrescribir cualquier sector del disco que posea algún tipo de información que haya sido borrada.
Si es posible, lo ideal es inicialmente sacar una imagen RAW del sistema que se encuentra bajo
investigación. Posterior a esto en el evento de que se necesite acceder al sistema para la recolección de la
información volátil es necesario que solamente se ejecuten acciones que sean absolutamente necesarias a
la hora de interactuar con el sistema, como por ejemplo autenticarse dentro del sistema, aunque el solo
hecho de autenticarse ya está modificando dentro de la memoria RAM los valores de la paginación, es un
evento que es necesario y por lo tanto es aceptable. Los eventos que no son aceptables son aquellos que
8
NTDLL.dll es la librería dentro de los sistemas Windows que se encarga de ejecutar las funciones base del kernel.
[44]
63
siendo evitables no se tengan en cuenta y modifiquen el estado del sistema, como por ejemplo que los
resultados de las herramientas sean almacenados en archivos planos dentro del sistema que se encuentra
en estudio, porque esta acción podría sobrescribir sectores del disco que posean información relevante
para la investigación. Por lo anteriormente explicado, la primera medida que se debe tomar dentro de la
recolección de información es tener herramientas que tengan la posibilidad de redireccionar sus flujos de
salida a sistemas externos logrando de esta manera que el sistema investigado se mantenga intacto [32].
Existen tres maneras para recolectar la información adquirida en el sistema víctima y enviarla a un sistema
externo [32] [26].

Redireccionando los flujos utilizando funciones del sistema

Utilizando herramientas como Netcat o Cryptocat para realizar la administración remota de los
flujos.

Utilizar herramientas forenses que ya tengan incluida esta funcionalidad.
Dentro de cualquier proceso de Live Response independientemente de si es en una base de datos o en una
investigación de sistema de archivos, es necesario adquirir toda la información que se encuentre
relacionada con el estado del sistema. Esto implica que necesitamos adquirir los logs de auditoría del
sistema y todo tipo de datos de control que nos puedan proporcionar algún tipo de información acerca del
evento de seguridad, ya que en esta información podría residir algún tipo de evidencia que nos sirva para
esclarecer los hechos. La información clave y más general que podemos recaudar es la siguiente [32] [26].

Fecha y hora del sistema: La fecha y hora del sistema actual es la primera información que un
investigador debe recaudar ya que esta le permitirá tener un punto de partida para la investigación que
se vaya a realizar. Para adquirir esta información el investigador puede hacer uso de los comando
Date y Time, en caso de que la investigación se esté realizando en un sistema Windows [32]. Ver
Anexo 16.

Usuarios que se encuentren dentro del sistema: Es importante saber qué usuarios se encuentran
dentro del sistema y por cuánto tiempo, ya que el atacante se puede encontrar aún dentro del sistema.
Para esta tarea podemos hacer uso de herramientas como PsLoggedOn que nos permite saber que
usuarios se encuentran dentro del sistema [32] [26].

Lista de usuarios: La información de todos los usuarios que se encuentren dentro del dominio interno
de la máquina, sus privilegios y los grupos a los cuales pertenecen. Esta información la podemos
64
adquirir utilizando el comando net user para saber la lista de usuarios, y para saber el detalle de cada
uno usamos net user + Usuario [32] [26]. Ver Anexo 17.

Listado de conexiones y puertos: El listado de las conexiones y los puertos establecidos nos pueden
prestar gran ayuda en caso de que el ataque se encuentre en proceso o que la conexión aún se encuentre
establecida. Para encontrar la lista de conexiones podemos hacer uso del comando netstat y
combinarlo con los parámetros –a y –b que nos permitirán saber qué aplicaciones son las que las están
usando y bajo qué puertos están corriendo [32] [26].
Como se muestra en el Anexo 18, tenemos que ver cuáles son las conexiones que Oracle tiene
establecidas y ver a dónde es que se están conectando, ya que podríamos evidenciar el ataque que se
encuentre en proceso. En la imagen anterior podemos ver que aunque se encuentre en estado de
escucha, aún no hay ninguna conexión que se encuentre establecida [32] [26].

Listado de los procesos que se encuentran corriendo: Es necesario que se muestren los procesos y
las aplicaciones que se encuentren corriendo dentro de la máquina ya que esta información nos puede
dar detalles del ataque. Para adquirir esta información podemos hacer uso de herramientas como Fport
y PSLIST [32] [26].

Lista de DLL y objetos compartidos: Tener en cuenta que librerías fueron cargadas por medio de la
red [26].

Listados de Handles que se encuentren abiertos: Los handles son los manejadores de los procesos y
por medio de ellos podemos detectar procesos sin padres [26].

Realizar volcados de memoria: Los volcados de memoria deben realizarse aun si los procesos se ven
benignos ya que muchas veces se puede cargar código en espacios designados a procesos como
Notepad y demás [26].

Realizar volcados de memoria del sistema: Estos volcados cubren la información que posiblemente
no se alcance a revelar en los volcados de memoria. Para realizar los volcados dentro de un sistema
Windows, podemos utilizar la funcionalidad que provee Microsoft OEM package para realizar los
userdumps [32] [26].

Árbol y nombres de Archivos: Es necesario tener toda la información de cada uno de los archivos
que se encuentre dentro del sistema afectado. Se debe tener en cuenta que esta información debe tener
el nombre del dueño de cada archivo y quien está en la jerarquía [26].
65

Volcado de información del registro: La información del registro podría revelarnos la presencia de
cualquier tipo de rootkit [32] [26].

Copia de los logs del servidor: Todos los sistemas con arquitectura de servidor deben tener los logs
de mensajes y los logs de archivos [26].
Con la información anteriormente listada podemos obtener los datos que nos dan un valor agregado a la
investigación y que posiblemente nos aporten evidencia que pueda ser presentada en un corte, pero esta
información solamente no nos sirve en caso de que el ataque se haya hecho a una base de datos, ya que es
el nivel más general que nos puede proporcionar el sistema. Existen archivos de Oracle que nos pueden
proporcionar gran cantidad de evidencia en un evento de Live Response [26].
Los archivos de Oracle nos podrían proporcionar más información ya que son archivos más específicos y
nos dan una visión más acertada en caso de que una base de datos se vea comprometida. Los archivos que
nos pueden proporcionar más información dentro de un evento de Live Response son archivos de Log,
Trace y Control. Inicialmente es necesario verificar en el archivo de inicio del sistema de Oracle que se
encuentra en el home de la instanciapara saber las diferentes rutas que maneja la instancia de la base de
datos. Para esto debemos ir al registro y buscar la instancia de la base de datos a la cual queremos hacerle
seguimiento.
La
información
que
debemos
buscar
se
encuentra
en
Hkey_Local_Machine\Software\Oracle\Database_instance. Cada uno de los registros de la instancia nos
dice cuál es la ubicación dentro del disco de cada una de las instancias, específicamente nos dice la ruta
del home como se muestra en la ilustración 28. [26] Ver Anexo 19.
Una vez nos encontramos dentro de la ruta especificada, debemos buscar el archivo de inicio que se
encuentra en la carpeta database en los sistemas operativos Windows. El archivo usualmente se llama
“spfilesid.ora” donde el Sid es el Identificador del sistema [26]. Ver Anexo 19.
Dentro de este archivo encontraremos las rutas en las cuales se escriben los logs [26]. Ver Anexo 32.
A continuación vamos a realizar una explicación de cada una de las rutas.

Audit_File_Dest: En caso de que la auditoría se encuentre habilitada y configurada para
almacenarse en el sistema de archivos del sistema operativo, los archivos serán almacenados en
esta locación [26].
66

Background_dump_dest: En esta ruta se encuentran los archivos de seguimiento del sistema y el
alert.log de los procesos que corren en Background [26].

Core_Dump_Dest: Los volcados del núcleo de del servidor Oracle son colocados en esta ruta
[26].

Db_Recovery_file_Dest: En esta dirección se encuentra el área del flash recovery y también se
encuentran todos los Redo Logs que hayan sido almacenados en caso de que el proceso de
Archiver se encuentre activado [26].

User_Dump_Dest: Archivos de información del seguimiento de todos los usuarios se encuentran
en esta ruta [26].

User_File_Dir: En esta dirección se encuentran los archivos de PL/SQL de entrada y salida,
como por ejemplo UTL_FILE [26].

Control_Files: Los archivos de control contienen la información de todos los archivos de Datos
(Data Files) [26].

Db_create_online_log_dest_n: En esta ruta es donde se encuentran los Redo Logs. La n es el
número del redo log al cual se desea acceder y comienzan desde 1 [26].

Log_archive_dest, log_archive_dest_n and log_archive_duplex_dest: Este directorio también
nos puede servir para almacenar Redo Logs.

Oracle_Data_Files: Los archivos de control poseen las rutas en las cuales se encuentran los
archivos de datos (Data Files), ya que en muchos casos los Archivos de datos pueden llegar a ser
del tamaño de varias Teras, o en algunos casos de Pentas. Es muy complicado realizar una copia
a un servidor de recolección, por esto, en caso de no ser posible el almacenamiento total de la
misma debemos copiar aquella información que pueda ser más importante, como lo son los
espacios de tabla SYSTEM, SYSAUX, TEMP y UNDO [26].

External_Files: Oracle puede escribir archivos dentro del sistema operativo haciendo uso de las
funciones de la máquina virtual de java o utilizando el paquete UTL_FILEPL/SQL. El parámetro
de UTL_FILE_DIR determina en qué ruta es que Oracle lee o escribe los archivos externos. Estos
archivos deben ser recolectados para un posterior análisis dentro de un evento forense [26].

Listener_Log_Files:
Los
archivos
de
los
Listeners
se
encuentran
en
la
ruta
ORACLE_HOME/network/admin/listener.ora. Estos archivos contienen la información de que
recolecta el listener de los eventos de comunicación con la base de datos. La información que se
encuentre dentro de estos archivos puede ser modificada en caso de que no posea una contraseña
configurada en el estado, que aplica por ejemplo para versiones como Oracle 9i. En muchos casos
67
el atacante puede modificar la ruta o hasta desactivarlos. Al correr el comando “lsnrctl status”
obtenemos la ruta actual en la cual se encuentran los logs del listener, al correr este comando se
obtiene la escritura de un registro del “Status” dentro del log [26]. Ver Anexo 33.
Realizando esto se genera una entrada en el log similar a la siguiente: [26]
06-APR-2007 01:30:04 *
(CONNECT_DATA=(CID=(PROGRAM=)(HOST=)(USER=david))(COMMAND=status)(ARG
UMENTS=64)(SERVICE=LISTENER)(VERSION=169869824)) * status * 0
Ya que hemos visto cuáles son los archivos más relevantes dentro de la base de datos y el sistema
operativo, pasaremos al análisis desde la base de datos para ver cuáles son los focos de análisis dentro de
ésta, haciendo uso del middleware SQLplus [26].
2.5.2.5.1.1 Sqlplus Para Búsquedas
En el proceso de Live Response, dentro de un evento forense, la conexión a la base de datos debe ser el
último paso que se debe realizar. Primero se debe recolectar toda la información anteriormente listada. En
ningún caso el investigador debe Ejecutar Sentencias DML como DELETE, UPDATE, INSERT ya que
modificarían el estado de la base de datos. Tampoco se deben usar sentencias como DROP o CREATE y
no se deben crear en ningún caso objetos incluso así sean temporales. No se debe en ningún caso otorgar
permisos, por lo cual las sentencias GRANT y REVOKE no se pueden usar. Tampoco se debe usar el
comando ALTER y tampoco usar DUMP para bajar la información que se encuentre en los Logs de
registro. Hay que tener en cuenta esto ya que sólo el hecho de conectarse a la base de datos ya está
generando un registro dentro de los logs del listener. Es importante que la persona que se encuentre
realizando la investigación se conecte con la cuenta SYS que en caso de que no, cada vez que realice una
acción se generaran registros dentro de la tabla de auditoría y estaríamos cambiando el estado de la base
de datos, además que también estaríamos generando registros dentro de los logs del sistema operativo.
Cuando el investigador vaya a conectarse a la base de datos debe realizarlo por medio de un middleware,
puesto que si no se hace, modificaría vistas como V$SQL que son alteradas cada vez que se use una
sentencia SQL [26].
68
Para este ejercicio el investigador se conecta utilizando sqlplus, pero antes de comenzar el investigador
debe verificar que los siguientes archivos se encuentren, y en caso de que la respuesta sea positiva,
entonces que verifique no contengan ninguna de las sentencias sql que puedan modificar el estado de la
base de datos, como las que se mostraron anteriormente [26].
$ORACLE_HOME/bin/LOGIN.SQL
$ORACLE_HOME/dbs/LOGIN.SQL
$ORACLE_HOME/SQLPlus/admin/glogin.sql
Muchas veces los atacantes pueden disfrazar sus sentencias modificando DBA_ROLE_PRIVS para que
no se vea una sentencia explícita de otorgamiento de privilegios como la siguiente [26]
SQL> SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'DBA';
GRANTEE
---------------------------SYS
SYSMAN
SYSTEM
Sin embargo podrán ser vistos en búsquedas de tablas aledañas como el siguiente [26]:
SQL> SELECT U.NAME FROM SYS.USER$ U, SYS.SYSAUTH$ A WHERE U.USER# =
A.GRANTEE# AND PRIVILEGE# = (SELECT USER# FROM SYS.USER$ WHERE NAME =
'DBA');
NAME
-----------------------------SYS
HACK101
SYSTEM
SYSMAN
Antes de conectarse a la base de datos o realizar cualquier actividad, todas las salidas del sistema deben
ser re direccionadas a un archivo de texto. Para realizar esto, se hace uso del comando SPOOL seguido
del nombre del archivo. El nombre del archivo debe tener el número del caso y la fecha y hora de
recolección [26].
69
C:\oracle\product\10.2.0\db_1\BIN>TIME
The current time is: 6:12:22.93
Enter the new time:
C:\oracle\product\10.2.0\db_1\BIN>DATE
The current date is: 27/03/2007
Enter the new date: (dd-mm-yy)
C:\oracle\product\10.2.0\db_1\BIN>SQLPLUS /NOLOG
SQL*Plus: Release 10.2.0.2.0 - Production on Tue Mar 27 06:12:29 2007
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
SQL> SPOOL C:\IR-CASES\N0017\SQL-CASE-N0017-27-03-2007-06-12-
22.TXT
La conexión se debe realizar desde un computador externo utilizando la cuenta SYS como se muestra a
continuación [26].
SQL> CONNECT SYS/[email protected]:1521/ORCL AS SYSDBA
Una vez conectados se debe alterar el formato de hora para que se muestren las horas [26].
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
2.5.2.5.1.2 Obteniendo las sentencias SQL Anteriormente Ejecutadas
La primera sentencia de búsqueda que debe realizar un investigador es una copia de las últimas sentencias
SQL ejecutadas en el sistema, que puede ser obtenida de la vista fija V$SQL de la siguiente manera [26].
SQL> SELECT LAST_ACTIVE_TIME, PARSING_USER_ID, SQL_TEXT FROM V$SQL
ORDER BY LAST_ACTIVE_TIME ASC;
Con la anterior sentencia podemos obtener todas las consultas que se encuentren almacenas dentro de la
vista fija V$SQL. El número de estas consultas se encuentran alrededor de 2500 consultas. El
comportamiento cíclico de esta vista hace que cada vez que se ejecute una sentencia y la vista se encuentre
llena, ésta borrará el registro con fecha más antigua que encuentre. Al ser un número tan limitado, entre
más rápido se acceda a esta tabla después del incidente entonces mayor será la probabilidad de que se
encuentre algún tipo de rastro del ataque dentro de esta tabla. En cualquier caso, es necesario que se
realice la búsqueda así el servidor sea de alto rendimiento, ya que si se llega a encontrar información que
sea útil, podríamos obtener el usuario y la fecha en que se realizó la búsqueda. Cabe la pena anotar que
70
también esta información se encuentra disponible en los DUMPS de memoria que mostramos
anteriormente [26].
Desde Oracle 10g en adelante el historial del repositorio de Carga de trabajo Automática
(WorkLoadRepository) WRH$_SQLTEXT y WRH$_SQLSTAT, también contienen evidencia y se debe
consultar de la siguiente manera [26].
SQL> SET LONG 2000000000
SQL> SELECT ST.PARSING_SCHEMA_ID, TX.SQL_TEXT FROM WRH$_SQLSTAT ST,
WRH$_SQLTEXT TX WHERE TX.SNAP_ID = ST.SNAP_ID;
El parámetro “SET LONG 2000000000”, es para especificar el tamaño en que el sqlplus debe mostrar
caracteres del SQL_TEXT, ya que en caso de que no se especifique se verá truncado ya que de otra forma
será del tipo CLOB [26].
Dentro de la tabla WRH$_SQLTEXT hay una gran probabilidad de encontrar información que pueda llegar
a ser útil para la investigación. En esta tabla se pueden encontrar aquellas sentencias UPDATE, DELETE,
SELECT e INSERT y algunas sentencias ALTER que se tomaron un tiempo prudencial de ejecución.
Muchos de los ataques que se hagan por red y hagan uso de paquetes como UTL_INADDR, UTL_HTTP ,
UTL_SMTP y UTL_TCP se verán reflejados dentro de estas tablas en caso de que se haya hecho uso para
extraer la información por medio de la red [26].
Este método nos permite ver sentencias SELECT en caso de que el AUDIT haya sido deshabilitado. Una
vez la información que se encuentra dentro de estas consultas es salvada, podríamos pasar a la ejecución
de otras consultas. Es importante que se salve primero la información que está dentro de la tabla
WRH$_SQLTEXT puesto que las siguientes consultas que haremos sobrescribirán los registros que se
encuentren dentro de ésta [26].
Una vez tenemos esta información debemos entrar a analizar la información que se encuentre dentro del
log de auditoría. Para entrar a administrar la información que se encuentre dentro del log de auditoría
utilizamos la siguiente consulta [26].
71
SQL> SELECT * FROM AUD$;
2.5.2.5.1.3 Información de acceso al sistema utilizando AUD$
Dentro de la tabla de auditoría podemos encontrar toda la información acerca del acceso de los usuarios al
sistema .En la tabla de auditoría podemos encontrar que usuarios que se registraron en el sistema, pero en
caso de que la auditoria no se encuentre habilitada también podemos encontrar información en la vista fija
V$ACTIVE_SESSION_HISTORY que utiliza un buffer circular dentro del SGA para almacenar la
información del estado de las cuentas activas dentro del sistema. Esta información es almacenada
posteriormente dentro de la tabla WRH$_ACTIVE_SESSION_HISTORY como parte del Automatic
WorkLoad Repository. Para consultar esta tabla podemos utilizar la siguiente consulta [26].
SQL> SELECT USER_ID, SESSION_ID, SAMPLE_TIME FROM
SYS.WRH$_ACTIVE_SESSION_HISTORY
La anterior consulta nos suministra la información de las entradas al sistema pero adicionalmente
debemos recaudar la información de los usuarios que se encuentran dentro del sistema actualmente [26].
SQL> SELECT SID, USER#, USERNAME, TERMINAL, OSUSER, PROGRAM,
LOGON_TIME FROM V$SESSION;
2.5.2.5.1.4 Información de usuarios y roles
Es necesario seleccionar la lista de usuarios y de los roles que se encuentran actualmente configurados
dentro del sistema. Un investigador debe recolectar el password para determinar qué passwords son los
más factibles de ser descifrados por medio de un ataque de adivinación, verificar el estado actual de las
cuentas, esto quiere decir que debe verificar si la cuenta se encuentra abierta o cerrada y en caso de que se
encuentre cerrada ver a qué hora fue que cambio su estado a cerrada. También debemos ver la fecha de
creación de todas las cuentas de usuario y sus últimas fechas de cambio de contraseñas. Para recaudar esta
información podemos hacer uso de la siguiente sentencia [26] [33]:
SQL> SELECT USER#, NAME, ASTATUS, PASSWORD, CTIME, PTIME, LTIME FROM SYS.USER$ WHERE
TYPE#=1;
Una vez adquirimos la información relativa a los usuarios también debemos tener en cuenta a qué roles
pueden pertenecer los usuarios anteriormente listados, para hallar estos roles podemos utilizar esta
sentencia sql [26]:
72
SQL> SELECT USER#, NAME, PASSWORD, CTIME, PTIME FROM SYS.USER$ WHERETYPE#=0;
También debemos tener en cuenta dentro de la lista de roles, cuáles usuarios poseen permisos de DBA y
verificar que los usuarios que estén con estos permisos hayan sido avalados por el administrador de la base
de datos [26].
SQL> SELECT U.NAME AS "GRANTEE", U2.NAME AS "ROLE" FROM SYS.USER$ U, SYS.USER$ U2,
SYS.SYSAUTH$ A WHERE U.USER# = A.GRANTEE# AND PRIVILEGE# = U2.USER#;
La lista de privilegios de cada usuario debe ser extraída del sistema para la investigación que se está
llevando a cabo, esta lista la podemos sacar de las tablas del sistema SYS.USER$, SYS.USER$,
SYS.TABLE_PRIVILEGE_MAP, SYS.OBJ$ y SYS.OBJAUTH$. Para hallar esta información hacemos
lo siguiente [26].
SQL> SELECT U.NAME AS "GRANTEE", P.NAME AS "PRIVILEGE", U2.NAME AS "OWNER", O.NAME AS
"OBJECT" FROM SYS.USER$ U, SYS.USER$ U2,
SYS.TABLE_PRIVILEGE_MAP P, SYS.OBJ$ O, SYS.OBJAUTH$ A WHERE U.USER# = A.GRANTEE# AND
A.OBJ# = O.OBJ# AND P.PRIVILEGE = A.PRIVILEGE# AND O.OWNER#=U2.USER#;
Obtener la lista de todos los privilegios del sistema también es necesario [26].
SQL> SELECT U.NAME AS "GRANTEE", S.NAME AS "PRIVILEGE" FROM SYS.USER$ U, SYS.SYSAUTH$
A, SYS.SYSTEM_PRIVILEGE_MAP S WHERE U.USER# = A.GRANTEE# AND PRIVILEGE# = S.PRIVILEGE
ORDER BY U.NAME;
El informático forense o la persona que se encuentre encargada de realizar la investigación, debe buscar
además todos los permisos sobre los objetos [26].
SQL> SELECT OBJ#, OWNER#, NAME, TYPE#, CTIME, MTIME, STIME FROM
SYS.OBJ$ ORDER BY CTIME ASC;
Lista de tablas que hayan sido borradas [26]
73
SQL> SELECT U.NAME, R.ORIGINAL_NAME, R.OBJ#, R.DROPTIME, R.DROPSCN FROM
SYS.RECYCLEBIN$ R, SYS.USER$ U WHERE R.OWNER#=U.USER#;
2.5.2.5.1.5 Listado de cambios sobre los bloques
Cada Data file se encuentra separado en bloques de datos y cada bloque contiene un sello de tiempo que
indica la última fecha en el cual fue modificado el objeto, como por ejemplo cuando se usó por última vez
un commit. Cada sello de tiempo es almacenado en los SCN o System Commit Number, por ende cada
vez que se modifique una fila dentro del objeto, el SCN se actualizará con el sello de tiempo de la
modificación. Por ejemplo si usamos la siguiente sentencia [26].
SQL> SELECT O.ORA_ROWSCN, O.CTIME, O.MTIME, O.STIME, U.NAME, O.NAME FROM SYS.OBJ$ O,
SYS.USER$ U WHERE U.USER#=O.OWNER# ORDER BY 1;
Y su resultado es:
…
2282280 05-APR-07 06-APR-07 05-APR-07 SYS WRH$_SERVICE_WAIT_CLASS
2282280 05-APR-07 05-APR-07 05-APR-07 SYS WRH$_SERVICE_WAIT_CLASS_PK
2282280 05-APR-07 05-APR-07 05-APR-07 SYS P_TEST
2282280 05-APR-07 05-APR-07 05-APR-07 SYS VP_TEST
2282280 05-APR-07 05-APR-07 05-APR-07 SYS P_TEST
2282280 05-APR-07 05-APR-0705-APR-07 SYS VANISH
2282280 05-APR-07 09-APR-07 09-APR-07 SYS X
2282280 05-APR-07 06-APR-07 05-APR-07 SYS WRH$_SQLSTAT
2282280 05-APR-07 06-APR-07 05-APR-07 SYS WRH$_SYSTEM_EVENT
…
Si convertimos el SCN que encontramos dentro de la consulta a TimeStamp encontraremos lo siguiente
[26]. Para otro ejemplo ver Anexo 20.
SQL> SELECT SYS.SCN_TO_TIMESTAMP(2282280) FROM DUAL;
SYS.SCN_TO_TIMESTAMP(2282280)
-----------------------------------------------------------09-APR-07 14.39.56.000000000
74
2.5.2.5.1.6 Obtener la versión y el nivel de actualización de los parches
En una investigación es necesario saber bajo qué versión de Oracle el servidor se encuentra corriendo, ya
que en muchas ocasiones los parches de seguridad solucionan muchos de los huecos de seguridad de la
aplicación. Para hallar esta información se hace uso de sentencia presentada en el Anexo 34 [26].
2.5.2.6 ALGUNAS FUENTES DE EVIDENCIA EN LA AUSENCIA DE AUDIT TRAIL
En el mundo físico cuando un robo es cometido, usualmente es notado inmediatamente por la ausencia de
algún objeto, pero en el caso de la computación forense y particularmente de un servidor de base de datos,
cuando un atacante roba información, únicamente se lleva una copia de los datos mientras que las
versiones originales permanecen intactas y por ende es mucho menos inmediato y a la vez más complejo
detectar una situación de robo. Se hace necesario entonces detectar cuando un atacante ha obtenido acceso
no autorizado para ejecutar sentencias SELECT sobre los datos, incluso en el caso de que la función de
auditoría de Oracle (Audit trail) se encuentre desactivada. [34]
En la sección 2.5.2.2.1 revisamos cómo detectar los eventos en los cuales un atacante logra acceder a la
base de datos y crea objetos como funciones y tablas aun si posteriormente los elimina en un intento de
esconder sus acciones. Sin embargo, cuando el atacante ingresa y simplemente realiza consultas de tipo
SELECT para obtener información como, por ejemplo, usuarios y contraseñas de cuentas bancarias y
posteriormente se desconecta sigilosamente, puede ser mucho más complejo localizar evidencia de dichas
acciones. Aun si la auditoria Oracle se encuentra desactivada, existen algunos lugares donde podemos
buscar evidencia de la ejecución de sentencias SELECT, por ejemplo el repositorio automático de carga
de trabajo AWR9, el optimizador basado en costos CBO10 y algunas vistas fijas en el área de memoria
compartida. [34]
2.5.2.6.1 Optimizador basado en costos CBO
Cada vez que un usuario ejecuta una consulta SQL, el servidor necesita compilarla en un plan de
ejecución. EL CBO es el encargado de hacer esto de la mejor manera, es decir, reduciendo al mínimo la
cantidad de recursos del sistema usados para atender la consulta. Estadísticas acerca del CBO son
guardadas en tablas por el proceso de segundo plano Monitor del sistema SMON11. Una de dichas tablas
es la tabla COL_USAGE$, la cual es usada para guardar información sobre los predicados usados en las
sentencias SELECT, en otras palabras, las columnas usadas en una clausula WHERE y el tipo de
9
AutomaticWorkloadRepository
CostBasedOptimizer
11
System Monitor
10
75
predicado, entre otras cosas. Esta tabla suele ser actualizada cada veinte minutos por el proceso SMON.
La información almacenada en esta tabla puede ser usada por un investigador forense para inferir detalles
relacionados a consultas SELECT que han sido ejecutadas en la base de datos, las cuales pueden indicar
cuándo es posible que haya ocurrido un robo de información o no. Antes de continuar es importante
revisar la definición de la tabla mencionada haciendo uso de la sentencia DESC [34]. Ver Anexo 35.
La columna OBJ# contiene el ID de objeto de la tabla que está siendo consultada y la columna INTCOL#
contiene el número de columna, tomado tal cual, de la columna COL# en la tabla COL$, usada en el
predicado. Entonces, por ejemplo, si Z está definida en COL$ como la tercera columna en la tabla
COLTEST y una consulta of „SELECT * FROM COLTEST WHERE Z = 0‟ es ejecutada, entonces la
columna INTCOL# en la tabla COL_USAGE$ tendrá un valor de 3. La columna TIMESTAMP guarda el
segundo más cercano al momento en que la entrada fue añadida a la tabla COL_USAGE$ y no al
momento en que la consulta que está siendo registrada fue ejecutada. Tener en cuenta esto es de gran
relevancia a la hora de construir una línea de tiempo de eventos. Como el proceso SMON realiza cambios
a la tabla COL_USAGE$ cada veinte minutos, puede haber una desviación de máximo 20 minutos para
una entrada determinada. Otro aspecto a notar sobre la columna TIMESTAMP es que, si una nueva
consulta sobre la misma tabla usando el mismo predicado es ejecutada, la columna TIMESTAMP es
actualizada; así, entradas anteriores serán sobrescritas. Las columnas restantes indican el tipo de
predicado. Por ejemplo, una entrada para EQUALITY_PREDS será generada después de una consulta
„SELECT X FROM COLTEST WHERE Z = 5‟. Una fila será generada para RANGE_PREDS después de
una consulta „SELECT X FROM COLTEST WHERE Z > 0 AND Z < 100‟. Una fila NULL_PREDS será
generada luego de ejecutar una sentencia „SELECT Y FROM COLTEST WHERE Y IS NULL‟ y
finalmente una fila LIKE_PREDS se generara después de una consulta „SELECT Y FROM COLTEST
WHERE Y LIKE „%A%‟‟. [34]
Al volcar los contenidos de esta tabla podemos obtener una imagen completa de cuáles tablas fueron
consultadas, qué columnas fueron usadas y qué predicados se utilizaron. Para obtener un formato de
resultados más claro, cada tipo de predicado puede ser consultado por separado. Por ejemplo, un volcado
de los predicados LIKE_PREDS puede realizarse como se muestra a continuación [34]:
76
Ilustración 7: Volcado de los predicados LIKE_PREDS [34]
Si nos fijamos en la primera fila de información podemos notar que alguien ha seleccionado de la tabla
COL$ usando la sexta columna con un predicado LIKE. Como es el caso, esta fila ha sido creada en la
tabla COL_USAGE$ luego de que un atacante, en su búsqueda de tablas interesantes de las cuales volcar
información, ejecuto la siguiente consulta SQL [34]:
SQL> SELECT TABLE_NAME FROM DBA_TAB_COLS WHERE COLUMN_NAME LIKE
'%CREDITCARD%';
DBA_TAB_COL es una vista que mapea en la tabla COL$, COLUMN_NAME corresponde a la sexta
columna en la tabla COL$ que es NAME, en otras palabras el nombre de la columna. Un aspecto a notar
es que la columna OBJ# en la tabla COL_USAGE$ no se refiere al ID de objeto de la vista sino al de la
tabla subyacente.
Claramente para que este método sea útil, necesitamos adquirir una línea base con la cual la información
actual pueda ser comparada. Esta línea base puede ser establecida de varias maneras. Si se ha realizado
una copia de seguridad de la tabla COL_USAGE$ se pueden realizar comparaciones con dicha copia,
siempre que dicha copia haya sido realizada en un momento fuera de la intrusión. Si no se tienen copias de
seguridad de la tabla COL_USAGE$ disponibles, puede ser posible determinar, a través de exámenes a las
aplicaciones de bases de datos de la organización y de conversaciones con DBAs y desarrolladores, cuáles
tablas deberían aparecer en la tabla COL_USAGE$ y bajo qué circunstancias. Por ejemplo, si las
aplicaciones de la organización únicamente consultan las tablas 1, 2 3 y resulta que la tabla 4 aparece en
los datos de la tabla COL_USAGE$, uno podría inferir entonces que esto está fuera de lo normal,
implicando investigaciones adicionales. Existen algunas limitaciones cuando nos enfrentamos a inferir
77
detalles de ataques usando la información de la tabla COL_USAGE$. Si nos fijamos con mayor detalle, si
un atacante no implica en su consulta una columna de la tabla en cuestión, entonces no se generara
ninguna entrada en la tabla COL_USAGE$. Así si un atacante realiza la consulta „SELECT PASSWORD
FROM SYS.USER$ WHERE NAME = „SYS‟„, entonces una fila será creada. Sin embargo si la consulta
fuera „SELECT PASSWORD FROM SYS.USER$„ ninguna fila sería creada. [34]
Si un atacante puede ejecutar consultas SQL arbitrariamente con privilegios de DBA, por ejemplo
explotando una brecha de PL/SQL injection, el atacante puede realizar sentencias DELETE en esta tabla.
Sin embargo al llevar a cabo dichas acciones, la evidencia de dichos DELETE quedaría en los Redo Logs
así como en los data files, como se explicó previamente en las secciones 2.5.2.1. y 2.5.2.2. [34]
2.5.2.6.2 Vistas Fijas V$ en el área compartida (shared pool)
Existen varias tablas virtuales y vistas que Oracle mantiene con propósitos de rendimiento. Estas vistas
son accesibles a los DBAs y en algunas ocasiones pueden contener evidencia de ataques. Dos de dichas
vistas son de nuestro particular interés, V$SQL y V$DB_OBJECT_ CACHE. La vista fija V$SQL
contiene una lista de las sentencias SQL ejecutadas recientemente. Ésta es un buffer circular por lo cual a
medida que se va llenando de nueva información, va desechando información antigua. Dependiendo del
tamaño del área compartida (shared pool) y de la longitud de cada consulta, el buffer puede contener una
gran cantidad de consultas antes de que las antiguas sean borradas. La siguiente consulta nos permite
volcar información de la vista V$SQL [34]:
SQL> SET LONG 3000000
SQL> SELECT LAST_ACTIVE_TIME, PARSING_USER_ID, SQL_FULLTEXT FROM V$SQL;
Evidencia de las actividades de un atacante puede ser hallada en esta vista fija y un examen cuidadoso del
SQL_FULLTEXT debería revelarla. Debemos subrayar que si un atacante puede encontrar un modo de
ejecutar SQL arbitrariamente como DBA, de los cuales hay varios mencionados en la sección 2.4.2,
entonces dicho atacante podrá borrar las sentencias SQL de esta vista ejecutando la sentencia ALTER
SYSTEM FLUSH SHARED_POOL‟. [34]
La vista V$DB_OBJECT_CACHE contiene detalles sobre objetos en la librería cache. Existen dos
puntos de interés con respecto a esta vista en particular. El primero es que, si un objeto existe en el cache
78
entonces este probablemente ha sido accedido recientemente, y el segundo es que esta vista puede
contener segmentos de sentencias SQL ejecutadas recientemente [34]. Ver Anexo 36.
El tipo de información almacenada en la columna NAME depende de la columna NAMESPACE. Si la
columna NAMESPACE de una fila es „CURSOR‟ entonces NAME contiene información SQL, si
NAMESPACE es „TABLE/PROCEDURE‟ entonces NAME contiene una tabla o proceso accedidos
recientemente. Así para volcar una lista de consultas ejecutadas recientemente podemos ejecutar [34]:
SQL> SELECT NAME FROM V$DB_OBJECT_CACHE WHERE NAMESPACE = 'CURSOR';
Así mismo para acceder a una lista de procesos y tablas accedidas recientemente podemos ejecutar [34]:
SQL> SELECT OWNER, NAME FROM V$DB_OBJECT_CACHE WHERE NAMESPACE =
'TABLE/PROCEDURE' ORDER BY 1;
Examinando esta información un investigador forense puede determinar si contiene evidencia de un
ataque. Esta vista fija ofrece ciertas ventajas sobre la vista V$SQL. Como ya se indicó, un atacante puede
eliminar la información de la vista V$SQL al ejecutar la sentencia ALTER SYSTEM FLUSH
SHARED_POOL‟, sin embargo, la información de la vista V$DB_OBJECT_CACHE permanece intacta
aun después de la ejecución de dicha sentencia [34].
2.5.2.6.3 Repositorio automático de carga de trabajo AWR
El AWR o repositorio automático de carga de trabajo es usado para recolectar estadísticas relacionadas al
rendimiento. Este guarda información detallada sobre consultas SQL y acceso a objetos y por esto mismo
puede revelar las acciones que un atacante haya tomado. El AWR tiene algunas ventajas frente a las vistas
V$ pues su información es persistente en comparación con la de las vistas V$ que se pierde cuando la base
de datos es desactivada y reiniciada, pero tiene la desventaja de que necesita tomar una “instantánea”, una
vez cada hora, al mismo tiempo que el ataque está en curso. Asumiendo que algunas de las acciones del
atacante han sido capturadas por el AWR entonces las podemos hallar ejecutando la siguiente consulta:
SQL> SELECT ST.PARSING_SCHEMA_ID, TX.SQL_TEXT FROM WRH$_SQLSTAT
ST,
WRH$_SQLTEXT TX WHERE TX.SQL_ID = ST.SQL_ID;
79
Para localizar consultas “interesantes” podemos obtener un timestamp referenciando el SQL_ID:
SQL> SELECT TIMESTAMP FROM WRH$_SQL_PLAN WHERE SQL_ID = „b7v16a01s0f86‟
2.5.3 HERRAMIENTAS ÚTILES EN UN ENTORNO ORACLE
2.5.3.1 LogMiner
LogMiner es una herramienta que provee dos funcionalidades a las bases de datos Oracle. La primera
funcionalidad es la capacidad de LogMiner para recrear el estado de la base de datos en un determinado
instante de tiempo. La segunda funcionalidad es que LogMiner permite a los investigadores forenses
recrear los eventos acontecidos en una línea de tiempo, logrando de esta manera evidenciar paso a paso las
acciones realizadas por los atacantes. Esta segunda funcionalidad es en la que nos enfocaremos, logrando
utilizar sus fortalezas para conseguir evidencia que sea verificable y repetible dentro de una investigación
forense. Los Redo Logs son el insumo principal para LogMiner, ya que en ellos se encuentra la
información histórica del uso de la base de datos. Dentro de cada Redo Log se encuentra todo tipo de
información de manejo de la base de datos, desde datos de creación y eliminación de tablas (DDL),
sentencias de actualización y selección de datos (DML), hasta el tiempo en que se realizó el cambio en la
base de datos y quién realizó la acción. [35] [33] [36]
2.5.3.1.1 Funcionamiento
LogMiner es una herramienta de Oracle que permite recuperar el estado de una base de datos en un
determinado lapso de tiempo. También permite a los investigadores forenses recrear los eventos sucedidos
dentro de la base de datos para realizar una investigación para así poder recaudar pruebas que puedan ser
presentadas ante una corte en un juicio formal. Por esta razón es necesario saber cuál es su funcionamiento
y cuál es estructura. A continuación explicaremos los principios básicos de la herramienta y su forma de
proceder para generar la evidencia. [36] [33] [35]
2.5.3.1.2 Principios
LogMiner hace uso del diccionario de datos, éste en conjunto con los Redo Logs, le permiten a LogMiner
recrear la información histórica. El diccionario de datos se encuentra en el espacio de memoria del SGA
(System Global Directory). Dentro del SGA también se encuentra información útil para que LogMiner
pueda recrear eventos dentro de una línea de tiempo, como por el ejemplo el nombre y la cantidad de
tablas que posee esa instancia de la base de datos. Los Redo Logs son los archivos que poseen toda la
información de la base de datos, desde su creación hasta la última inserción que se realizó en una tabla.
80
Cada registro de un redo log se realiza en el momento en que una transacción se consuma, es decir, cada
vez que se realice una inserción o en un borrado y se dé la instrucción COMMIT. Este almacenamiento de
datos no se realiza en un archivo legible por ASCCI sino que se almacena de forma binaria, por lo cual no
se puede leer a simple vista, y por ende es necesario que se utilice Logminer o algún editor hexadecimal.
[35] Cada vez que se presenta una instrucción COMMIT, el sistema asigna un número de secuencia para
poder identificar posteriormente el orden de los acontecimientos. Este número es conocido como SCN y
aunque se encuentra relacionado con el orden de los acontecimientos, no es un dato que podamos tener en
cuenta para relacionar directamente con el tiempo real del acontecimiento, para que se pueda realizar un
seguimiento detallado de los eventos sobre una base de datos es necesario que el proceso del ARCHIVE
MODE se encuentre en true, ya que este proceso es el encargado de sacar copia del Redo Log a medida
que estos se van llenando. Este proceso por defecto y en la instalación estándar se encuentra en false. [35]
Logminer se encuentra compuesto por los siguientes paquetes [35]:

Dbmlsmd.sql

Dbmlsm.sql

Dbmlsms.sql

Plitblm.sql

Prvtlmd.plb

Prvtlm.plb

Prvtlmrd.plb

Prvtlms.plb
Principalmente paquetes de dos tipos; .plb y .sql, los .sql son paquetes que poseen sentencias SQL y los
.plb son archivos que poseen código PL/SQL que por disposición de Oracle, estos se encuentran
codificados y protegidos para que no se les hagan modificaciones [33] [35].
Con los datos anteriormente explicados, podemos entrar a exponer cuál es la forma en la que funciona
LogMiner de una manera más detallada [35].
2.5.3.1.3 Proceso
Inicialmente el proceso LOGWRITTER de Oracle se encarga de escribir los eventos que sucedan sobre la
base de datos en el buffer de los Online Redo Logs que se encuentra ubicado en el espacio de memoria
SGA. Una vez se encuentra esta información en el buffer, está es llevada a los archivos de los Redo Logs
81
que se encuentran almacenados dentro del disco duro del sistema en el cual se encuentre corriendo la base
de datos. Esta operación se realiza cada vez que se envíe una sentencia COMMIT o cada vez que pasen 3
segundos. Los Redo Logs son llenados de manera secuencial por el proceso LGWR, por los cual la
información que es almacenada dentro de los Redo Logs se encuentra almacenada de manera secuencial,
cosa que es fundamental para poder recrear una secuencia de eventos. Esto se debe a que en caso de que se
necesite recuperar el estado de una base de datos, se pueda recrear de manera idéntica a la original [35]
[36].
Una vez los Redo Logs que fueron creados se llenan, el LGWR sobrescribe de manera cíclica los Redo
Logs anteriores, por lo que existe un proceso que se encarga de descargar la información que hay en ellos
y almacenarla en un lugar diferente. De esta manera el Logwritter puede seguir escribiendo los eventos sin
perder la información histórica de la base de datos, proceso llamado ARCHIVER PROCESS o ARC. En
la instalación por defecto, este proceso se encuentra en false, por lo cual cada vez que se llenen los Redo
Logs la información histórica será sobre escrita. Oracle permite la multiplexación de estos archivos, es
decir, copias de los archivos en diferentes locaciones. Esta funcionalidad permite a un investigador
realizar un análisis de la base de datos sin tener que tocar el sistema original, además que proporciona
otras ventajas a la hora de realizar una investigación, ya que se puede realizar comparaciones entre las
copias para verificar que no haya sido ninguna alterada [36] [33].
Finalmente Logminer usará los Redo Logs como insumo principal para poder realizar consultas sobre los
hechos acontecidos haciendo uso del lenguaje SQL y proporcionando una interfaz de consulta con una
menor dependencia técnica [33] [36].
2.5.3.1.4
Configuración
Por defecto las funcionalidades de LogMiner se encuentran desactivadas, por lo tanto es necesario validar
que dentro del servidor que se encuentren configuradas las rutas de almacenamiento del diccionario, para
poder hacer uso de esta herramienta. Inicialmente debemos validar la ruta del diccionario de datos, para
esto podemos hacer uso de la siguiente sentencia. Ver Anexo 21 [37]
Select value from v$parameter where name='utl_file_dir';
Si la herramienta ya se encuentra configurada entonces aparecerá la ruta en la cual se almacenaran los
diccionarios de datos, en caso de que no sea así, entonces la tendremos que configurar de esta manera.
[37]
alter system set utl_file_dir='[ruta]' scope=spfile;
82
Ya que modificamos un valor dentro del archivo de parámetros del sistema, entonces debemos reiniciar la
base de datos para que esta tome los nuevos cambios que fueron colocados para el inicio de la ruta del
diccionario de datos como se muestra en el Anexo 21. Luego de esto se vuelve a validar la ruta de
configuración del diccionario.
2.5.3.1.5 Creación del diccionario
El diccionario es el archivo encargado de almacenar un listado general de aquellos Online Redo Logs u
Offline Redo Logs que se vayan a analizar dentro de la investigación. Para crear un diccionario de datos
debemos ejecutar la siguiente sentencia. [37]
exec
DBMS_LOGMNR_D.BUILD(
DICTIONARY_FILENAME
=>'[nombre
del
fichero]',
DICTIONARY_LOCATION => '[ruta donde crear el fichero]');
Ilustración 8: Creación diccionario de datos
Es necesario que se cree el diccionario dentro de la carpeta que fue especificada anteriormente en la
configuración inicial de LogMiner.
2.5.3.1.6 Agregar Logs al diccionario de datos
Una vez hemos creado nuestro diccionario, ya podemos cargarlo con los archivos que deseamos
investigar, para hacer esto debemos usar la siguiente sentencia. Ver Anexo 22
exec DBMS_LOGMNR.add_logfile('[fichero REDO con ruta completa]');
Una vez ya tenemos nuestros archivos de investigación cargados en el diccionario de datos, entonces ya
podemos comenzar a analizarlos.
En caso de que ya no queramos analizar un archivo que se encuentre incluido dentro del diccionario
podemos utilizar la siguiente sentencia para eliminarla del diccionario de datos. [37]
exec DBMS_LOGMNR.REMOVE_LOGFILE (LOGFILENAME => '[fichero REDO con ruta completa]');
83
2.5.3.1.7 Iniciar Logminer con un diccionario de datos especificado
Para iniciar Log Miner podemos hacerlo de dos formas. La primera forma es únicamente colocando el
archivo de diccionario especificado que posteriormente le proporcionara a logminer el acceso a los
archivos que en él fueron configurados anteriormente. La segunda forma es especificando la actualización
automática de las sentencias DDL. [37]

Forma 1
exec
DBMS_LOGMNR.START_LOGMNR(DICTFILENAME
=>'[ruta
y
nombre
del
diccionario]');

Forma 2
exec DBMS_LOGMNR.START_LOGMNR(DICTFILENAME =>'[ruta y nombre del diccionario]',
OPTIONS => -DBMS_LOGMNR.DDL_DICT_TRACKING
);
2.5.3.1.8 Creación de las secuencias de tiempo
Para ver la creación de secuencias de tiempo mirar Anexo 46.
2.5.3.1.9 Problemas
Para ver los problemas comues que posee Log Miner ver 5.45
2.5.3.1.10 Timestamps
Dentro de LogMiner por medio de la instrucción descc$logmnr_contents podemos ver los tipos de datos
que maneja la aplicación. Si aplicamos esta instrucción, podemos ver que el TIMESTAMP dentro de la
aplicación maneja un tipo de datos date, que no es un tipo de datos TIMESTAMP. Los tipos de datos date
solamente tienen una precisión de un segundo, por lo cual cuando logminer lo traduce, únicamente lo
coloca en un date y de esta forma lo presenta, lo cual es un inconveniente ya que muchas transacciones
pueden haberse realizado en el mismo segundo y por ende hace imposible saber cómo diferenciar una
transacción de otra, por lo que no se puede saber el tiempo en exacto para ser presentado dentro de una
corte. [35] [33] [36]. Ver Anexo 23.
84
2.5.3.2 SANS 2010 TOOLS
David Litchfield ha hecho un gran aporte a nivel investigativo en todo lo relacionado con análisis forense
sobre bases de datos Oracle y hace algunos años noto la necesidad de contar con herramientas forenses
específicamente pensadas para proveer al examinador forense los medios para extraer de forma sencilla y
confiable la información de las diversas fuentes de evidencia en la base de datos Oracle. En torno a esta
situación, Litchfield ha venido trabajando en un conjunto de herramientas que ha publicado, en una
versión preliminar, en la página web de su compañía V3rity Software, dichas herramientas han sido
empaquetadas provisionalmente bajo el nombre de “SANS 2010 Tools” y dentro de dicho paquete
encontramos:
 Dumpaction: Al parecer una versión mejorada de su herramienta “ddldump” pues permite volcar las
entradas DDL de un archivo Redo Log a un archivo XML fácilmente comprensible. Afirmamos que es
una nueva versión pues en “ddldump” encontramos algunos errores a la hora de crear las etiquetas de
cierre del campo <SQL STATEMENT> y en “dumpaction” se añade la funcionalidad de volcar las
sentencias INSERT cambiando el parámetro “ddl” por “ins”. Las funcionalidades para volcar
sentencias DELETE y UPDATE vienen enunciadas pero al intentar usarlas aparece un mensaje que nos
informa que aún se encuentran en etapa de desarrollo.
 Dumpextents: Permite extraer la información de un Undo File de Oracle y marca las entradas de
interés para un examinador forense, tales como filas eliminadas, inserción de datos, etc.
 Filter: Recibe como parámetros dos archivos XML, el primero debe contener el volcado generado
anteriormente por dumpaction y el segundo contiene la información de filtro que deseamos aplicar a las
entradas del primer archivo. Litchfield provee algunos ejemplos de filtro:
o
Filt1: extrae las entradas relacionadas con un parámetro deseado, en este caso las que tienen un
valor de 511 en el parámetro OBJECT_ID. Ver Anexo 36.
o
Filt-bool: extrae únicamente las entradas para las cuales se cumple un predicado booleano, en este
caso, las entradas con CURRENT_USER igual a SYS y SESSION_USER diferente. Esto será de
gran utilidad en el capítulo 2.6.1 para estudiar con mayor facilidad las acciones de un atacante.
Ver Anexo 36.
o
Filt-grant: extrae todas las sentencias para las cuales el campo SQL_STATEMENT contiene una
expresión determinada, en este caso “GRANT DBA”. Ver Anexo 36.
85
o
Filt-xid: extrae las entradas para las cuales el campo XID, que representa el identificador de la
transacción, sea igual al contenido entre las etiquetas<WHAT>. Ver Anexo 36.
 Orablock – Oratime: Previamente publicadas bajo el nombre de CADFILE. Orablock permite
determinar cuándo un bloque de datos Oracle ha sido modificado sin necesidad de montar los data files
en un servidor Oracle, lo cual haría que se modifiquen. Oratime toma un SCN Timestamp de un Redo
Log y lo convierte a Fecha y Hora. [38] [39] Ver Anexo 36.
2.6 CASO DE ESTUDIO
Para validar las técnicas y herramientas mostradas en los capítulos anteriores presentaremos a
continuación, un caso de estudio en el cual, tras realizar un ataque de escalamiento de privilegios,
pasaremos a tomar ventaja de la máquina virtual de java implícita en Oracle, denominada Aurora, para
obtener o “concedernos” permisos arbitrarios de Java., los cuales, entre otras cosas, son necesarios para
leer y escribir archivos y para ejecutar sentencias de sistema operativo. Dichos permisos son almacenados
en Oracle en la tabla JAVA$POLICY$. Dentro de los paquetes PL/SQL instalados por defecto en Oracle,
se encuentra el paquete DBMS_JVM_EXP_PERMS, que fue pensado para permitir migrar las políticas de
Java entre distintos servidores de base de datos, y que va a ser nuestra puerta de entrada hacia la
adquisición de privilegios o permisos arbitrarios de Java. El paquete mencionado, es propiedad de SYS
pero es ejecutable por PUBLIC. Dentro del paquete encontramos un procedimiento llamado
IMPORT_JVM_PERMS que recibe como parámetro una Java Policy. Usaremos precisamente esta
característica para crear nuestra propia política Java, dentro de la cual incluiremos un ataque de PL/SQL
injection que nos concederá permisos Java de entrada y salida sobre archivos. Como el procedimiento es
ejecutado con privilegios de SYS, por tratarse de un paquete que define derechos, nuestra política es
agregada a la tabla. [15] [14]. Ver Anexo 24.
2.6.1 EVIDENCIA DE LAS ACCIONES DEL ATACANTE
Sabiendo que se realizó el ataque exitosamente, veremos las posibles pistas que el atacante dejo en las
diferentes fuentes de información. Ver Anexo 25.
86
2.7
TECNICAS ANTI FORENSES EN BASES DE DATOS ORACLE
2.7.1 Técnicas anti forenses en contra del Redo Log
Si un usuario consigue privilegios de DBA, por ejemplo, a través de SQL injection, entonces puede
entremeterse con los Redo Logs. Esto puede ser tan simple como ejecutar el comando ALTER DATABASE
CLEAR LOGFILE el cual limpia completamente todas las Redo Entrys de los archivos de Log removiendo
la mayoría de la evidencia de lo que hizo. Sin embargo al ejecutar el comando, el texto de la sentencia se
registrara en el archivo Redo actual, como se menciona en la sección 2.5.2.1 . Muchas veces un ataque de
destrucción evidencia genera nueva evidencia. Intentar limpiar el registro actual resultará en error [16] [3].
SQL> ALTER DATABASE CLEAR LOGFILE GROUP 1;
ALTER DATABASE CLEAR LOGFILE GROUP 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of instance orcl (thread 1)
ORA-00312: online log 1 thread 1:
'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG'
Aun si el atacante cambia el archivo de Log usando el comando “ALTER SYSTEM SWITCH
LOGFILE”, el nuevo archivo Log contendrá cualquier intento de borrar el archivo. Intentar borrar el
archivo de Log usando UTL_FILE falla debido a una violación de intercambio [16].
Cualquier intento de limpiar los Redo Logs de estas maneras será advertido. Un atacante astuto puede en
lugar de esto elegir escribir o sobre escribir entradas validas con entradas falsas en los Redo Logs.
Entendiendo como se genera la suma de comprobación para un bloque dado, todos las acciones DDL y
DML del atacante pueden ser sobre escritas dejando el resto del archivo Log intacto. Esto será difícil de
detectar [16].
Si un sistema no está corriendo en modo de archivado, un atacante sin permisos de DBA puede cubrir sus
huellas o al menos reemplazarlas con actividad de apariencia más benigna. Por ejemplo, puede realizar
múltiples INSERTS en una tabla y cuando los archivos de Log se van llenando y se cambian, las entradas
previas se sobrescribirán [16].
87
2.7.2 Técnicas anti forenses contra los rastros dejados por la eliminación de objetos
Un atacante profesional debe dejar la menor cantidad de rastros y por ende es poco probable que cree y
elimine muchos objetos. De hecho, al usar un ataque de CURSOR INJECTION [40], un atacante no
necesita crear objetos de ningún tipo. Teniendo conocimiento de cómo se crea y se verifica el checksum de
un bloque, como se explicó en la sección 2.7.1. , no está más allá de los medios técnicos de un atacante el
modificar el bloque sobre la marcha usando UTL_FILE o Java desde dentro de la misma base de datos
para esconder sus acciones del investigador forense.
2.7.3 Técnicas anti forenses en contra de las tablas de auditoria
Como se explicó en la sección 2.5.2.3, un atacante que haya realizado un escalamiento de privilegios
exitoso, puede hacer uso de una sencilla técnica anti forense de eliminación consistente en realizar un
DELETE bien sea de las filas relacionadas a su usuario en la tabla SYS.AUD$, o cualquier otra tabla del
Audit Trail de Oracle, o sencillamente todas las filas de la tabla en cuestión. Esta acción puede ser
detectada por un examinador forense tanto en los Redo Logs como en los Data Files En los primeros se
almacenara la sentencia DELETE como tal en los segundos permanecerán temporalmente las filas
marcadas como eliminadas mientras llega el momento de reutilizar el espacio que ocupaban.
2.8 GUÍA METODOLOGICA PARA EL ANÁLISIS DE BASES DE DATOS ORACLE
Ilustración 9: Mapa de Acción
88
A continuación mostraremos cual es la manera en la que un investigador forense debe abordar una escena
que involucre un manejador de bases de datos Oracle.
1. Verifique el estado del servidor
a. En caso de que el servidor este apagado valide por qué está apagado con el DBA o la
persona a cargo y bajo qué circunstancias se apagó.
b. En caso de estar prendido continúe.
2. Recoja la información Volátil
a. Recaude la fecha y la hora del sistema usando el comando date. (Ver Live Response).
b. Recoja los usuarios que se encuentren actualmente activos dentro del sistema. (Ver Live
Response).
c. Recaude la información de todos los usuarios dentro del directorio activo. (Ver Live
Response).
d. Lista de conexiones y puertos. (Ver Live Response).
e. Listado de procesos actualmente en ejecución dentro de la máquina. (Ver Live Response).
f.
Lista de DLL y objetos compartidos. (Ver Live Response).
g. Listados de Handles que se encuentren abiertos. (Ver Live Response).
h. Realizar volcados de memoria. (Ver Live Response).
i.
Realizar volcados de memoria del sistema. (Ver Live Response).
j.
Árbol y nombres de Archivos. (Ver Live Response).
k. Volcado de información del registro. (Ver Live Response).
l.
Copia de los logs del servidor. (Ver Live Response).
3. Conéctese a la base de datos utilizando el usuario SYS as SYSDBA.
4. Recaude la información que se encuentra en las vistas fijas V$SQL, WRH$_SQLSTAT y
WRH$_SQLTEX
5. Desconéctese de la base de datos. (Ver validación listener)
6. Conéctese al TNSlistener colocando en la consola tnslstnr. (Ver validación listener)
7. Verifique la versión del TNSlistener. (Ver validación listener)
8. Verifique si el listener se encuentra activado (Ver validación listener)
89
9. Verifique la ruta en que se están almacenando los logs. (Ver validación listener)
10. Recolecte los logs que se encuentran especificados en el paso 9.
11. Una vez tenga estos datos desconéctese del TNSListener.
12. Conéctese a la base de datos Utilizando Usuario SYS
13. Recolecte la información de acceso al sistema utilizando AUD$ (Ver tabla AUD$).
14. Recoja la información de usuarios y roles (Ver Usuarios y roles).
15. Recoja la lista de todos los privilegios del sistema(Ver lista de privilegios)
16. Recolecte los permisos sobre los objetos(Ver Lista de permisos sobre objetos)
17. Lista de objetos (Ver listado de objetos)
18. Verifique la configuración del Archiver(Ver validación Archiver)
a. En caso de estar en Archivemode verifique la ruta.
i. Verifique el número de Redo Logs configurados. (Ver manejo Redo log)
ii. Lugares en que se multiplexó (en caso de que hayan multiplexado). (Ver manejo
Redo log)
iii. Tamaño en kilo bytes de los mismos. (Ver manejo Redo log)
iv. Halle el Md5 de los mismos en caso de que esté disponible y
compárelos para verificar la integridad. (Ver manejo Redo log)
b. En caso de que este apagado continué.
19. Una vez tenga los Redo logs almacénelos en una ubicación segura.
20. Vaya a al home de la aplicación y recolecte todos los archivos con extensión .dta (datafiles).( Ver
ubicación data files)
21. Almacene los archivos.
22. Recolecte los archivos de trace que se encuentren configurados en el sistema. ( Ver ubicación
Trace files)
23. Cierre la conexión con la base de datos.
24. Abra el archivo .xml que recolecto del TNSlistener. (Ver validación listener)
25. Busque dentro del archivo los registros sospechosos y almacene los tiempos de ejecución.
26. Almacene la ip del registro y el nombre de máquina del registro.
27. Haga este proceso para todos los registros a investigar.
28. Abra la tabla de auditoria que fue almacenada en el paso 13 y busque aquellos registros que
concatenen con los tiempos almacenados en el paso anterior. (Ver tabla de Auditoria)
90
29. Abra los archivos RedoLog con la herramienta de investigación que esté usando (Sans2010,
LogMiner o Winhex).
30. Verifique todos los registros que posean un ID que concuerde con los extractados en el paso 29 y
almacénelos.
31. Abra el TKPROF para hacer los análisis de los archivos trace recolectados en el paso 22. ( Ver
Trace files)
32. Verifique dentro de estos archivos los ID que concuerden con los de los ID encontrados en los
pasos 30 y 29.
33. Correlacione.
2.9 RECOMENDACIONES PARA LOS INVESTIGADORES FORENSES EN
INFORMÁTICA EN BASES DE DATOS ORACLE.
Para ver las recomendaciones forenses favor referirse al Anexo 47
91
3
CONCLUSIONES
Como hemos visto a través del documento existe una gran cantidad de fuentes de las cuales Oracle hace
uso para garantizar la confiabilidad, integridad, y no repudio del sistema. Dichas funcionalidades pueden
ser utilizadas por un investigador forense como fuentes de evidencia para detectar, seguir y analizar las
acciones de un atacante sobre una base de datos.
Es fundamental saber cuáles son las fuentes de información existentes, cómo verificar que se encuentran
disponibles y la forma de configurarlas, para garantizar que en un evento, pueda apoyar la identificación,
reconstrucción y prueba de la ocurrencia de un posible ataque conservando la confiabilidad e integridad de
la evidencia.
De los Redo Logs podemos extraer las sentencias DML y DDL que fueron ejecutadas en la base de datos
en un lapso de tiempo determinado, El usuario con el cual se inició sesión, el usuario que ejecuta la
sentencia, y el texto de la sentencia.
Para garantizar que la evidencia almacenada en los Redo Logs no sea sobrescrita rápidamente debemos
prestar especial atención al parámetro Log_Archive_Start.
Aunque los trace files nos proporcionan gran cantidad de información acerca de los movimientos de los
usuarios, debemos tener mucho cuidado con su configuración ya que pueden representar gran cantidad de
uso de espacio en disco y además puede repercutir en el rendimiento de la base de la datos.
Para estudiar todo lo relacionado con la actividad de la interacción de la base de datos con los clientes,
podemos valernos del TNS listener log en el cual encontramos evidencia de posibles ataques de
enumeración de usuarios y contraseñas. Con una adecuada correlación de eventos entre las entradas
almacenadas en el listener log y las entradas que se encuentran dentro de la tabla de auditoría AUD$
podemos identificar de manera precisa el origen y el momento exacto de inicio de un ataque.
Aunque LogMiner tiene una falla mayor en la administración de los timeStamps, sigue siendo una
herramienta que apoyada en otras, como DumpAction o alter system dump file, puede ayudar a esclarecer
de manera muy precisa las secuencias de eventos dentro de una investigación forense, dando resultados
confiables.
92
Es fundamental tener un buen kit de herramientas ya que muchas de las fuentes de evidencia pueden llegar
a ser muy extensas y su análisis muy tedioso.
Los logs de acceso del servidor pueden dar una gran ayuda para esclarecer los eventos acontecidos en ella.
Dependiendo de una buena correlación de eventos con los TNS Logs, las tabla de auditoría y las demás
fuentes de información.
Es importante que los Redo Logs se encuentren en varias ubicaciones ya que esto disminuirá el impacto de
que un atacante utilice alguna técnica anti-forense y elimine de manera definitiva la fuente de evidencia.
Los Oracle Data files nos permiten recuperar filas y por ende objetos eliminados siempre y cuando el
espacio que ocupaban en los bloques de datos no haya sido reutilizado. Para realizar un análisis sencillo y
eficiente es de vital importancia determinar en primera instancia cuales son los objetos de interés para la
investigación, de lo contrario nos enfrentaríamos a un proceso sumamente extenso y desgastante.
4
TRABAJOS FUTUROS
A continuación enunciamos los trabajos que consideramos pueden dar continuidad a esta investigación, si
desea ver una descripción más detallada, diríjase al Anexo 48.
 Herramienta general de análisis de Fuentes de evidencia
 Análisis de Checksums en Oracle
 Time Stamps- Logminer
 Extensión a otros entornos
93
5
ANEXOS
5.1 ANEXO 1
Ilustración 10: Sofisticación Vs. Conocimiento del atacante [41].
94
5.2 ANEXO 2
Ilustración 11: Intrusiones de seguridad en 2010 [1]
95
5.3 ANEXO 3
Ilustración 12: Actualizaciones de seguridad [1]
96
5.4 ANEXO 4
Ilustración 13: Estructura de la base de datos Oracle [6]
97
5.5 ANEXO 5
Ilustración 14: Técnicas Anti-forenses [3]
98
5.6 ANEXO 6
Ilustración 15: Vulnerabilidad usada para comprometer el sistema [9]
99
5.7 ANEXO 7
Ilustración 16: Configuración de los Redo Logs en la creación de la base de datos
100
5.8 ANEXO 8
Sub Bloque (64 Bytes)
16 Bytes
16 Bytes
16 Bytes
16 Bytes
XOR
XOR
XOR
16 Bytes
4 Bytes
4 Bytes
4 Bytes
4 Bytes
XOR
4 Bytes
XOR
4 Bytes
XOR
4 Bytes (DWORD)
A (16 Bits)
B (16 Bits)
Si A == -B -> La suma de verificación es correcta
101
5.9 ANEXO 9
Ilustración 17: Bloque de datos Oracle [19]
102
5.10 ANEXO 10
Ilustración 18: Consulta de verificación del estado de las funciones de auditoria [21]
103
5.11 ANEXO 11
Nombre de la columna
Tipo de dato
OBJ#
NUMBER
DATAOBJ#
NUMBER
OWNER#
NUMBER
NAME
VARCHAR2 (30)
NAMESPACE
NUMBER
SUBNAME
VARCHAR2(30)
TYPE#
NUMBER
CTIME
DATE
MTIME
DATE
STIME
DATE
STATUS
NUMBER
REMOTEOWNER
VARCHAR2 (30)
LINKNAME
VARCHAR2 (128)
FLAGS
NUMBER
OID$
RAW (16)
SPARE1
NUMBER
SPARE2
NUMBER
SPARE3
NUMBER
SPARE4
NUMBER
Tabla 1: Tipos de datos de la tabla OBJ$ [19]
104
Ilustración 19: Volcado de información a partir de los tipos de dato de la tabla OBJ$ [19]
105
5.12 ANEXO 12
Ilustración 20: Entradas en el listener log generadas al ejecutar sidguess.exe [25]
106
5.13 ANEXO 13
Ilustración 21: Registro de eventos de conexiones privilegiadas SYSDBA y SYSOPER en Windows [25]
Ilustración 22: Evidencia de inicio de sesión cuando la auditoria esta desactivada [25]
107
5.14 ANEXO 14
Ilustración 23: Localización traza
Ilustración 24: Traza sin formato
108
5.15 ANEXO 15
Ilustración 25: Sentencias de volcado
Ilustración 26: Volcado NOSYS
109
5.16 ANEXO 16
Ilustración 27:Comando Time
Ilustración 28: Comando Date
110
5.17 ANEXO 17
Ilustración 29: Comando net user
Ilustración 30: Detalles de usuario
111
5.18 ANEXO 18
Ilustración 31: Lista de conexiones y puertos
112
5.19 ANEXO 19
Ilustración 32: Ubicación Home
Ilustración 33: Ubicación Archivo de Inicio
113
5.20 ANEXO 20
Otro ejemplo es el siguiente [26]:
SQL> SELECT U.ORA_ROWSCN, U.NAME FROM SYS.USER$ U WHERE TYPE#=1 ORDER BY 1;
ORA_ROWSCN NAME
---------- -----------------------------537106 EXFSYS
537106 DMSYS
537106 TSMSYS
537106 DBSNMP
537106 ANONYMOUS
537106 XDB
537106 CTXSYS
537106 WMSYS
1465169 OUTLN
1465169 DIP
1465169 SYS
1465169 SYSTEM
2277427 MARK_POINT2
2277427 PWDTEST
2277427 MARK_POINT
2277427 FINDME_TOO
2277427 FINDME
2277427 SCOTT
2277427 MGMT_VIEW
2277427 MDDATA
2277427 SYSMAN
2277427 MDSYS
2277427 SI_INFORMTN_SCHEMA
2277427 ORDPLUGINS
2277427 TESTUSER
2277427 OLAPSYS
2277427 ORDSYS
27 rowsselected.
114
5.21 ANEXO 21
Ilustración 34: Validación Ruta diccionario Logminer
Ilustración 35: Configuración ruta diccionario
Ilustración 36: Validación Pos activación
115
5.22 ANEXO 22
Ilustración 37: Agregando archivos de investigación
116
5.23 ANEXO 23
Ilustración 38: Tipos de datos LogMiner
117
5.24 ANEXO 24
Como primera medida creamos un nuevo usuario (BONIFACIO) únicamente con el privilegio CREATE
SESSION, desde el cual realizaremos el ataque:
Ilustración 39: Creando el usuario a explotar
Verificamos que el usuario BONIFACIO únicamente tenga el privilegio que le acabamos de asignar y que
no posee ninguna entrada, es decir, no tiene ningún permiso en la tabla de políticas de Java:
Ilustración 40: Revisando los privilegios del usuario
118
Ilustración 41: Verificando los permisos Java del usuario
Para esta última verificación debimos desconectarnos y luego autenticarnos como SYS.
Posteriormente intentamos autenticarnos con BONIFACIO como SYSDBA pero como era de esperarse,
recibimos un mensaje de privilegios insuficientes. Entonces iniciamos sesión normalmente y procedemos
a atacar. Una vez conectados como BONIFACIO, creamos la política Java POL, y un cursor C1 que
incluye dentro de sus líneas el ataque de PL/SQL inyection. Posteriormente ejecutamos el cursor, el cual
alimenta nuestra política, y finalmente ejecutamos el procedimiento IMPORT_JVM_PERMS con POL
como parámetro, lo cual agregará la nueva política Java para el usuario BONIFACIO [15] [14]:
Ilustración 42: Sentencia de inyección para obtener privilegios Java arbitrarios
Ahora nos desconectamos, e iniciamos sesión como SYS para mostrar que efectivamente, logramos
conceder permisos Java al usuario BONIFACIO:
119
Ilustración 43: Verificación de inserción de nuestra Política Java
Si el usuario BONIFACIO tuviera el privilegio CREATE PROCEDURE, podría haciendo uso de una
clase Java y un PL/SQLWrapper, creados por él y ejecutar sentencias de Sistema Operativo, pero como no
lo posee, usamos la función de Oracle DBMS_JAVA_TEST.FUNCALL, que recibe como único
parámetro
una
cadena
String,
para
hacer
un
llamado
al
método
main()
de
la
clase
“oracle/aurora/util/Wrapper”, con el cual abrimos una consola de Windows (cmd.exe) y ejecutamos un
comando de sistema operativo. En nuestro caso, dicho comando simplemente guarda la salida de la
consola en un archivo que hemos llamado OUT.LST [14] [15].
Ilustración 44: Sentencia para ejecutar comandos de sistema operativo
Aunque al correr esta sentencia parece que nada ha sucedido, podemos verificar en la ruta especificada
que el archivo en cuestión ha sido creado, confirmando el éxito de nuestro ataque. Si bien escogimos
simplemente guardar la salida de la consola en un archivo, pudimos haber elegido ejecutar cualquier otro
comando del sistema operativo como mostraremos a continuación. [15] [14]
120
Ahora que podemos ejecutar comandos de sistema operativo, procedemos a crear un nuevo usuario del
sistema con nombre “BONIFACIO” y contraseña “Javeriana.2010” [14] [15]:
Ilustración 45: Creación de un usuario en el sistema operativo
Y tras haber creado el usuario de sistema, lo agregamos al grupo de administradores ejecutando la
siguiente sentencia [14] [15]:
Ilustración 46: Agregando el usuario al grupo de administradores del sistema operativo
Ahora usamos la función SET_OUTPUT_TO_JAVA, también incluida en el paquete DBMS_JAVA, la
cual recibe como dos de sus parámetros una sentencia SQL y puede ser explotada por un ataque de Lateral
Injection. Dicha función nos permite re direccionar la salida escrita en System.out y System.err hacia una
nueva sesión virtual de Java, y ejecuta las sentencias que se le pasaron en los parámetros
INITIALIZATION_STATEMENT y FINALIZATION_STATEMENT, así que en nuestro caso, cuando
se genere alguna salida de error dirigida a System.out o System.err, se ejecutará la sentencia GRANT
DBA TO BONIFACIO. [14] [15]
121
Ilustración 47: Lateral Injection al re direccionar la salida de un error
Sin embargo, dicha sentencia requiere ser ejecutada con privilegios de SYS, por lo que usaremos el
paquete DBMS_CDC_ISUBSCRIBE que es públicamente ejecutable y es propiedad de SYS, el cual
simplemente envuelve una aplicación Java. Al pasarle un nombre de suscripción inválido al procedimiento
INT_PURGE_WINDOW de este paquete, forzamos un error que es escrito a System.err. Cuando esto
ocurre, la sentencia que inyectamos en la función anterior será ejecutada en una nueva sesión, que es
propiedad de SYS y por ende es ejecutada con privilegios de SYS, y de este modo conseguimos
concederle privilegios de DBA al usuario BONIFACIO. [14] [15]
Ilustración 48: Ejecución de un paquete de SYS con parámetros inválidos para ejecutar nuestro
ataque
Como vemos en la Ilustración 48, tras generar la salida de error, nuestro ataque tiene éxito y el usuario
BONIFACIO puede establecer su rol como DBA.
122
5.25 ANEXO 25
Para examianr las diferentes fuentes de evidencia tras el ataque, comenzamos con el archivo de log del
TNS Listener. Para acceder al archivo del TNS Listener nos dirigimos a la ruta especificada en el campo
Listener Log File y comenzamos a mirar cuales posibles conexiones pueden ser sospechosas sabiendo ya
, que el evento de seguridad tuvo lugar en un determinado lapso de tiempo. Sabiendo que el ataque se
presento el 15 de Noviembre, podemos acotar todas las conexiones sospechosas que se hayan generado en
esa ventana de tiempo.
Habiendo Realizado un análisis detallado del log encontramos tres entradas sospechosas en esa ventana de
tiempo.
<msg time='2010-11-15T014:55:27.186-08:00' org_id='oracle'
comp_id='tnslsnr'
type='UNKNOWN' level='16' host_id='WIN-L68IWUFYSVD'
host_addr='192.168.0.4'>
<txt>15-NOV-2010 14:55:26 *
(CONNECT_DATA=(SERVICE_NAME=javeriana)(CID=(PROGRAM=C:\app\Administrato
r\product\11.1.0\db_1\bin\sqlplus.exe)(HOST=WINOOR7X3B1SNQ)(USER=Administrator))) *
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.0.26)(PORT=49169)) * establish *
javeriana * 0
</txt>
</msg>
Como podemos ver en la anterior entrada podemos encontrar dos características particulares dentro de los
campos. El primero es que es una conexión externa proveniente de la maquina WIN-OOR7X3B1SNQ
identificada con la IP 192.168.0.26. Lo extraño dentro de esta entrada es que en todo el día, no se
presentaron más conexiones provenientes de fuera de la base de datos haciendo de esta entrada y este host
una entada sospechosa dentro del log. Posteriormente debemos tener en cuenta esta información para
poder realizar correlación de eventos con las tablas de auditoría, porque estas tienen información de los
nombres de las maquinas que se conectan y además nos proporcionan la cuenta dentro de la base de datos
en caso de que se haya conectado a la misma.
123
Bajo este mismo orden de ideas también podemos hacer uso de los archivos de traza que genera el
sistema. Estos archivos de traza se encargan de almacenar absolutamente todas la actividades que realice
un usuario mientras se encuentre activada la traza sobre él, para este caso de estudio se configuro una traza
para saber cuáles fueron las acciones realizadas por el atacante. Para ver las trazas nos dirigimos a la ruta
donde se encuentren almacenadas las trazas de usuario. Una vez allí la abrimos con tkprof para darle
formato y colocarlo en el computador del investigador.
Ilustración 49: Proceso para darle formato al archivo trc
Una vez tenemos listo este archivo podemos ver que sentencias y cuál fue la actividad que realizo el
usuario dentro de la base de datos, encontrando clara evidencia del ataque ya que podemos identificar de
manera exacta que tipo de sentencia utilizo. Dentro de este archivo podemos ver la secuencia exacta de
eventos en el sistema. El usuario ejecuto 7 sentencias que muestran como fue el ataque.
Ilustración 50: Sentencia 1 Ejecución de un procedimiento para explotar vulnerabilidad de aurora
124
Ilustración 51: Sentencia 2 Permisos para modificar la entrada y salida del sistema
Ilustración 52: Sentencia 3 Creación de archivo de salida OUT.LST
Ilustración 53: Creación de un usuario dentro del sistema operativo
125
Ilustración 54: Ejecución de permisos para Otorgar perfil de DBA
Ilustración 55: Flujo de información para crear el overflow
Ilustración 56: Set Role as DBA
126
Como podemos ver en los trace files queda de manera exacta la traza del eventos y de acciones ejecutadas
por el usuario que se encuentra bajo investigación.
Después de revisar la evidencia existente en el TNS Log y los Trace Files pasamos a examinar los Redo
Logs de nuestra base de datos en busca de evidencia, para realizar la inspección de una manera más
sencilla y eficiente, usamos la herramienta “dumpaction.exe”, publicada por David Litchield en la página
de su empresa V3rity Software (www.v3rity.com/products) dentro del paquete “SANS 2010 Tools”. Esta
herramienta parece ser una versión mejorada de una herramienta publicada también en la página
denominada “ddldump.exe” la cual tenía algunos errores además de una funcionalidad limitada. La nueva
herramienta nos permite examinar un archivo de Redo Log y realizar un volcado de todas las sentencias
DDL que este contenga, en un archivo con formato XML. Tras examinar nuestros tres Redo Logs
pasandole a la herramienta el parámetro “ddl”, encontramos evidencia contundente del ataque en el
segundo archivo llamado REDO02.LOG [42]:
Ilustración 57: Evidencia del ataque en los Redo Logs
127
Como se observa en la Ilustración 57, en las dos entradas presentadas el usuario que inicia sesión es
BONIFACIO pero el que ejecuta la sentencia es SYS, lo cual es un indicio de un posible ataque de
inyección. Como las entradas parecen sospechosas las analizamos en mayor detalle y notamos que en la
primera, se modificaron las políticas de Java, lo cual no debería poder hacer un usuario como
BONIFACIO y es precisamente en este punto donde el atacante obtuvo permisos Java arbitrarios.
Analizando la segunda entrada encontramos la evidencia de la segunda parte de ataque en la cual
BONIFACIO logra concederse privilegios de DBA. Para verificar la información obtenida en el volcado
de la herramienta podemos usar el campo <RDRCOFST> que indica el desplazamiento (offset) dentro del
archivo para encontrar la Redo Entry que contiene la sentencia que estamos analizando. Así mismo el
campo <CHVCOFST> indica el desplazamiento para encontrar el Change Vector que contiene la
sentencia SQL. En nuestro caso al desplazarnos a la posición 0030B4B4 encontramos efectivamente el
Change Vector que contiene la sentencia de asignación de privilegios DBA a BONIFACIO.
Ilustración 58: Verificación de la evidencia obtenida en el volcado generado por la herramienta "dumpaction.exe"
Aunque las herramientas de Litchfield aun se encuentra en desarrollo, nos permiten revisar con facilidad y
confiabilidad la posible evidencia existente en un archivo Redo Log, pues además de hacer un volcado
completo de las sentencias DDL contenidas en el archivo, en un formato comprensible, también podemos
filtrar las entradas generadas en un archivo XML haciendo uso de “filter.exe”, también provista por
128
Litchfield. Dicha herramienta recibe un archivo XML de los que habíamos generado con
“dumpaction.exe” y otro archivo XML conteniendo la información del filtro que deseamos aplicar, por
ejemplo, el siguiente XML provisto por Litchfield nos ayuda a extraer únicamente las entradas para las
cuales el usuario que ejecuta la sentencia SQL es SYS pero no concuerda con el usuario que inicio sesión:
Ilustración 59: XML para filtrar entradas sospechosas de un Redo Log
Adicionalmente con la herramienta “dumpaction.exe”, podemos usar el parámetro “ins”, con el cual le
indicamos que deseamos volcar las sentencias INSERT en lugar de las DDL. Las funcionalidades para
volcar sentencias DELETE y UPDATE no se incluyen en la versión actual de la herramienta.
Para verificar la utilidad, en el ámbito de una investigación forense, de la tabla AUD$, perteneciente a la
funcionalidad de auditoría de Oracle (Audit Trail), realizaremos una correlación de la evidencia hallada
en los Redo Logs con la información que nos provee la tabla de auditoría. Basta con revisar
superficialmente los datos de la tabla AUD$ para encontrar evidencia adicional relacionada al intervalo de
tiempo que estamos estudiando, es decir, el lapso temporal cercano al timestamp mostrado en la
Ilustración 57. La entrada del Redo Log correspondiente a dicho timestamp nos indica que el 15 de
Noviembre del año 2010 a las 3:15 PM alguien logro llevar a cabo exitosamente un ataque de inyección a
través del cual concedió privilegios de DBA al usuario BONIFACIO. Consultando las entradas de la tabla
AUD$ con USERID = „BONIFACIO‟ y buscando las relacionadas al momento de interés, encontraremos
la evidencia que buscamos. Con el fin de mostrar lo encontrado de una manera más clara, ejecutamos una
129
sentencia que nos filtra únicamente los campos que nos aportan información de interés para un
examinador forense:
SELECT USERID, USERHOST, ACTION#, RETURNCODE, OBJ$NAME, SPARE1, NTIMESTAMP#
FROM SYS.AUD$ WHERE USERID = 'BONIFACIO';
Ilustración 60: Entradas relacionadas a BONIFACIO en la tabla de auditoría AUD$
Así luce la entrada generada en la tabla AUD$ cuando el usuario BONIFACIO ejecuta el comando SET
ROLE DBA, esto lo sabemos pues el campo ACTION# tiene un valor de 55 con el cual consultamos la
tabla AUDIT_VALUES y obtenemos lo siguiente:
Ilustración 61: Código de acción relacionado al valor hallado en la tabla AUD$
130
Adicionalmente en la Ilustración 60 podemos ver que el nombre de objeto relacionado con la acción es
DBA, basta con relacionar estos dos campos para construir nueva evidencia en contra del atacante. De los
demás campos que seleccionamos podemos obtener información adicional de gran relevancia como el
nombre de la maquina desde la cual se llevo a cabo la acción (USERHOST) y la cuenta de sistema
operativo bajo la cual estaba autenticado el atacante(SPARE1).
Así como nosotros descubrimos esta evidencia fácilmente, un atacante precavido, puede ser consciente o
haber notado que estas entradas se generaron en la tabla AUD$ y teniendo rol de DBA decide borrar todas
las acciones relacionadas con su cuenta. ¿Cómo podemos darnos cuenta de esta técnica anti forense? La
respuesta a esta pregunta es: haciendo uso de los Data Files.
Ilustración 62: Técnica anti forense de eliminación de la evidencia almacenada en la tabla AUD$
Al ejecutar la sentencia mostrada en la Ilustración 62, el usuario elimina toda la información existente en
la tabla AUD$ que podría ser usada por un investigador como evidencia en su contra. Sin embargo como
explicamos en la sección 2.5.2.2.1, las filas eliminadas, o mejor, la información de dichas filas permanece
en los Data files marcada como eliminada mientras que las posiciones que ocupaba tanto en el directorio
de filas como en el espacio de filas no sean reutilizadas.
Para recolectar información del Data File mencionado se debe seguir el procedimiento explicado
originalmente por David Litchfield y que presentado en este documento en la sección recientemente
mencionada. Adicionalmente para detectar filas eliminadas también podemos hacer uso de una
herramienta publicada por Litchfield en el sitio web de su empresa denominada “orablock.exe” la cual
recibe un Data file y permite realizar un volcado de la información contenida filtrándola de diversas
maneras, una de ellas y la más importante para nuestro caso, es la de volcar únicamente la información
eliminada relacionada a un objeto en particular. Para hacer uso adecuado de la herramienta debemos
primero definir cual o cuales objetos son de interés en nuestra investigación, objetos de interés general son
131
la tabla OBJ$, la tabla SOURCE$ y la tabla AUD$. Luego de examinar el Data File SYSTEM01.DBF
con base a las tablas de interés encontramos nuestra evidencia en las entradas relacionadas a la tabla de
auditoría, como era de esperarse. Para analizar únicamente las entradas eliminadas de la tabla AUD$
debemos ejecutar el programa como se muestra a continuación:
Ilustración 63: Sentencia de uso de Orablock para hallar evidencia relacionada a la tabla AUD$ en el Data File
SYSTEM01.DBF
Los parámetros usados en la sentencia de la Ilustración 63, son explicados con mayor precisión en la
sección 2.5.3.2 de este documento, únicamente mostraremos en esta sección el contenido del archivo de
parámetro formatoAUD.txt que le permite a la herramienta extraer correctamente la información de
acuerdo a la estructura del objeto que estamos examinando, en este caso la tabla AUD$.
Ilustración 64: Archivo de estructura de la tabla AUD$
132
La salida generada en el documento filaseliminadasAUD$.txt luce así:
Ilustración 65: Evidencia de filas eliminadas de la tabla AUD$
En la Ilustración 65, encontramos un ejemplo de las entradas generadas al usar Orablock, escogimos esta
en particular pues muestra el valor DBA que como vimos anteriormente corresponde a la columna
OBJ$NAME y el valor 55 para la columna ACTION# que corresponde a un set role en la tabla de
acciones de auditoría, también encontramos otra información valiosa que fue explicada anteriormente
cuando explicamos la evidencia en la tabla AUD$.
133
5.26 ANEXO 26
Ilustración 66 : Diagrama de flujo para detectar vulnerabilidades de SQL Injection – Adaptado de [12]
134
5.27 ANEXO 27
Ilustración 67: Volcado Hexadecimal de un bloque asignado a la tabla SOURCE$ [19]
Ilustración 68: Información contenida en las filas eliminadas asociadas al objeto 51850 [19]
135
5.28 ANEXO 28
Entrada en el directorio + desplazamiento = localización fila
0x1D39805C + 0x11AB = 0x1D399207
0x1D39805C + 0x11E4 = 0x1D399240
0x1D39805C + 0x1204 = 0x1D399260
0x1D39805C + 0x1213 = 0x1D39926F
0x1D39805C + 0x123E = 0x1D39929A
0x1D39805C + 0x1250 = 0x1D3992AC
0x1D39805C + 0x12D8 = 0x1D399334
0x1D39805C + 0x12EC = 0x1D399348
0x1D39805C + 0x1306 = 0x1D399362
Tabla 2: Filas borradas enlazadas en la tabla SOURCE$
136
5.29 ANEXO 29
Ilustración 69: Volcado Hexadecimal de los bloques asignados a la tabla IDL_UB1$ [19]
137
5.30 ANEXO 30
Ilustración 70: Diferencia entre autenticación de la cuenta SYS con y sin "AS SYSDBA" [25]
138
5.31 ANEXO 31
Ilustración 71: Búsqueda ruta trace files
Set serveroutput on size 100000000 for wra
Declare
paramname varchar2(256);
integervalbinary_integer;
stringval varchar2(256);
paramtypebinary_integer;
beginparamtype:=dbms_utility.get_parameter_value('user_dump_dest',integerval,s
tringval);
ifparamtype=1 then
dbms_output.put_line(stringval);
else
dbms_output.put_line(integerval);
endif;
end;
/
139
5.32 ANEXO 32
Ilustración 72: SPFile Texto
140
5.33 ANEXO 33
Ilustración 73: Ruta Listener logs [26]
141
5.34 ANEXO 34
Ilustración 74: Versión
142
5.35 ANEXO 35
Ilustración 75: Descripción de la columna COL_USAGE$ [34]
143
5.36 ANEXO 36
Ilustración 76: Filt1.xml
Ilustración 77: Filt-bool.xml
144
Ilustración 78: Filt-grant.xml
Ilustración 79:Filt-xid.xml
Ilustración 80: Parámetros de la herramienta Orablock
145
5.37 ANEXO 37
Ilustración 81: Errores del TNS Listener [23]
Ilustración 82: Entradas en el listener log para los comandos SERVICES y STATUS [25]
146
Ilustración 83: Entradas en el audit trail para intentos de conexión de usuarios no existentes [25]
Ilustración 84: Entrada del audit trail usando la columna COMMENT$TEXT [25]
Ilustración 85: Evidencia del uso de orapwdbrute.exe [25]
147
Ilustración 86: Consulta para extraer la fecha en que se bloquea una cuenta
148
5.38 ANEXO 38
Ilustración 87: Entradas en el listener log generadas al ejecutar sidgusser.exe [25]
149
5.39 ANEXO 39
SQL> col sid for 999999
SQL> col serial# for 999999
SQL> col username for a20
SQL> col osuser for a20
SQL> select
s.sid,s.serial#,s.username,s.osuser
fromv$sessions,v$process p
wheres.paddr=p.addr;
Ilustración 88: Búsqueda SID y Serial #
150
5.40 ANEXO 40
Ilustración 89: Encabezado de un archivo Oracle
Ilustración 90: Ejemplo de verificación del tamaño de un archivo Oracle
151
5.41 ANEXO 41
Ilustración 91: Encabezado de un bloque en un archivo Oracle Redo Log
152
5.42 ANEXO 42
Ilustración 92: Estructura del encabezado de un Red Log – Adaptado de [16]
153
5.43 ANEXO 43
Ilustración 93: Encabezado de una fila eliminada [19]
Ilustración 94: Extracción de información de columnas de una fila eliminada [19]
154
Ilustración 95: Volcado hexadecimal de una fila [19]
Ilustración 96: Discriminación de columnas a partir de un volcado hexadecimal [19]
155
5.44 ANEXO 44
Ilustración 97: Volcado Hexadecimal de un bloque asignado a la tabla MY_TEMP_TABLE [19]
156
5.45 ANEXO 45
LogMiner posee actualmente 2 problemas a la hora de realizar una investigación forense y que es
fundamental se tenga en cuenta en caso de que se piense adelantar una investigación con esta herramienta
[36] [33]:

Problemas de manejo de registros de tiempo cuando se trata de entradas históricas

LogMiner pierde completamente la información fraccional del TIMESTAMP cuando se
recupera información sobre la base de datos.
El error del TIMESTAMP se puede verificar inicialmente realizando una consulta a la tabla dual donde se
encuentran los registros de las transacciones de las bases de datos. Finalmente los REDOLOGS toman el
valor del tiempo de la transacción de este TIMESTAMP [33].
Ilustración 98: TimeStamp tabla dual [36]
Ilustración 99: TimeStampLogMiner [36]
Como podemos ver en la consulta anterior, los TIMESTAMPS que maneja el sistema son de una precisión
de 10ˆ-6 dígitos mientras que los TIMESTAMPS que presenta el sistema son de una precisión mínima ya
que solo muestra el segundo en que sucedió. Esto sucede ya que LogMiner decodifica el TIMESTAMP de
una manera incompleta, y aunque en los Redo Logs se encuentre correcta la información, esta se verá
truncada a la hora de presentarla dentro de la herramienta. Más adelante mostraremos la forma en la cual
se almacenan los Time Stamps dentro de los Redo Logs. [36]
157
5.46 ANEXO 46
Para construir una línea de tiempo es necesario utilizar el comando SPOOL que se encarga de dirigir los
resultados de las consultas a archivos planos de texto. Posteriormente se utiliza la sentencia SQL
v$logmnr_contents, que lo que hace es leer los Redo Logs de la base de datos y realizar una
representación gráfica de los eventos captados. Finalmente estos datos son plasmados en los archivos de
texto que permitimos con el comando SPOOL [33] [36].
Ilustración 100: SentenciaSpool [36]
El anterior query muestra en el archivo Serial commit Number, el tiempo en que se registró la sentencia, el
usuario que la procesó, el nombre de la tabla en que se realizó y la operación que se usó. Dentro de los
redoLogs los SCN hacen el papel de ID de las transacciones y además nos proporcionan una referencia
temporal dentro de los eventos realizados en la base de datos, por lo cual una buena práctica es utilizar
estos números para realizar nuestras consultas. [33] [36]
Ilustración 101: Estructura LogMiner Redo Logs [36]
Una de las características que se pueden evidenciar una vez se tiene la información en archivos planos de
texto es que hay muchas entradas que poseen la misma hora y también el mismo Número de compromiso
de la transacción (SCN), esto sucede ya que lo que realmente se almacena dentro de los Redo Logs es el
momento en el que el LWRG escribe información dentro del buffer del redo log y este se guarda una vez
se presenta un COMMIT, por lo cual si son varias operaciones estas recibirán el mismo SCN y el mismo
TIMESTAMP . [35] [36] [33]
158
Si se introduce un nuevo registro dentro de la base de datos, se puede evidenciar bajo que SCN se
encuentra esta transacción realizando una búsqueda a partir del nombre de la tabla, como es mostrado en
la siguiente gráfica.
Ilustración 102: Verificación Serial Commit Number [36]
5.47 ANEXO 47
Cuando nos enfrentemos a la escena física, es necesario que se tengan en cuenta los siguientes aspectos:

¿Se encuentra encendido o no el servidor?
Es importante revisar si el computador se encuentra encendido, ya que en muchos casos hay gran variedad
de información que podemos adquirir dependiendo de que se encuentre prendida la maquina
comprometida. Esta información es:
o
En muchos casos los atacantes programan tareas que se disparan una vez un usuario por el pánico
apaga el sistema que fue víctima del ataque como se muestra a continuación.
CREATE OR REPLACE TRIGGER VANISH BEFORE SHUTDOWN ON DATABASE
BEGIN
DELETE FROM SYS.AUD$;
END;
/
159
La anterior sentencia se encarga de borrar todo el contenido de la tabla de auditoría. La tabla de
Auditoria posee el historial de las conexiones a la base de datos, este borrado podría entorpecer
enormemente el curso de una investigación. Por estas razones es importante mantener el sistema
encendido hasta que la información que es volátil pueda ser almacenada y asegurada, garantizando
que los datos no vayan a ser modificados o que en su defecto se pierdan

Análisis del servidor
Para analizar el servidor no lo podemos hacer directamente desde él, porque se pueden sobre escribir
gran cantidad de espacios en memoria que pueden tener información valiosa para un investigador. Es
necesario que se instale un programa que permita el paso de información a través de la red a una
terminal segura. Se recomienda hacer uso de los siguientes programas:

Netcat12

Crypto Cat13
o
Información en la memoria Volátil. (Ver Live Response).
o
Verificar estado del servido. Tenga en cuenta que usuarios se encuentran actualmente conectados,
que usuarios están dentro del dominio del sistema, quienes tienen acceso y los logs de
administración. (Ver Live Response).
5.47.1 Recaudo de la información
Es necesario dentro una investigación que involucre una base de datos se encuentre presente el DBA o la
persona con más conocimiento sobre el sistema, esto es necesario por dos razones:
1. Al ser la persona que más conoce el sistema, nos puede proporcionar información de anormalidades
dentro del estado de la base de datos, por ejemplo nos puede ayudar a validar que fuentes de evidencia
(Ver Fuentes de Evidencia) se encuentran activadas y cuáles no, además del estado general de las
mismas. También informar de la existencia de usuarios que anteriormente no se encontraban y que
posiblemente son parte del evento de seguridad.
2. Al ser un testigo fiel de la cadena de custodia y del proceso general de recaudo y administración de
las evidencias encontradas dentro del servidor, puede ser presentado dentro de una corte para validar
la integridad, veracidad y valides de las pruebas.
12
13
http://netcat.sourceforge.net/
http://sourceforge.net/projects/cryptcat/
160
5.47.1.1 Información Volátil dentro de Oracle
Dentro de Oracle hay tablas especiales que se modifican dependiendo de la cantidad de acciones que se
realicen dentro de la base de datos y que pueden proporcionar información útil para una investigación.
Dependiendo del tiempo que demore el inicio de la investigación y la fecha exacta en que ocurrió el
evento de seguridad, podríamos encontrar o no información que aporte evidencia para una investigación.
Por lo cual un informático forense como primera medida debe ver:

Conectarse como SYS.(Ver conexión SYS)

Recaudar
la
información
que
se
encuentra
en
V$SQL,
WRH$_SQLSTAT
y
WRH$_SQLTEX.(Ver V$SQL y Live Response)
Es importante que el investigador Forense no ejecute ninguna sentencia UPDATE, DELETE, DROP o
INSERT, ya que de esta manera estaría comprometiendo la integridad y veracidad de la información (Ver
Recaudo de información).
5.47.1.2 Validar el estado del listener
El investigador debe validar cual es el estado actual del listener, para hacer esto debe tener en cuenta:

Que versión del listener se está usando. (Ver validación listener)

Si el listener se encuentra activado. (Ver validación listener)

La ruta en que se están almacenando los logs. (Ver validación listener)
Es necesario realizar estas validaciones, ya que si el listener se encuentra desactivado o los logs del mismo
no se encuentran, es posible que el atacante haya utilizado alguna técnica anti-forense (Ver técnicas antiforenses) para entorpecer la investigación.
5.47.1.3 Verificación el estado de las fuentes de información
Para un investigador forense es necesario validar con que fuentes de posible evidencia cuenta para realizar
su investigación dentro del servidor comprometido (Ver Fuentes de Evidencia). Para realizar este proceso
el investigador debe verificar lo siguiente:

Ver la versión de Oracle con la que está tratando (Ver Versión Oracle)

Es importante recaudar la información del estado del sistema, esto implica:
o
Información de acceso al sistema utilizando AUD$ (Ver tabla AUD$)
o
Información de usuarios y roles (Ver Usuarios y roles)
161
o
Lista de todos los privilegios del sistema(Ver lista de privilegios)
o
Permisos sobre los objetos(Ver Lista de permisos sobre objetos)
o
Lista de objetos (Ver listado de objetos)
5.47.1.3.1 Validación
Una vez recaudada la información general del sistema debemos entrar a verificar cuales de las posibles
fuentes de evidencia se encuentran configuradas y cuáles no. Las fuentes de evidencia que debe validar
son:

Redo Logs: Para cada uno de los trace files debe validar que esté cumpliendo con los parámetros con
los que se configuro el manejo de los Redo Logs, para esto se debe tener en cuenta:
o
Configuración del proceso Archiver.
o
Numero de Redo Logs Configurados.
o
Lugares en que se multiplexó (en caso de que hayan multiplexado).
o
Tamaño en kilo bytes de los mismos.
o
Md5 de los mismos en caso de que esté disponible.
La primera medida es revisar si la base de datos se encuentra en Archive mode o en nonArchive mode (Ver
Archive Mode).
Numerar los Redo Logs lo hacemos con el fin de verificar en primera instancia que no han usado ningún
tipo de técnica anti-forense como eliminación de la fuente o eliminación u ocultamiento de evidencia
(Ver técnicas Anti-forenses).Esto con el fin de ayudar a que el investigador llegue a una conclusión
satisfactoria de los hechos.
Verificamos los lugares donde se multiplexaron los Redo Logs, con el fin de verificar que el atacante no
haya borrado las posibles fuentes de evidencia (Ver técnicas Anti-forenses) o que haya cambiado las rutas
en las cuales almacenan los Redo Logs (Ver Redo Logs). Una vez hemos validado cada una de las rutas
en las cuales los Redo Logs han sido multiplexados, comparamos el tamaño de los mismos para validar
que la integridad no se haya visto afectada de primera mano, ya que en caso de que los valores de los
pesos difieran, podemos desconfiar de ellos. Si los pesos son iguales podemos entrar a comparar los md5
de cada uno de los archivos, ya que el solo hecho de que los pesos sean iguales no quiere decir que su
contenido sea el mismo. Si un atacante sabe el modo de modificar los checksums de validación, entonces
no se notaria a primera vista que fue modificado.
162

Datafiles: Los data files se encargan de almacenar físicamente la base de datos, pero además también
nos sirven como evidencia ya que gracias a ellos también podemos validar que información
determinada aun se mantenga y en caso de que sea borrada aun podamos recuperarla o saber que fue
borrada. Para hacer esto Inicialmente:

o
Accedemos a la Ruta de configuración
o
Copiamos Los data files Existentes
Trace Files: En caso de que se encuentren configurados los trace files para usuarios que posean
permisos muy elevados dentro del sistema debemos también recaudarlos para la investigación.
Una vez nos hemos hecho de esta información el sistema comprometido puede o no volver a
funcionamiento, dependiendo de la importancia del mismo dentro de la empresa y del juicio del
investigador que lleva a cabo la investigación.
Posterior a esto el investigador debe analizar las posibles fuentes de evidencia de manera cronológica.
Esto quiere decir que las fuentes se deben analizar de la siguiente manera.
1. Datos e información del servidor: Ya que la información del servidor viene en .txt
y es
completamente legible, no hay que hacerle un tratamiento especial para poder analizarlo. Para esta
información es necesario que se haya tratado de manera remota habiendo utilizado las herramientas
anteriormente listadas.
2. Archivos TNS Listener: Para el archivo de log del Listener debemos tener en cuenta las rutas que
anteriormente listamos. Este log se encuentra en formato XML y puede ser leído desde un navegador
como Mozilla preferiblemente o desde un editor de texto PSPAD o notepad ++.
3. Archivos Redo Log: Para el análisis de este tipo de archivos podemos utilizar diferentes tipos de
herramientas. Dentro del mercado existen tres tipos de herramientas, que podrían ser útiles dentro de
una investigación.
a. Dump action: Herramienta desarrollada por David Litchfield que permite ver que sentencias DDL
fueron usadas en el servidor. Esta herramienta es la más recomendada ya que a diferencia de las
otras, esta posee una gran precisión traduciendo los time stamps que se encuentran almacenados
dentro de los Redo Logs.
b. LogMiner: Es una de las herramientas que provee Oracle para el análisis y administración de los
Redo Logs. Aunque da un buen acercamiento inicial a los acontecimientos dentro de una base de
datos, no es recomendable utilizarlo como herramienta principal dentro de una investigación ya
que la exactitud dentro de los time stamps es muy reducida.
163
c. FlashBack: Es una de las herramientas que provee Oracle más recientes en el mercado. A pesar de
que no es una Herramienta creada para el análisis forense, esta puede ser una buena opción para el
análisis de los Redo Logs siempre y cuando la información a estudiar sea reciente.
4. Data Files: Para el análisis de los data files podemos hacer uso de las herramientas que David
Litchfield a publicado.
a. Dump extends: Es una de las ultimas herramientas que ha liberado al público y permite realizar
análisis de los data files que sean del tipo UNDO con gran precisión.
Trace Files: Para los dumps de los archivos trace file es recomendable hacer uso de TkProf.
5.48 ANEXO 48

Herramienta general de análisis de Fuentes de evidencia
Resultaría conveniente la creación de una herramienta forense que permita analizar de manera integrada
las principales fuentes de evidencia de Oracle, permitiendo construir de manera gráfica las secuencias de
eventos en un espacio de tiempo y realizando correlación de eventos con las diferentes fuentes. Esto
implica analizar y correlacionar:
1. TNS Logs
2. RedoLogs
3. TraceFile
4. DataFiles
5. OracleAudit trail
Es necesario que esta herramienta tenga en cuenta nombre de usuarios en la base de datos, fechas,
direcciones IP, nombres de usuarios del sistema operativo, sentencias utilizadas, privilegios de los
usuarios que ejecutan las sentencias, entre otros.
Adicionalmente los resultados obtenidos tras la investigación deben poder exportarse en un formato que
pueda ser entendido en una corte por individuos sin una formación técnica en sistemas y seguridad
164
informática, sin dejar de ser confiables y verificables. Se esperaría de esta herramienta un especial cuidado
con el manejo de la precisión de los TimeStamps con el fin de proporcionar confiabilidad a los resultados
obtenidos y no caer en las falencias de herramientas como logMiner. Actualmente hay un proyecto en
curso liderado por David Litchfield que pretende generar una herramienta como la anteriormente descrita.

Análisis de Checksums en Oracle
El análisis de la creación y validación de los check sums dentro de Oracle permitiría dar una precisión
mayor a una investigación forense, ya que se contemplarían ataques de mayor complejidad. Actualmente,
sin un atacante logra comprender claramente la manera en que Oracle genera sus 99 Checksums, podría
ingeniar nuevas maneras de cubrir sus rastros hasta hacer parecer que un archivo corrupto, parezca valido
para el sistema. Aunque Oracle provee herramientas de verificación de los Checksums de sus archivos,
dichas herramientas se limitan a verificar que cada archivo tenga un Checksum coherente con su contenido
pero no están en capacidad de detectar la alteración de contenido seguida de la alteración del Checksum.

Time Stamps- Logminer
Aunque LogMiner es una herramienta forense con gran capacidad técnica posee una falencia con el
manejo de los TimeStamps, por lo cual sería conveniente la creación de un API que mejore la
administración de las marcas de tiempo, teniendo en cuenta los decimales que se ven truncados a la hora
de extraerlos de los Redo Logs y almacenarlos en las estructuras que son usadas para los reportes de
investigación. Esto le daría una mayor veracidad a los resultados que genera LogMiner, logrando de esta
manera, incrementar la fiabilidad y confiabilidad de los resultados obtenidos por esta herramienta.

Extensión a otros entornos:
Se esperaría que con base en este trabajo otras personas pudieran extender las ideas presentadas acá, a
otros entornos de bases de datos como MySQL, SQL Server, DB2, MAXDB, etc. Sí para el entorno más
usado a nivel mundial se encuentra disponible información limitada sobre análisis forense, es de esperarse
que para los demás entornos esta situación sea aún más crítica y aunque las fuentes de evidencia puedan
variar en cierto modo, se esperaría que las maneras de analizarlas puedan ser extrapoladas en la mayoría
de los casos.
165
6
TRABAJOS CITADOS
[1] Ericka Chickowski, "Why Your Databases Are Vulnerable To Attack– And What You Can Do About
It," Information week : Analytics, pp. 1-12, Junio 2009.
[2] Scott Berinato. (2007, June 01) The Rise of Anti-Forensics. [Online].
http://www.csoonline.com/article/221208/The_Rise_of_Anti_Forensics
[3] Ryan Harris. (2006) Digital Forensic Research Workshop. [Online].
http://www.dfrws.org/2006/proceedings/6-Harris.pdf
[4] Jeimy Cano. (2006, Junio) Introducción a la informática forense. [Online].
www.acis.org.co/fileadmin/Revista_96/dos.pdf
[5] David Litchfield, The Database Hacker's Handbook — Defending Database Servers, John Wiley, Ed.
Indianapolis, Indiana, United States of America: Wiley, 2005.
[6] Jorge Sanchez. (2004) Arquitectura del DBMS Oracle, Guia de iniciacion. [Online].
http://www.jorgesanchez.net/bd/arquOracle.pdf
[7] Arquitectura Oracle. Oracle Manual y Capacitacion Oracle, Pl/Sql, Discoverer, Forms, Sql y Plsql Orape. [Online]. www.orape.net/subidos/manualbd/arquitectura.doc
[8] Jeimy José Cano Martínez. (2007, Septiembre) Estrategias anti-forenses en informática: Repensando
la computación forense. [Online]. http://www.alfa-redi.org/rdi-articulo.shtml?x=9608
[9] Carsten Maple and Alan Phillips. (2010, Enero) 7Safe. [Online]. www.7safe.com/breach_report
[10] Stephen Kost. (2007, Marzo) Integrigy Coprporation. [Online]. www.integrigy.com/securityresources/whitepapers/Integrigy_Oracle_SQL_Injection_Attacks.pdf
[11] Vicente Díaz. (2010, Febrero) OWASP Top 10 2010: Riesgos de seguridad en las Aplicaciones Web.
Presentacion de diapositivas.
[12] Oracle. (2009) SQL Injection Tutorial. Manual Electronico.
[13] Lance Ashdown and Oracle, Oracle® Database Application Developer's Guide - Fundamentals 10g
Release 2., 2005.
[14] David Litchfield. (2010, Febrero) BlackHat DC 2010: Hacking Oracle 11g. Conferencia Grabada.
[15] David Litchfield. (2009, Octubre) Database Security - Hacking Aurora in Oracle 11g. [Online].
www.databasesecurity.com/HackingAurora.pdf
166
[16] David Litchfield. (2007, Marzo) Oracle Forensics Part 1: Dissecting the Redo Logs. Artículo
Científico.
[17] David Litchfield. (2007) Dissection of an Oracle Attack. Conferencia Black Hat 2007.
[18] Jose Manuel Navarro. (2009, Febrero) Conceptos de almacenamiento en Oracle. [Online].
http://www.wikilearning.com/curso_gratis/iniciacion_a_oracleconceptos_de_almacenamiento_en_oracle/3861-6
[19] David Litchfield. (2007, Marzo) Oracle Forensics Part 2: Locating Dropped Objects. [Online].
http://www.ngssoftware.com/media-room/WhitePapers.aspx
[20] Oracle. Oracle® Database Advanced Application Developer's Guide, Chapter 13: Using Oracle
Flashback Technology. [Online].
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_flashback.htm
[21] Tim Hall. Auditing in Oracle 10g Release 2. [Online]. http://www.oraclebase.com/articles/10g/Auditing_10gR2.php
[22] Pete Finnigan. (2003, Abril) Introduction to Simple Oracle Auditing. [Online].
http://www.symantec.com/connect/es/articles/introduction-simple-oracle-auditing
[23] Stephen Kost and Jack Kanter. (2007, Abril) ORACLE DATABASE LISTENER SECURITY
GUIDE. [Online]. http://www.integrigy.com/securityresources/whitepapers/Integrigy_Oracle_Listener_TNS_Security.pdf
[24] ORACLE. (2010, Julio) Oracle® Database Net Services Administrator's Guide 11g Release 2 (11.2):
Analyzing Listener Log Files. [Online].
http://download.oracle.com/docs/cd/E11882_01/network.112/e10836.pdf
[25] David Litchfield. (2007, Marzo) Oracle Forensics: Part 3 Isolating Evidence of Attacks Against the
Authentication Mechanism. [Online]. http://www.ngssoftware.com/media-room/WhitePapers.aspx
[26] David Litchfield. (2007, Abril) Oracle Forensics Part 4: Live Response. [Online].
http://www.ngssoftware.com/media-room/WhitePapers.aspx
[27] Orasite. (2009) Conceptos basicos tunning Oracle. [Online].
http://www.orasite.com/tutoriales/conceptos-basicos-tunning-oracle.html
[28] Pete Finnigan. (2004, Marzo) How to set trace for others sessions, for your own session and at
instance level. [Online]. http://www.petefinnigan.com/ramblings/how_to_set_trace.htm
[29] H.Tonguç Yılmaz. (2007) Introduction to Oracle Trace Utulity and Understanding The Fundamental
Performance Equation. [Online]. http://tonguc.wordpress.com/2006/12/30/introduction-to-oracletrace-utulity-and-understanding-the-fundamental-performance-equation/
[30] adp-gmbh. (2003) Output format of a 10046 trace file. [Online]. http://www.adp-
167
gmbh.ch/ora/misc/trace_file_format.html
[31] plsql.biz. (2007, Junio) Uso del comando TKPROF para formatear los ficheros de trazado PL/SQL.
[Online]. http://www.plsql.biz/2007/06/uso-del-comando-tkprof-para-formatear.html
[32] Richard Bejtlich, "Real Digital Forensics: Computer Security and Incident Response," in Real Digital
Forensics: Computer Security and Incident Response.: Syngress, 2006, ch. 1, pp. 1-80.
[33] Arup Nanda. (2011, febrero) Oracle Database 11g:The Top New Features for DBAs and Developers.
[Online]. http://www.oracle.com/technetwork/articles/sql/11g-transactionmanagement-092065.html
[34] David Litchfield. (2007, Agosto) Oracle Forensics part 5: Finding Evidence of Data Theft in the
Absence of Auditing. [Online]. http://www.ngssoftware.com/media-room/WhitePapers.aspx
[35] Pete Finnigan. (2007, Octubre) Oracle Forensics. [Online].
http://www.petefinnigan.com/Oracle_Forensics_scotland.pdf
[36] Paul Wright. (2003, Junio) Oracle Database Forensics using LogMiner. [Online]. http://computerforensics.sans.org/community/papers/oracle-database-forensics-logminer_159
[37] Paul M. Wright. (2005, Enero) Oracle Database Forensics using LogMiner. Artículo Científico.
[38] David Litchfield. (2008, Noviembre) Oracle Forensics Part 7: Using the Oracle System Change
Number in Forensic Investigations. [Online]. http://www.databasesecurity.com/dbsec/oracleforensics-scns.pdf
[39] David Litchfield. Cadfile. [Online]. http://www.databasesecurity.com/oracle-forensics.htm
[40] David Litchfield. (2007, Febrero) Cursor Injection A New Method for Exploiting PL/SQL Injection
and Potential Defences. [Online]. http://www.databasesecurity.com/dbsec/cursor-injection.pdf
[41] Michael S. Pallos. Attack Trees: It's a Jungle out there. [Online].
www.bizforum.org/whitepapers/candle-4.htm
[42] David Litchfield. (2010) V3rity Software. [Online]. http://www.v3rity.com/products.php
[43] Bhavish Sood, Dan Sommer, and Hideaki Horiuchi Colleen Graham. (2010, April 30)
http://www.oracle.com/. [Online]. http://www.oracle.com/us/products/database/number-onedatabase-069037.html
[44] Microsoft Corporation. (2003, Marzo) How RPC Works. [Online]. http://technet.microsoft.com/enus/library/cc738291(WS.10).aspx
[45] Oracle. Data Blocks, Extents, and Segments. [Online].
http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/logical.htm
[46] Oracle. (2004) Troubleshooting Oracle Net Services. [Online].
168
http://download.oracle.com/docs/cd/B14117_01/network.101/b10775/troublestng.htm#i452616
169