db2_audit
Transcript of db2_audit
![Page 2: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/2.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 3: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/3.jpg)
1. Introducción
El tema central de esta ponencia es la auditoria de seguridad en bases de datos DB2, desde un enfoque practico.
¿A que nos referimos con “enfoque practico”? Pues al enfoque que analiza la seguridad desde el punto de vista del atacante que pretende acceder a información sensible o utilizar la base de datos para atacar otros sistemas. (Basado en pentest)
Pero no olvidaremos al defensor. Daremos consejos a los administradores para defender sus sistemas frente a posibles ataques.
![Page 4: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/4.jpg)
Historia
DB2 es la marca tras la que IBM comercializa una de sus familias de productos de gestión de la información.
Aunque tradicionalmente cuando se habla de DB2 se habla del producto estrella de esta serie, la base de datos relacional DB2 UDB (Universal DataBase).
En esta ponencia cuando hablamos de DB2 nos referiremos únicamente a la base de datos UDB.
DB2 como base de datos tiene una larga historia, y algunos la consideran la primera base de datos comercial en soportar SQL.
![Page 5: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/5.jpg)
Diferencias entre plataformas
Las versiones actuales de DB2 corren sobre multitud de plataformas, que según sus características podemos agrupar en 3 grandes grupos:– DB2 para z/OS (antiguamente OS/390)– DB2 para iSeries (AS/400)– DB2 para sistemas Unix/Windows
Aunque el núcleo común es muy similar, el comportamiento de la base de datos en las distintas plataformas presenta algunas peculiaridades en el aspecto que mas nos interesa: la seguridad.
![Page 6: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/6.jpg)
DB2 para z/OS
Para una lista completa de diferencias podemos consultar la tabla que aparece en la siguiente pagina:– http://www-03.ibm.com/servers/enable/site/db2/db2common.ht
ml
Las peculiaridades en cuanto a la seguridad de DB2 en esta plataforma respecto a las otras, se deben principalmente a las características del propio sistema operativo. (Sistema comparticionado, pocas herramientas de red, sistema de ficheros especial)
![Page 7: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/7.jpg)
DB2 para AS/400
En los AS/400 la base de datos DB2 viene integrada fuertemente en el propio sistema operativo constituyendo uno de los pilares del mismo.
La base de datos cuenta con un catalogo propio que se compone de una serie de vistas y tablas que contienen información sobre todos los elementos de la base de datos y contiene incluso entradas para objetos de la base de datos creados usando métodos tradicionales de AS/400, no-SQL.
El catalogo se encuentra en los esquemas: QSYS y QSYS2
![Page 8: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/8.jpg)
Catalogo DB2 para AS/400
Se incluye una capa de compatibilidad con los catálogos ISO a través del esquema “SYSCAT” que funciona como sinónimo de “INFORMATION_SCHEMA” y con los catálogos DB2 para otras plataformas a través del esquema “SYSIBM”.
Estas 3 sentencias serian equivalentes:– SELECT * FROM QSYS2.TABLES WHERE TABLE_SCHEMA
= 'WORK'
– SELECT * FROM SYCAT.TABLES WHERE TABSCHEMA = ‘WORK’
– SELECT * FROM SYSIBM.TABLES WHERE TABLE_SCHEMA = 'WORK‘
![Page 9: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/9.jpg)
Llamada a programas AS/400
DB2 para AS/400 también cuenta con otra peculiaridad respecto a las demás plataformas.
Existe de serie un procedimiento almacenado llamado “qcmdexc” que permite activar cualquier programa iSeries desde SQL si recibe los parámetros adecuados.
Ejemplo:– CALL QSYS.QCMDEXC('CALL PGM (MYLIB/MYPGM)',
0000000022.00000)
![Page 10: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/10.jpg)
DB2 para Unix/Windows
Es habitual referirse a esta variante como DB2 LUW: Linux-Unix-Windows.
En estas plataformas la base de datos DB2 se instala como un componente mas.
La mayoría de ejemplos de esta ponencia se basan en esta variante de DB2.
![Page 11: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/11.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 12: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/12.jpg)
2. Cuentas de usuario
Uno de los factores más característicos de DB2 en contraste con otras bases de datos es su forma de gestionar las cuentas de usuario.
DB2 no cuenta con un sistema de autenticación propio, tiene que basarse en uno externo.
Esto limita los ataques posibles. No es posible consultar y/o crear usuarios directamente desde la propia base de datos.
![Page 13: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/13.jpg)
Autenticación de clientes
DB2 soporta multitud de mecanismos para autenticar a los clientes que intentan acceder a la base de datos:– SERVER (“default” para conexiones remotas)– SERVER_ENCRYPT– CLIENT– KERBEROS– KRB_SERVER_ENCRYPT– DCS – DCS_ENCRYPT – DCE – DCE_SERVER_ENCRYPT
En la mayoría de los casos, se utiliza el método “SERVER”, que se basa en utilizar la autenticación del sistema operativo del servidor.
![Page 14: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/14.jpg)
Usuarios habituales
Como hemos comentado, los usuarios normalmente son gestionados por el sistema operativo del servidor.
Esto hace que durante el proceso de instalación de la base de datos, sea necesario crear una serie de usuarios en el sistema.
No podemos por lo tanto hablar de “usuarios por defecto”, aunque los nombres que se suele asignar a estos usuarios suelen repetirse:– db2admin (Windows)– db2inst1, dasusr1, db2as, db2fenc1 (Unix)
Las contraseñas suelen ser también bastante predecibles si el administrador no se ha preocupado en exceso:– Contraseña = usuario– db2– ibmdb2
![Page 15: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/15.jpg)
Puntos a revisar
Eliminar los usuarios no utilizados a nivel del sistema operativo.
Comprobar que las contraseñas utilizadas son robustas (Y la política de contraseñas del sistema operativo).
Ajustar la seguridad del mecanismo de autenticación del sistema operativo a la criticidad de la información contenida en la base de datos.
Utilizar SERVER_ENCRYPT en lugar de SERVER en la medida de lo posible.
![Page 16: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/16.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 17: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/17.jpg)
3. Roles y privilegios
Una vez el usuario ha sido autenticado, es ya el “security manager” de la propia base de datos el que asigna los privilegios con los que cuenta en el sistema.
La autorización se controla según distintos parámetros:– Autorización explicita, según los privilegios se le hayan asignado
específicamente a ese usuario.– Según los privilegios del grupo al que pertenezca.– Autorización implícita, que se le asigna automáticamente al creador
de un objeto.– Privilegios indirectos asociados a un package.
Todos los usuarios pertenecen al grupo “PUBLIC”.
Cuando la autenticación la gestiona el sistema operativo, cualquier usuario del equipo cuenta con acceso a la base de datos (como public).
![Page 18: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/18.jpg)
Niveles de autoridad
DB2 emplea varios niveles de autoridad para las tareas administrativas:Asignados a nivel de instancia:
– SYSADM / System Administrator: Nivel de mayor autoridad. Sin limitaciones.
– SYSCTRL / System Control: Primer nivel de control.– SYSMAINT / System Maintenance– SYSMON / System MonitorAsignados a nivel de la base de datos:
– DBADM / Database Administrator: Es el segundo nivel de mayor autoridad.
– LOAD / Load– IMPLICIT_SCHEMA: Permite crear un esquema nuevo y
objetos dentro de el.– CREATE_EXTERNAL_RUOTINE: Permite crear
procedimientos almacenados, métodos y funciones definidas por el usuario. (Nuevo en UDB v8.1)
![Page 19: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/19.jpg)
Niveles de autoridad
![Page 20: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/20.jpg)
Elementos con privilegios
Elementos a los que se les puede asignar privilegios de acceso:– Database– Object– Schema– Tablespace– Table– Index– View– Package– Routine– Sequence– Server– Nickname
![Page 21: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/21.jpg)
Privilegios de acceso
Privilegios de acceso a Tablas:– CONTROL– ALTER– SELECT– INSERT– UPDATE– DELETE– INDEX– REFERENCES
Ejemplo:– GRANT SELECT ON EMPLOYEE TO USER DEMO – GRANT SELECT ON EMPLOYEE TO GROUP DEMO – REVOKE SELECT ON EMPLOYEE FROM USER DEMO
![Page 22: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/22.jpg)
Privilegios de acceso
![Page 23: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/23.jpg)
Niveles de acceso
Para asignar los privilegios de acceso a la mayoría de elementos de una base de datos, el usuario debe tener autoridad SYSADM, DBADM; o contar con los privilegios de CONTROL sobre el elemento.
Los privilegios solo pueden ser asignados a elementos existentes.
Para asignar el privilegio de CONTROL, el usuario debe tener autoridad SYSADM o DBADM.
Por defecto, el creador de un elemento recibe el privilegio de CONTROL sobre el mismo.
![Page 24: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/24.jpg)
Consultar la configuración de acceso
La configuración de los privilegios de acceso puede ser consultada a través de una serie de vistas del sistema disponibles en el catalogo “SYSCAT”.
Los privilegios asignados por el sistema tienen a “SYSIBM” como otorgante. Las autoridades SYSADM, SYSMAINT, SYSCTRL y SYSMON no aparecen en estas vistas.
Ejemplos:– SELECT * FROM SYSCAT.DBAUTH WHERE GRANTEE =
'PUBLIC'
– SELECT * FROM SYSCAT.TABAUTH WHERE GRANTEE = 'PUBLIC'
![Page 25: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/25.jpg)
Tablas de privilegios
Las siguientes vistas contienen toda la información sobre privilegios de acceso:– SYSCAT.DBAUTH: Privilegios de base de datos – SYSCAT.TABAUTH: Privilegios de tablas y vistas– SYSCAT.COLAUTH: Privilegios de columnas– SYSCAT.PACKAGEAUTH: Privilegios de paquetes.– SYSCAT.INDEXAUTH: Privilegios de índices– SYSCAT.SCHEMAAUTH: Privilegios de esquemas– SYSCAT.PASSTHRUAUTH: Privilegios de servidores– SYSCAT.ROUTINEAUTH: Privilegios de funciones, métodos y
procedimientos almacenados
![Page 26: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/26.jpg)
Privilegios de instancia
Como hemos visto los privilegios de instancia se definen externamente y no pueden ser consultados desde la propia base de datos.
Para obtener acceso a ellos tenemos que utilizar un comandos especifico:– db2 get dbm cfg
SYSADM group name (SYSADM_GROUP) =
SYSCTRL group name (SYSCTRL_GROUP) =
SYSMAINT group name (SYSMAINT_GROUP) = DEMO
SYSMON group name (SYSMON_GROUP) =
Para modificar alguno de estos valores utilizaremos:
– db2 update dbm cfg using SYSADM_GROUP DEMO
![Page 27: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/27.jpg)
Privilegios de PUBLIC por defecto
En una instalación por defecto de DB2, el grupo PUBLIC (o sea cualquier usuario) puede:
– Hacer SELECT en el catalogo del sistema.
– Crear un nuevo esquema (gracias a la autoridad IMPLICIT_SCHEMA) y objetos dentro de este.
– No puede hacer IMPORT ni LOAD de ficheros.
– No puede crear funciones ni procedimientos almacenados, ya que no cuenta con la autoridad CREATE_EXTERNAL_ROUTINE (En versiones anteriores a la 8.1 si, ya que no existe esta autoridad).
– No cuenta con acceso a la tabla “sysibm.sysdummy1”.
![Page 28: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/28.jpg)
Privilegios de PUBLIC por defecto
![Page 29: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/29.jpg)
Puntos a revisar
Privilegios de autoridad a nivel de instancia. Privilegios de autoridad a nivel de base de datos.
(DBAUTH) Privilegios de acceso a las tablas del sistema. Privilegios de modificación de tablas. Privilegios de creación de funciones y procedimientos
almacenados. Privilegios del grupo “PUBLIC”.
![Page 30: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/30.jpg)
Hardening de usuarios
Además de las medidas anteriores, si nuestras necesidades de seguridad son altas, podemos realizar un paso mas y restringir al máximo el acceso de los usuarios no autorizados.
Para ellos vamos a configurar la base de datos para que impida el acceso a los usuarios del grupo “PUBLIC”, es decir todos aquellos que no han sido explícitamente autorizados.– revoke connect,createtab,bindadd,implict_schema on database from
public
A partir de ahora, cualquier usuario que quiera acceder a la base de datos deberá ser autorizado expresamente por el administrador.
Como ultima medida podemos revocar el acceso de los usuarios a las vistas y tablas del catalogo del sistema. (SYSCAT.*)
![Page 31: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/31.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 32: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/32.jpg)
4. DB2 SQL
El lenguaje SQL a pesar de estar definido como un estándar es implementado por cada fabricante con una serie de características particulares.
Estas características van a modificar en gran medida la forma de atacar la base de datos, especialmente cuando se hace mediante inyección de SQL.
Estas peculiaridades también van a ser útiles a la hora de hacer fingerprinting de la base de datos cuando el ataque se realice a ciegas.
![Page 33: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/33.jpg)
Características
Permite subSELECT. No permite subquery (excepto select). Permite UNION. No permite mas de una sentencia SQL por línea. Los mensajes de error no muestran información
detallada (en algunas configuraciones si). No permite SELECT sin FROM. Cuenta con Procedimientos Almacenados y con
Funciones definidas por el usuario. Fin de sentencia con "--". No permite valor de campo NULL en UNIONes. Concatenación con “||”.
![Page 34: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/34.jpg)
Operaciones básicas
Listar las bases de datos:– list database directory
Listar las tablas:– list tables (usuario)
– list tables for all (todas)
– select tabname from syscat.tables (todas)
– select table_name from sysibm.tables (usuario)
– select name from sysibm.systables (todas)
Listar las columnas de una tabla:– describe select * from sysibm.sysversions
– select colname from syscat.columns where tabname='SYSVERSIONS'
![Page 35: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/35.jpg)
Operaciones básicas
Obtener la versión de la base de datos:– select versionnumber from sysibm.sysversions
Obtener una respuesta prefijada:– select 'loquesea' from sysibm.sysdummy1
– select 'loquesea' from sysibm.sysversions
![Page 36: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/36.jpg)
Estructura de la base de datos
Como hemos visto en la sección anterior, DB2 cuenta con una jerarquía de elementos que componen la base de datos.
Los elementos mas importantes a analizar de cara a la seguridad son:– Base de datos
– Tablas
– Funciones y procedimientos almacenados.
![Page 37: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/37.jpg)
Tablas importantes
sysibm.sysdummy1 -> Tabla dummy (equivalente a la tabla "dual" de oracle)
sysibm.systables -> Tablas (name)
sysibm.syscolumns -> Columnas (name, tbname)
sysibm.views -> Vistas (table_name, table_schema, table_catalog)
sysibm.usernames -> Usuarios para conexiones Outbound (puede no existir)
sysibm.sysversions -> Versión
![Page 38: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/38.jpg)
Conversión de tipos
TIPO DESCRIPCION CONVERSION EJEMPLO
varchar texto - ‘xxxx’
integer numérico - 1
date fecha DATE(CADENA_FECHA)
DATE('2004-10-10')
time hora TIME(CADENA_HORA)
TIME('10.10.10')
timestamp fecha/hora TIMESTAMP(CADENA_FECHA, CADENA_HORA)
TIMESTAMP('2004-10-10', '10.10.10')
![Page 39: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/39.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 40: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/40.jpg)
5. Vías de acceso
Las formas en las que un posible atacante puede acceder a la base de datos son limitadas y necesitamos tenerlas bien controladas para proteger convenientemente cualquier punto de entrada en la base de datos.
Entre las posibles vías de acceso tendríamos:– Una shell en el equipo
– DB2 wire protocol
– ODBC directo
– ODBC indirecto
– Inyección de SQL
![Page 41: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/41.jpg)
Shell en el equipo
Si tenemos acceso a una shell en el equipo donde se encuentra instalada la base de datos DB2 a auditar, acceder a la misma es automático.
El acceso a la base de datos puede realizarse a través de la herramienta CLP (Command Line Processor) que suele estar localizada en:– /home/db2inst1/sqllib/bin/db2 (Unix)
– "C:\Archivos de programa\IBM\SQLLIB\BIN\DB2CMD.exe" DB2SETCP.BAT DB2.EXE (Windows)
La conexión a la base de datos mediante esta herramienta se realiza sin la necesidad de introducir las credenciales de usuario.
![Page 42: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/42.jpg)
DB2 wire protocol
También podemos obtener acceso a la base de datos DB2 de forma remota a través de un equipo que tenga instaladas las librerías cliente. (Se pueden obtener en la web de IBM)– http://www-306.ibm.com/software/data/db2/runtime.html
La conexión se realiza normalmente a través del puerto 50000/TCP. (Si este se encuentra reservado puede realizarse en el 50001/TCP y adelante.)
Aquí si es necesario introducir unas credenciales validas. Aunque como hemos visto valen las de cualquier usuario del equipo.
![Page 43: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/43.jpg)
ODBC directo
Si disponemos de acceso a un equipo que tenga configurada una conexión ODBC con la base de datos a auditar, podemos utilizarla para acceder a la misma.
Si el DSN no se ha configurado con las credenciales necesarias, tendremos que conocer unas para establecer la conexión. (Aunque en la mayoría de casos si se encuentran preconfiguradas)
![Page 44: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/44.jpg)
ODBC indirecto
Si conocemos un equipo con conexión ODBC a nuestra base de datos y no disponemos de acceso directo al mismo pero podemos instalar algún tipo de aplicación web en el, es posible crear nuestra propia pasarela SQL.
VBS/ASP:
<%
Set conn=server.createobject("ADODB.connection")
conn.open "DRIVER=IBM DB2 ODBC DRIVER; DBALIAS=SAMPLE; UID=db2admin; PWD=db2admin"
…
JAVA/JSP:
try {String dbURL="jdbc:db2://server:50000/books:user=db2admin;password=db2admin";String dbDriver = "com.ibm.db2.jcc.DB2BaseDataSource";
…
![Page 45: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/45.jpg)
Inyección de SQL
Si detectamos alguna vulnerabilidad de inyección de SQL en una aplicación que trabaja contra nuestra base de datos DB2, podemos utilizarla para obtener acceso parcial a la misma.
El acceso es parcial porque el contexto en el que se trabaja es mucho mas limitado que los anteriores, ya que partimos de una sentencia SQL previa que debemos modificar y que nos impedirá realizar algunas acciones.
![Page 46: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/46.jpg)
Puntos a revisar
Restringir en el servidor el acceso de los usuarios no privilegiados a las herramientas y librerías DB2.
Proteger mediante algún tipo de filtrado los puertos TCP utilizados para conexiones remotas en DB2.
Revisar el almacenamiento de las credenciales de acceso mediante ODBC.
Impedir que se instale código externo en los servidores conectados mediante ODBC a la base de datos.
Auditar el código de las aplicaciones que utilizan la base de datos mediante SQL.
![Page 47: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/47.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 48: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/48.jpg)
6. Inyección de SQL
DB2 no es una base de datos fácil de atacar a través de inyección de SQL.
Como hemos visto en el apartado “características” del SQL de DB2, contamos con una serie de limitaciones importantes:– No se permiten subquerys ni mas de una query por sentencia.
– No es posible extraer información de la base de datos a través de los mensajes de error.
– El juego de funciones que podemos llamar desde un SELECT es muy pequeño por defecto, y no se conocen vulnerabilidades en ellas.
– Se permite utilizar UNION, pero no se permite utilizar el valor de campo “NULL” en las UNIONes, de forma que se complica el encontrar el tipo de campos validos.
![Page 49: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/49.jpg)
Inyección de SQL
Después de tantas limitaciones, el mejor ataque que nos queda por lo tanto es el intentar extraer información de la base de datos mediante la creación de una sentencia UNION valida.
Si tampoco es posible obtener un UNION valido, solo nos queda extraer algo de información mediante un ataque a ciegas.
Para hacer esto podemos usar la función “substr”, por ejemplo:– AND substr((select USER from
sysibm.sysversions),1,1)=chr(68)
![Page 50: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/50.jpg)
Fingerprinting
El primer paso para explotar una inyección de SQL, una vez comprobada que la aplicación es realmente vulnerable, será averiguar el tipo y si es posible, la versión de la base de datos.
Si el error no es ciego, y vemos los mensajes de error que genera la base de datos, será fácil averiguar el tipo de la base de datos.
Si el error es ciego, deberemos someter la inyección a una serie de sencillas pruebas lógicas. Por ejemplo:– value(1,1)=1
– USER=USER
– length(1)=4
![Page 51: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/51.jpg)
Mensajes de error DB2
![Page 52: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/52.jpg)
Errores descriptivos
Como he comentado, normalmente los mensajes de DB2 apenas muestran información útil sobre el error producido y no permiten extraer información de la base de datos.
Sin embargo en algunas configuraciones, los mensajes son mas explícitos y nos facilitan lograr una inyección útil.
Para lograr una UNION valida en estos casos:1. Hacemos UNION con 1 campo.2. Si nos muestra un error de "SQL0415: Operandos UNION no
compatibles" es que el tipo del campo no es correcto.3. Probamos otro tipo de datos en el campo.4. Si da un error de "SQL0421: Numero de operandos UNION no igual"
es que el tipo esta bien, y tenemos que añadir otro elemento a la unión.
5. Repetimos la operación hasta que demos con todas las columnas necesarias para hacer el UNION y los tipos de datos de cada una de ellas coincidan.
![Page 53: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/53.jpg)
Inyección ciega
En el caso de que los mensajes de error no sean descriptivos o que la inyección sea ciega (no vemos ningún tipo de mensaje) debemos proceder a un ataque por fuerza bruta.
Tenemos que probar todas las combinaciones posibles de tipo de datos y de numero de campos hasta lograr una UNION correcta.
Para simplificar usaremos 2 valores:– 1 para campos de tipo numérico.
– '2005-01-28-16.09.04.00‘ para campos de tipo cadena y de tipo fecha.
![Page 54: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/54.jpg)
Puntos a mirar
Revisar el código de las aplicaciones que realicen peticiones SQL contra la base de datos para evitar que se produzcan puntos de inyección.
En aplicaciones que se utilicen desde entornos de riesgo expuestos a Internet, limitar al máximo los privilegios del usuario utilizado para acceder a la base de datos.
Hacer que la aplicación en producción no muestre al usuario los posibles errores generados por la base de datos.
![Page 55: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/55.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 56: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/56.jpg)
7. Registro
Dentro del directorio base de la instancia DB2 se encuentran una serie de ficheros de log que es necesario revisar para detectar posibles usos irregulares de la base de datos.
Los ficheros mas destacables son: – db2diag.log: Contiene todos los mensajes de error y de
warning.
– jdbcerr.log: Errores en conexiones JDBC.
– instance_name.nfy: Notificaciones de administración. (Solo Unix, en Windows estos mensajes de manejan por el event log del sistema)
![Page 57: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/57.jpg)
Logs
La localización de estos ficheros viene determinada por el parámetro de configuración DIAGPATH, aunque por defecto en suele ser: – /opt/db2/db2inst1/sqllib/db2dump/* (Unix)
– C:\Archivos de programa\IBM\SQLLIB\DB2\* (Windows)
El nivel de registro viene determinado por los parámetros de configuración DIAGLEVEL y NOTIFYLEVEL, que toman valores entre 0 y 4. Siendo normalmente 3 el valor por defecto.
Es recomendable elevarlos a 4 de la siguiente forma:– db2 update dbm cfg using DIAGLEVEL 4
![Page 58: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/58.jpg)
Puntos a revisar
Comprobar que el nivel de registro (DIAGLEVEL y NOTIFYLEVEL) es suficiente (>=3).
Comprobar que los ficheros de registro no han sido borrados o alterados.
Comprobar en los registros que no existen eventos “anomalos” que puedan indicar una actividad ilegal en el sistema.
![Page 59: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/59.jpg)
Índice
1. Introducción
2. Cuentas de usuario
3. Roles y privilegios
4. DB2 SQL
5. Vías de acceso
6. Inyección de SQL
7. Registro
8. Sistema operativo
![Page 60: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/60.jpg)
8. Acceso al Sistema operativo
Una vez hemos comprobado la seguridad de los datos almacenados en la base de datos, podemos comprobar si es posible atacar otros sistemas a partir de este.
La configuración por defecto de DB2, impide a los usuarios con pocos privilegios el acceso a funciones del sistema operativo, pero si conseguimos acceso a una cuenta con autoridad suficiente o los privilegios de acceso se encuentran mal configurados, podemos intentar atacar el sistema operativo.
![Page 61: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/61.jpg)
Ejecución de comandos
DB2 permite mapear llamadas a librerías del sistema en una función o en un procedimiento almacenado. De esta forma podemos realizar cualquier operación que nos permitan las librerías estándar. Por ejemplo ejecutar comandos a través de la llamada system():– create function cmdfunc(varchar(200)) returns integer language
C parameter style sql external name 'msvcrt.dll!system'
– select cmdfunc('dir > c:\test.txt') from sysibm.sysdummy1
En Unix:– create function linfunc(varchar(200)) returns integer language C
parameter style sql external name '/lib/libc.so.6!system'
– select linfunc('ls > /tmp/(test.txt') from sysibm.sysdummy1
![Page 62: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/62.jpg)
Cambio de contraseña
Aunque hemos comentado que no se podía modificar la configuración de los usuarios desde la base de datos, si existe una operación que podemos realizar. Es posible cambiar la contraseña de un usuario del que conocemos sus credenciales a través del comando “connect” de la base de datos:– connect to <database> user <uid> using <password> new
<newpassword> confirm <again newpw>
![Page 63: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/63.jpg)
Lectura de ficheros
Por ultimo tenemos la función “import” que nos permite leer ficheros del sistema. – create table mytable (data varchar(100));
– import from 'c:\boot.ini' of del insert into mytable;
– select * from mytable;
Aunque no puede ser invocada desde ODBC y requiere privilegios altos.
![Page 64: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/64.jpg)
Puntos a revisar
Quitarle la autoridad CREATE_EXTERNAL_ROUTINE a todos los usuarios. Si es necesario crear alguna función o procedimiento se utilizara un usuario DBADM.
Quitarle la autoridad CONNECT a aquellos usuarios que no queremos que modifiquen su contraseña. (Ojo con esto porque tampoco podrán conectar a la base de datos)
Quitarle la autoridad LOAD a todos los usuarios.
![Page 65: db2_audit](https://reader035.fdocumento.com/reader035/viewer/2022062220/5571f8ba49795991698df6f5/html5/thumbnails/65.jpg)
Conclusiones
A pesar de no ser un sistema de base de datos demasiado popular y no haber sufrido análisis de vulnerabilidades tan intensivos como otras bases de datos, DB2 da una buena impresión en cuanto a seguridad y robustez.
Como se ha podido ver, auditar y securizar esta base de datos no es tan difícil como parecía inicialmente.
Espero que no os hayáis aburrido mucho y que estos conocimientos os sean útiles en el futuro…