Bypassing de WAF/IPS/IDS e inyección SQL tipo Time-Based-Blind

En demostraciones previas  había ejemplificado casos en los que se puede robar información de una base de datos a la que un sitio web hace consulta, tratando de identificar vulnerabilidades de Inyección SQlL ya sea «Error-Based o Blind-Based», ambas por diferentes factores causantes, así aprovechando fallos de seguridad (security flaws) como lo es la validación correcta de la entrada de datos en un campo puede llevar a la fuga/perdida/robo de información.

Los 2 tipos de  inyecciones antes mencionadas no son las unas que te encontrarás, así como tampoco será el mismo método de aproximación para quedarte con la información que quieres  ver (quedarte/robarte), ahora… que tal si te topas con una «Time-Based-Blind proteginda por un WAF (Web Application Firewall). Por obvias razones  te encontrarás con  protecciones o limitantes al momento de querer acceder a esta información (aunque hayas identificado la vulnerabilidad), comp pueden ser IPS o Firewalls. y en esta demostración se lidiará con ello.

Durante mi visita a Aguascalientes encontré diferentes recomendaciones en linea acerca de negocios dedicados a la inmobiliaria, así que decidí visitar sus sitios web, de los cuales encontré uno en particular:

http://macgregorinmobiliaria.com/

Revisando los lugares que tiene a la vente/renta/disposición, encontré este, en donde vi que se los anuncios teniendo como identificador al famoso «Id»:

sitio

Al saber esto, quise probar con el error de la comilla simple en este campo de consulta (como se acostumbra),  al hacerlo vi que no habia el tipo erro de sintaxis, si no simplemente me mostraba algo más:

sql

Desde que vi que no me salió el típico error de sintaxis debido a que el sitio contiene una vulnerabilidad de inyección SQL a base de errores y me salio este «output«/resultado, supe algo andaba mal aquí.

Luego de probar manualmente por primera vez este parámetro, decidí acudir a Acunetix par ver como es qué una herramienta automatizada interpreta estos resultados, es por esto que hice un escaneo con Profile «Crawler & Spider»   para ver que arrojaba esta plataforma:

acu3

Entre los resultados que se obtuvieron, nos muestra que hay una vulnerabilidad  Inyección SQL de tipo «Blind» (Error, no lo es, no del todo). Al comienzo, creí que se trataba de lo anterior, pero resulto ser en parte erróneo el resultado arrojado por Acunetix (Cosa de la que me di cuenta después). Lo que hice en ese momento fue usar el inyector SQL  que trae consigo Acunetix (Si, también puede realizar ataques), por ello, envié la variante 1 al inyector SQL de tipo Blind:

blind injector

Estando en ese lugar, añadí el parámetro de configuración para que se inyecten vectores de ataque en el campo indicado en la petición «GET» hecha por Acunetix para poder identificar la vulnerabilidad y asi explotarla en ese mismo momento desde Acunetix:

acu1

Al momento de que fue colocado el parámetro «injecthere» que es el lugar en donde se inyectarán todos los vectores de ataque que trae pre-cargados «Acunetix«, la sorpresa es que a pesar de que fue probado tanto automática como manualmente el parámetro vulnerable, me arrojó lo siguiente:

acu2

Esto me indicó que no se pudo extraer información debido a las condiciones/configuraciones del parámetro a inyectar, por lo que decidí descartar este medio de ataque (Si, también probé diferentes sintaxis para corregir el problema, no resultó). Luego de probar con sintaxis diferentes para inyectar vectores de ataque en se parámetro y ver el resultado anterior, que deduje que no podía ser otra cosa que no fuese un limitante que me restringiera el acceso a esa información.

Como estaba trabajando desde el mismo Windows, no quise acudir a Parrot o Kali, no aun, por ello decidí utilizar «Havij» que es una Herramienta para realizar ataques automatizados de inyección SQL.

havij1

Una vez iniciada la secuencia de inyección en Havij, solo recibí un listado de errores en el Log de Acciones:

havij2

Viendo que los resultados tampoco fueron favorables, después de que Havij había automatizado muchos vectores de ataque escogí a otra herramienta.

Es por eso que decidí ir por mi navaja suiza para hacer ataques de inyección SQL; Sqlmap, de la cual ya había hecho diferentes Posts ejemplificando inyecciones SQL en sitios web, las cuales resultaron de un proceso relativamente simple. Ahora esta, podría ser un excepción.

Estando en Sqlmap en Parrot (versión 3.4),  ejecuté el comando de inyección con los parámetros de configuración que comúnmente utilizo para realizar inyecciones SQL, siendo la sintaxis así:

sqlmap -u [URL entre comillas] -p [parámetro vulnerable] –current-database –current-user

sqlmap1

Al hacerlo comenzó el proceso en donde se hace el testing de la conexión al sitio o URL, y la verificación para saber si el sitio web está protegido por alún tipo de Firewall o IPS, lo cual resulto ser cierto:

sqlmap2

Al momento en le que Sqlmap encuentra un WAF o IDS en algún sitio, queda a la espera de la instrucción de saber si hace uso de sus payloads para identificar al Firewall que esta protegiendo al sitio, a lo que indiqué que SI, el cual resulto ser «ModSecurity» entregado por «Trustwave«:

sqlmap3

Cuando Sqlmap encuentra el o al tipo de Firewall, nos pregunta si queremos continuar con el proceso de testing hacia el firewall, a lo que le indiqué el SI, por ello revisa el el URL es estable y enseguida recibí un error de caída de conexión (son bastante normales durante las inyecciones), debajo aparece un banner indicando que el parámetro proporcionado parece ser no inyectable.

Debajo de eso se hacen un par de testings para que enseguida Sqlmap nos indique que el parámetro GET «id_inmueble«. Luego de eso vemos que Sqlmap indica que el Sistema gestor de base de datos es MYSQL, por lo que indiqué que también usará mas payloads para hallas mas Gestores:

sqlmap4

Seguido de eso vemos otra caída y enseguida comienza otro proceso de testing (inyección de vectores de ataque) hacia la base de datos mediante el parámetro vulnerable:

sqlmap5

Durante el proceso apareció una caída mas (nada fuera de lo común),  continua el proceso de inyección y Sqlmap nos indica que este parámetro «id_inmueble» parece ser de categoría «time-base-blind», por lo que comienza a usar vectores inyectables para esa categoría:

sqlmap6

El proceso continua y vemos que Sqlmap ahora nos afirma en su totalidad que el parámetro proporcionado es vulnerable, ahora nos pregunta si queremos hacer testing con otros, (si es que hay mas), le indiqué que SI:

sqlmap7

Al hacerlo, indicó que el punto de inyección fue identificado con un total 278 de peticiones (requests) HTTP. Como se trata del parámetro GET «id_inmueble«, nos aparecen detalles de la inyección a este. También vemos que Sqlmap indica que el SGBD es MySQL version 5.0.12 y la tecnología usada en el sitio es Ngix:

sqlmap8

Debajo de eso veremos a los famosos y amados banners «Fetching current user y Fetching current database«, el sorpresa es qué en realidad no se obtuvo nada, ni usuario ni base de datos actuales, ambos con valor «None«, justo al final vemos que Sqlmap se detiene:

sqlmap9

Si ejecuto el mismo comando con el parámetro de configuración «threads» añadido para hacer el fetching de una forma más rápida, sigue mostrando la misma basura vacia:

sqlmap10

Entonces, efectivamente el Firewal o WAF está haciendo bien su trabajo (Por ahora). Para identificar manualmente un WAF con Sqlmap, se debe incluir el parámetro de configuración «–identify-waf» en el comando a ejecutar:

sqlmap11

Si de la forma común no obtengo nada, entonces cambiemos la modalidad en la que opera Sqlmap al momento de realizar una inyección, es momento de agregarle unos extras al comando a ejecutar, una forma de apagar el mecanismo de casting  de los payloads que usa Sqlmap es mediante el parámetro de config. «–no-cast«, por ello decidí agregarlo y ejecutarlo en el comando para ver que resultado obtendría así, lo único que hice fue ahorrar tiempo de inyección puesto a que Sqlmap retoma el punto en el que dejaste la inyección hacia un sitio, sin embargo, no obtuve nada de información (Hasta ese momento):

sqlmap12

Si de esta manera no obtuve nada de nuevo, entonces borremos el registro de la sesión actual de Sqlmap, esto puede ser util si un Firwall hace ban del Origen o Source atacante, podemos deshacernos de esto con el parámetro de config. «–flush-session», al hacerlo comienza de nuevo el proceso de inyección, esta vez no habrá punto que retomar por que indicamos deshacernos de la sesión, vemos que pasa por el mismo proceso hasta ahora:

sqlmap13

Ahora vemos una anotación nueva, en donde nos indica que la inyección no es explotable con valores tipo NULL, que si queremos intentar con valores aleatorios tipo integer, a lo que diremos que SI y comenzará el testing. Ahora vemos en los banners del Fetching del usuario y base de datos actual que  ya tenemos a «optimush_mac@localhost y a optimush_mac@localhost»:

sqlmap14

Perfecto, ya tenemos nuestro usuario actual y DB sobre el sitio donde reside el parámetro «id_inmueble«, ahora es momento de ver la información, como ya tenemos la BD y el usuario actuales, solo bastaria con recurrir al comando tradicional y solo configurarlo para que se visualicen las tablas de esta Base de datos.

El detalle ahora es que una vez mas se pierde el acceso a esta información ya que se muestra de nuevo los valores «None» en el Fetching, aunque ya hayan sido obtenidos antes solo para que Sqlmap retome la inyección, asi como también vemos que aparece en rojo un aviso indicando que no se pudieron obtener los nombres de las tablas en ninguna base de datos.  Por lo que nos pone a petición si queremos hacer el checking de nombres comunes de tablas, esto en base a las palabras que existen en el sitio, por lo que nos pregunta si queremos continuar, solo para documentar esta nota indiqué que SI:

sqlmap15

¿Que es lo que hará esto?

Enumerará diferentes nombres comunes para tablas, esto puede tomar tiempo y tiene una posibilidad mínima de que se acerca al resultado que queremos, mostrando un proceso como el de la imagen, el cual detuve:

sqlmap16

Cancelado este proceso, decidí usar en el comando un parámetro de config. diferente: «–tamper:charencode». Lo que hace esto es usar ciertos scripts proporcionados para realizar tampering en la inyección de datos, que tiene como finalidad inyectar vectores de ataque de una forma diferente con el objetivo de evadir filtros de inyección (Firewalls). Al incluirlo y ejecutarlo de la forma en la que se ve en la imagen:

sqlmap18

En ese momento retoma los puntos de inyección anteriores, hace el fetching de la BD y el usuario actuales y enseguida vemos que comienza a nombrar la primer tabla que existe en esta base de datos, así como también sus columnas:

sqlmap19

NOTA: La tabla «cuentas» está vacía, ¿porqué? Simple, no hay nadie registrado, si estuviese protegido el contenido, se mostrarían caracteres aleatorios, o signos extraños, además de que el sistema de protección funcionaría parejo para todas las DB’s, tablas y demás, sería absurdo que solo protegiese a una tabla.

Vemos que se empezó a descargar (Dump) la información, enumerando el contenido de estas tablas, siendo la primera «cuentas» (Está vacía) e «Inmuebles»:

sqlmap20

Mostrándose así, debido al numero de columnas que tiene, si quieres que se vea completo, solo haz más chica la fuente (Si, mas):

sqlmap21

Como Sqlmap guarda por defecto toda la información que se descarga durante el proceso de «Dumping«, esta información es guardada en archivos con extensión .CVS, los cuales residen en «/root/.sqlmap/«, en donde puedes consultarlos cuando quieras:

sqlmap22

A lo largo de éste ejemplo se demostraron ciertas limitantes o topes que nos podemos encontrar durante la inyección SQL de cualquier tipo (Time-Based-Blind en este caso), como lo fue un Firewall y como es que las otras herramientas que no nos sirvieron en lo absoluto y una vez mas como Sqlmap demuestra su superioridad ante las demás, tanto como para la extracción de bases de datos tanto como su eficacia para evasión de filtros de seguridad como pueden ser Firewalls, IDS o IPS.

A decir verdad la información que obtuvimos no es útil, ya que la tabla «inmuebles» contiene la misma info que s ve en el sitio web, en el caso de «cuentas» si hubiese alguien registrado, lo tendría aquí…

Todo el contenido de este escrito fue hecho con fines educativos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *