Sqlmap plugin for BurpSuite

¿De qué va este post?

Hoy os presentamos un plugin gratuito, desarrollado por mí, para que podáis usar el sqlmap desde el BurpSuite de forma realmente cómoda.

¿Por qué este plugin?

Casi siempre que auditamos un sitio web lo primero que solemos hacer es poner un proxy intermedio para tener más control sobre lo que enviamos a éste. Por diversos motivos utilizo el BurpSuite como proxy.

¿No creéis que sería genial que cuando estamos auditando un sitio podamos redirigir una URL o petición concreta directamente al sqlmap con un simple click de ratón? Sí, ¿verdad? Eso creo yo también. Por esto he desarrollado este plugin, para poder hacer justamente esto.

¿Cómo cargo el plugin?

Lo primero es descargar el plugin. Podéis descargarlo desde aquí: http://code.google.com/p/gason/downloads/list y lo guardamos en la misma carpeta que esté el Burp.

Después tenemos que poner el siguiente comando para ejecutar el Burp con el plugin:

Linux:

java -classpath burpplugins.jar:”BurpSuite_v1.4.01.jar” burp.StartBurp

Windows:

java -classpath burpsuite_v1.4.01.jar;burpplugins.jar burp.StartBurp

Mi versión del Burp es la “v1.4.01″. Si no es vuestro caso, sustituirla por la que tengáis.

Es importante señalar que el plugin lo podéis usar tanto con la versión gratuita como con la de de pago.

No es necesario utilizar Linux. Con windows, indicándole la ruta al sqlmap, también funcionará.

¿Cómo se utiliza?

Una vez tengáis cargado el plugin, utilizarlo es muy sencillo. Tan solo tenéis que hacer click con el botón derecho encima de la url que queráis testear con sqlmap y os aparecerá la opción:

Tras pulsar sobre la opción de Sent to sqlmap nos aparecerá una nueva ventana que nos permitirá configurar el sqlmap:

Una vez hayamos configurado el sqlmap pulsamos el botón “Run”. Éste nos abrirá una nueva pestaña con su ejecución. Podemos hacer tantas ejecuciones simultáneas como queramos, para tener distintas instancias de sqlmap con opciones de ejecución diferentes, por ejemplo. Aquí una muestra de una pestaña de ejecución:

Si el sqlmap requiere algún tipo de acción por nuestra parte, no tenemos más que hacer click en el cuadro de ejecución y escribir lo que necesitemos.

¿Qué otras cosas podemos hacer?

Además de la ejecución básica, podemos buscar un texto en el cuadro de ejecución. Para ello solamente tenemos que introducir el texto que queramos buscar en el cuadro de texto “Search“. Se resaltarán automáticamente las palabras encontradas:

Además podemos guardar el contenido del cuadro de ejecución en un archivo de texto. Tan sencillo como pulsar el botón “Save to file…“:

¿Qué es lo próximo?

Utilizando el API del BurpSuite podemos hacer muchas más cosas. Dentro de muy poco os explicaré cómo hacer vuestro propio plugin reutilizando las librerías que yo he usado para este plugin. Veréis como es muy sencillo.

Además, próximamente liberaré otro plugin para integrar wfuzz

—————

Sígueme en twitter: @ggdaniel | Linkedin: http://es.linkedin.com/in/garciagarciadaniel

Gracias Alejandro (@z0mbiehunt3r), Rubén (@boken_), Dani (@dan1t0) y Alex (@ocixela) por las sugerencias y comentarios. Y a Jaime (@NighterMan) por su plugin inicial, en la que está basado el plugin.

Previniendo ataques XSS (I/II)

¿De qué va este post?

En este post explicaré cómo prevenir los ataques de Cross Site Scripting (o XSS)
de forma muy sencilla, pero efectiva.

¿Por qué?

Porque, tras realizar una auditoría de seguridad sobre un entorno web, y recomendar a los desarrolladores que implementen un filtrado correcto nos hemos dado cuenta que:

  1. Muchos no saben cómo hacerlo correctamente.
  2. Implementan filtros que no son los correctos y se pueden seguir eludiendo.
  3. Piensan que la implementación de esos filtros es muy compleja, cuando no es así.

¿Cuál es el problema?

No voy a explicar en qué consiste un ataque XSS (google contestará a esta pregunta sobradamente) pero es bien conocido el perjuicio tan grave que supone para los usuarios.

El problema radica en unas malas prácticas a la hora de desarrollar un sitio web y no se filtra correctamente toda la información que se va a mostrar al usuario.

Se pueden diferenciar 2 planteamientos:

1 – Cuando se utiliza un framework de programación (spring, struts, ASP.net, symfony, cakePHP, Django…), que hace más complicado ser vulnerable a este tipo de ataques, salvo aquellos casos en los que se utiliza o configura correctamente el framework utilizado. La mayoría permiten configurar de forma muy rigurosa los tipos de datos de entrada y éstos se encargan de filtrar posibles ataques. Pero no todos los desarrolladores conocen el poder de éstos y desaprovechan su potencial.

2 – Cuando se desarrolla desde cero, estos filtros tienen que ser creados manualmente y tener mucho cuidado con todos los valores de entrada. En la práctica no se suele hacer bien por desconocimiento de la vulnerabilidad o bien por no saber cómo hacerlo.

El problema se complica más aun cuando es necesario permitir al usuario introducir etiquetas HTML, como pueden ser los comentarios de un foro.

¿Qué tipos de filtros existen?

Podemos implementar un sistema de filtrado sencillo en función de las necesidades que tengamos:

  1. Todo lo que introduce el usuario ha de ser filtrado. No permitimos ningún carácter extraño.
  2. Debemos permitir al usuario que introduzca valores HTML simples como: negrita (<b>), cursiva (<i>), salto de línea (<br />)…
  3. Debemos permitir al usuario que introduzca valores HTML que aceptan complejos: enlaces (<a href=”…”>…</a>), modificación del tipo de letra (<Font …></Font>)

Implementando filtrado simple

Vamos a implementar un sistema de filtrado atendiendo a los supuestos 1 y 2 del apartado anterior. Lo primero que debemos de tener en la cabeza es que jamás podemos fiarnos de un usuario y lo que éste está dispuesto a hacer. Por esta razón debemos de ponernos siempre en el peor de los casos, aunque parezca algo paranoico.

Como regla general a aplicar deberíamos de seguir la política: denegar todo y permitir solamente aquellos casos concretos que necesitemos. Vamos a la práctica:

Caso 1: Filtrando todo el contenido de salida

Siempre que necesitemos mostrar en el navegador información no estática, variables o información que provenga de una base de datos, debemos de filtrarla. Para ello solamente tendremos que sustituir los caracteres considerados como peligrosos por sus equivalentes HTML:

  1. &  –>  &amp;
  2. <  –>  &lt;
  3. >   –>  &gt;
  4. “  –>  &quot;
  5. ‘  –>  &#x27;
  6. /  –>  &#x2F;

Este supuesto solo es válido si la información se va a mostrar en el cuerpo HTML, NO en el código JAVASCRIPT o CSS. En estos casos hay que prestar atención a otros supuestos adicionales, que dejamos para otro post.

La implementación de este filtro es sumamente simple. A continuación unos ejemplos de cómo implementarlo. Aunque no son los más elegantes ni eficientes, sí son los más simples de entender:

Java

PHP


C#


Python


Caso 2: Permitiendo tags HTML simples

Hay ocasiones que necesitamos que el usuario pueda añadir ciertos tags HTML simples y permitir que sean interpretados.

De forma errónea muchas veces se tiende a hacer enormes listas de tags HTML considerado peligrosos (esta técnica se conoce como lista negra), intentando dejar solamente los que se desea permitir al usuario. Pero, ¿por qué es esto un error?

Porque como programadores estamos esperando que los usuario introduzcan cosas como: “<script>…”, “<iframe…”, etc, Pero si alguien pretende eludir nuestros filtros puede inventarse mil y una formas de eludir el filtrado. ¿Cómo? Aquí mostramos unos cuantos ejemplos sobre cómo un atacante podría introducir el tag “<script>” y que en muchas ocasiones no podríamos evitarlo:

  1. <SCRIPT>
  2. <ScRiPT>
  3. < script >
  4. <SCR\0IPT>
  5. <SCRIPT/SRC=”…”>
  6. %3cSCRIPT/SRC=”…”>
  7. <<SCRIPT >alert(‘XSS’)<</script>
  8. %00<script>

Esta son solamente unos de los cientos de métodos que podríamos usar para eludir el filtrado. Entonces, ¿cuál es la forma correcta de hacerlo?

  1. Creamos una lista con los tags HTML que permitimos al usuario y su correspondiente equivalente codificado HTML (esta técnica se conoce como lista blanca).
  2. Filtramos todos los caracteres igual que hicimos en el Caso 1.
  3. Descodificamos los elementos que hayamos permitido en nuestra lista blanca, para que sean interpretados.

La implementación es sencilla. Os presentamos una posible implementación que, aunque no sea la mejor ni más eficiente, es funcional. En los ejemplos pretendemos permitir los tags
“<b>” y “<i>” HTML:

Java


PHP

C#

Python

Implementando filtrado más elaborado

Para no hacerlo más extenso dejamos este método para la próxima semana, en la que publicaré un nuevo post sobre cómo permitir tags complejos, tal y como explique el supuesto 3.

Referencias

  1. CheatCode de filtrado XSS de la OWASP: https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
  2. Métodos de evasión de filtrado XSS: http://ha.ckers.org/xss.html

—————

Sígueme en twitter: @ggdaniel | Linkedin: http://es.linkedin.com/in/garciagarciadaniel

Gracias Alejandro (@z0mbiehunt3r) por los comentarios.

Análisis de malware en Android: Atacando al segundo factor de autenticación

 

Desde que en Septiembre de 2010 se detectara la primera muestra de ZeuS que realizaba un esquema de fraude de tipo MitMo (Man in the Mobile), se han apuntado al carro también Spyeye y últimamente Ice IX. En las dos primeras, el módulo móvil empleado para capturar las credenciales del segundo factor de autenticación basado en móvil partía de una misma base y, excepto sutiles diferencias, la evolución había sido escasa.

En el caso que nos ocupa, nos hemos hecho con una muestra para Android procedente de una inyección aparecida en la banca online de un usuario después de hacer login en ella, convenciéndolo de que instalara una aplicación de seguridad, usando para ello un mensaje como el siguiente:

#### informa: para la instalación de un programa de criptografía gratis en su teléfono, utilice la siguiente dirección http://#########.net/cripto.apk

Durante el análisis dinámico se observa cómo el mismo se instala haciéndose pasar por una solución de seguridad, y no intenta ocultarse en ningún momento:

La misma, únicamente muestra un código de activación para ser asociada presumiblemente con la cuenta de la entidad del usuario. Dicho código se trata del ID del teléfono (IMEI en GSM y el MEID o ESN para CDMA), como veremos más adelante.

La estructura del paquete APK es la siguiente:

El certificado autofirmado contiene la siguiente firma:

En el fichero XML (AndroidManifest.xml) que define los permisos necesarios por la aplicación para ejecutarse llaman la atención algunos de ellos como los siguientes:

Como se puede apreciar, requiere permiso para recibir y enviar SMS, así como consultar y modificar el estado del teléfono, entre otros.

La estructura de la aplicación Java es la siguiente:

En la clase “MainActivity” puede apreciarse el código empleado para mostrar el mensaje con el supuesto ID de activación:

La funcionalidad principal está reunida en la clase “SmsReceiver”, que es la encargada de interceptar y reenviar los SMS’s entrantes a un servidor controlado por el atacante. A continuación se muestran algunas de las variables usadas para almacenar la información capturada, así como el servidor donde se envía dicha información:

Una de las principales novedades respecto a versiones anteriores, es que la URL está codificada, aunque de una forma muy simple, de tal forma que eliminando los caracteres “q”, “-“ y “=” de la cadena, es posible obtenerla.

Como vemos, en todo este tiempo desde su primera aparición, la complejidad de este tipo de muestras apenas ha aumentado, lo que quiere decir que sigue siendo igual de efectivo y cumpliendo con el objetivo marcado por los defraudadores. Al final, si algo funciona, ¿Porqué cambiarlo?

———-

Follow me on Twitter: @smvicente

Concurrencia real en Python

¿De qué va este post?

Voy a tratar de explicar cómo conseguir multiprocesamiento real, explicar el falso mutithreading de python y cómo resolver el famoso problema de parar hilos con el CTRL+C

¿Qué problema tiene Python?

Cuando queremos hacer una aplicación multihilo, rápidamente nos vienen a la cabeza los threads y vamos corriendo a buscar ejemplos sobre cómo usarlos. El problema de esto es que Python nos está “engañando” de forma vil.

Cuando utilizas los threads en python realmente lo que está pasando es que el motor de python crea un montón de procesos hijos, no hilos. Además de todo esto lo que hace es simular que es multihilo. Lo que realmente hace es en un único proceso ir intercambiando la ejecución de los “hilos” que ha creado para dar la sensación que todo se está ejecutando en paralelo. Si miramos la documentación oficial nos lo indica claramente.

Entonces, ¿podemos hacer programas concurrentes?

Si os fijáis bien no digo multihilo, sino concurrente. Podemos conseguir que una aplicación se ejecute concurrentemente, pero utilizando procesos, no hilos. De momento Python nos impone esta restricción.

Aunque esto no es multihilo como tal es una gran ventaja con respecto lo que hace Python por defecto, ya que conseguiremos lo que queremos: que se ejecute nuestro programa de una forma concurrente real e incluso en más de un procesador a la vez.

¿Cómo se hace?

Los cambios, con respecto a la implementación con threads, son bastante sencillos. Vamos a utilizar la librería Process nativa de Python, y para gestionar los procesos función Pool, que también integra.

Aquí un ejemplo de lo escrito:

  • Ejecutar una función de forma concurrente.
  • Gestionar todos los procesos
  • Acceder a variables en exclusión mutua de manera sencilla.

Definimos nuestra función y algunas variables:

La función “Value nos devuelve un objeto que se encargará de realizar la exclusión mutua por nosotros. Para acceder al valor de éste lo hacemos utilizando la propiedad “.value“. Requiere un parámetro en su creación. Un parámetro ctypes. Este le indica a la función “Value” que tipo de valor va a almacenar.

Ahora definimos nuestro pool de procesos, o lo que es lo mismo, la cola de procesos. Para crearla debemos especificarle el número máximo de procesos que se van a ejecutar a la vez:

Solo nos queda crear nuestros procesos. Para este ejemplo crearemos 20 procesos:

Si nos fijamos en el código, con el método “apply_async lo que hacemos es lanzar los procesos de forma asíncrona. Este método acepta como parámetros el nombre de una función y los parámetros de esta, que como en este caso no tiene pasamos un conjunto de parámetros vacío.

El código total es como sigue:

De esta forma ya tenemos nuestro programa multiproceso y con exclusión mutua.

¿Cómo conseguir que CTRL+C funcione?

Una de las dudas más preguntadas en internet, relacionadas con Python y threads, es cómo implementar una de forma eficaz que el CTRL+C detenga todos los hilos.

Con procesos esto es muy sencillo. Para entenderlo tenemos que entender que pasa cuando lanzamos el proceso. En este caso, la función “A“, se convierte en un ente independiente, igual que si lo ejecutáramos de forma independiente. ¿Qué significa esto? Que dentro de la función es donde tendremos que interceptar la señal CTRL+C, como si fuera un proceso independiente. Por tanto el código nos quedaría el código como sigue:

De esta sencilla manera el problema queda solucionado.

—————————————

Sígueme en twitter: @ggdaniel y en Linkedlin: es.linkedin.com/in/garciagarciadaniel

Hacking ASP.NET MVC

¿De qué va este post?

Con este post aprenderás a crearte usuarios en un sistema que utilice el framework ASP.NET MVC sin necesidad de tener credenciales para ello.

¿Qué es ASP.NET MVC?

Es un framework de desarrollo rápido de aplicaciones web potentes, robustas y seguro creado por Microsoft, que sigue el modelo MVC, como otros frameworks como Spring, Struts, Symfony o Django.

¿Cómo funciona?

A muy groso modo su funcionamiento está basado en la separación de la parte visual de la parte de código (o programática), además de tener un formato REST para llamar a cada una de las funciones (utiliza la URL para hacer la llamada a la función adecuada, por ejemplo: sitio.com/Usuarios/agregar). Cada función tiene asociada una parte visual o vista.

La forma de llamar a una función es a través del formato REST. Supongamos que queremos dar de alta un usuario. Deberíamos tener un módulo de usuarios con una función “alta”. A esta función tendríamos que tener asociada una vista, que es lo que se envía al navegador del usuario, y poner en el navegador: sitio.com/Users/Add

Ejemplo práctico

Si utilizamos el IDE de desarrollo de Visual Studio de Microsoft, que es lo más habitual, éste nos facilita el desarrollo y nos permite crear una plantilla de un sitio tipo MVC con unos cuantos métodos y funciones predefinidas para ahorrarnos trabajo. Entre otras incluye: Un home por defecto, creación, eliminación y alta de usuarios, estructuras de gestión, etc.

Si hemos utilizado dicha plantilla deberemos tener cuidado y borrar aquello que no vayamos a usar como, por ejemplo: el registro de usuario. ¿Por qué? Porque para dar de alta usuarios no es necesario ningún tipo de autenticación por defecto.

Lo más habitual es que los desarrolladores despistados o sin suficiente experiencia se dejen el código funcionando, aunque no tengan ningún enlace que apunte directamente a la funcionalidad.

¿Cómo podemos aprovecharnos de esta situación? Muy fácil. Sabiendo que el framework utilizado es asp.mvc con poner la ruta:  site.com/Account/Register” debería de aparecernos un formulario que nos pide nuestros datos para crearnos nuestro usuario:

Más complicado todavía

Tal vez nos encontremos con que un desarrollador ha intentado quitar esta funcionalidad pero solo lo ha hecho parcialmente eliminando la vista asociada. Si este es el caso el servidor nos volcará un error parecido a este:

A priori puede parecer que la funcionalidad no está disponible. Pero esto es solo una ilusión. Aunque la vista no esté disponible el código del servidor es ejecutado y es después de hacerlo cuando se vuelca el error. ¿Qué significa esto? Que si pudiéramos construir una petición correctamente formada y que  l framework entendiera podríamos crear un usuario. Muy bien, pues vamos a ponernos a ello.

Como el framework es gratuito y tenemos una versión Express del Visual Studio podemos construirnos un sitio por defecto y ver información necesita para que la petición sea correcta.

Primero observamos los métodos encargados de dar de alta usuarios:

Todavía hay una cosa que nos falta: Conocer la estructura “RegisterModel”. Exploramos nuestro proyecto y vemos la definición de esta clase:

Con esto ya tenemos toda la información que necesitamos para crear nuestro usuario de forma… llamémoslo “ninja” J. Solo nos queda hacer la petición de forma manual. Aquí cada uno tienes sus manías y yo he preferido hacerlo con el ZAP Proxy por comodidad:

El verdadero “truco” está en enviar la información con los datos POST adecuados y el Referer en la cabecera HTTP. Sino enviamos el Referer ejecutará el primer método, que no tiene parámetros y solo nos muestra la vista. Cuando realmente llamamos al segundo método es utilizando el Referer tal y como lo podéis ver en la imagen.

Una vez hecho esto obtendremos el mismo mensaje de error que antes pero internamente se habrá creado nuestro usuario cr0hn con contraseña “holamundo”.

No seáis malos y cuidadito con donde “inyectáis” usuarios :)

Podéis seguirme en twitter: http://twitter.com/ggdaniel o en linkedIn: es.linkedin.com/in/garciagarciadaniel

Page 1 of 1012345»...Last »