martes, diciembre 06, 2011

Bypassing JQuery-Real-Person Captcha

Son muchas las ocasiones en las que en nuestro equipo de auditoría web, mientras hacemos pentesting, nos encontramos con un captcha que protege los ataques de fuerza bruta y nos complica el poder hacer uso de herramientas de fuzzing en ciertas fases. Normalmente, si está bien implementado, es una buena forma de evitar dos cosas: tanto que un usuario malintencionado consiga dar con la password de un usuario como sobre-saturar el servidor web debido a la cantidad abultada de peticiones que requieren este tipo de ataques.

Breve Introducción al mundo de los captchas en auditoría web

Para enfrentarse a los captchas de forma automatizada existen aproximaciones muy documentadas sobre la evasión, siendo las más famosas las que se basan en técnicas de OCR (Optical Character Recognition). Utilizando OCR, se consigue, a partir de una imagen, obtener el texto que ésta contiene. Para ello se realizan cuatro pasos con el fin de extraer el correcto reconocimiento del texto incluido en la imagen.

- En el primero paso, denominado binarización, se intentan eludir todos los colores superfluos a la imagen hasta obtener una imagen con dos colores.

- La segunda fase, llamada segmentación de la imagen, se encarga de la detección de las regiones de las imágenes.

- Posteriormente se adelgazan esas regiones de obtenidas en el paso anterior.

- Por último, se comparan las imágenes acotadas y extraídas de los pasos anteriores, con unos patrones almacenados en una base de datos para el correcto reconocimiento del texto.

Sin embargo, en caso de que el captcha no se componga de una imagen, el reconocimiento mediante OCR queda, en principio, fuera de los métodos de evasión de captchas.

El Captcha JQuery Real Person

Este fue el caso que se me planteó “en una página web de cuyo nombre no quiero acordarme” cuando el captcha utilizado para la protección del login no era una imagen. No tardé en reconocer el nombre del software que implementaba la solución de captcha. Se trataba de un plugin de JQuery desarrollado por Keith Wood y que disponía de una demo en live en su página web donde también es posible su descarga: JQuery Real Person

Encontré numerosa información sobre dicho sistema de captchas haciendo una búsqueda en Google pero no encontré ninguna vulnerabilidad conocida.

Figura 1: Referencias a jQuery Real Person en Google

Entonces empecé a mirar el código para encontrar la función que validaba los datos introducidos y, mirando el código no es difícil encontrar que se pasaba un parámetro llamado “defaultRealHash” junto con el texto introducido en el captcha para realizar la validación. Después de probar un rato observé que el texto introducido estaba siempre relacionado con el valor de “defaultRealHash” que se pasa a la aplicación.

Figura 2: Los parámetros que envía

El fallo se produce porque no se controla qué valor se le muestra al usuario, y el componente solo comprueba que el valor introducido por el usuario corresponde a su "defaultRealHash". Por tanto simplemente necesitaba obtener un par válido de “defaultRealHash” y del texto introducido en el textbox del captcha y utilizarlo de forma fija en todas las peticiones.

En el caso de la imagen anterior se puede ver que el valor “-930476214” corresponde con el captcha “PSVHWM”. Por tanto introduciendo ese par de valores saltaré la comprobación, independientemente del texto mostrado por el captcha. Para verlo más claramente e implementarlo en un ataque de fuerza bruta, utilicé Burpsuite:

Figura 3: Fijando los valores con BurpSuite

De este modo y con ese par válido podríamos lanzar el ataque de fuerza bruta saltándonos la medida de seguridad impuesta por el captcha.

La explicación en el código

Para entender mejor este fallo a través del código fuente del componente, descargué la aplicación de su página original y esto es lo que se puede observar:

Figura 4: La explicación en el código de jQuery Real Person

Como se puede ver en la captura anterior la creación del captcha se realiza en la función “rpHash” con el parámetro “defaultReal” que habremos pasado por POST. Una vez que hayamos enviado los parámetros “defaultReal” y “defaultRealHash” comprobará si estos son los mismos que él ha pre calculado. En caso positivo supondrá que el captcha es correcto mientras que en caso contrario, la aplicación supone, que el texto introducido no coincide con el mostrado por el js.

Por tanto simplemente con encontrar un par válido de parámetros “defaultReal” y “defaultRealHash” es suficiente para realizar un ataque de fuerza bruta saltando las restricciones del captcha.

Reflexiones finales sobre los captchas en los procesos de login

Hay multitud de soluciones para implementar un captcha en un sitio web. Algunas de ellas, son de pago mientras que existen otras muchas gratuitas e incluso open source. En este caso, este tipo de componentes atenúan el impacto de los ataques automatizados sin obligar a los desarrolladores a tocar el código mucho en el lado del servidor, pero cómo se puede ver, no suponen una gran protección contra un análisis a fondo.

Lo recomendable para la correcta fortificación de un punto de login, es realizar complementariamente a un sistema de captcha, un bloqueo temporal de las direcciones IP que hayan realizado un número elevado de intentos de login y un uso de cookies para limitar las acciones por sesiones,

La vulnerabilidad fue reportada a exploit-db y ha sido también publicada en diversas fuentes:

http://www.securityfocus.com/bid/50842
http://packetstormsecurity.org/files/107357/jquerycaptcha-bypass.txt
http://1337day.com/exploits/17209
http://www.exploit-id.com/web-applications/bypass-the-jquery-real-person-captcha-plugin-0-day

Para finalizar quiero dar las gracias a Informática64 y al equipo de seguridad web al que pertenezco allí, por haberme brindado los conocimientos necesarios para haber sido capaz de esbozar este post.

Alberto García
Auditor de Seguridad en Informática64

6 comentarios:

skillmax dijo...

Buen aporte

agux dijo...

Aaaaaainssss... Eso de dar ideasssss... Ahora tengo más datos para continuar mi investigación. xDxD

Muchas gracias por la información!! En cuanto tenga el proyecto más o menos funcionando, os aviso!!

cucu dijo...

Agux, nos puedes decir brevemente en que consiste tu proyecto?

agux dijo...

Espero que las expectativas no sean muy altas.

Dos semanas o tres semanas antes de que hablasen de un programita (¿fue hackplayers?) que envia un hash a distintos sitios web ya había empezado a montarme un módulo del proyecto en el que estoy que hacía algo parecido a eso. Me explico:

Tenemos un listado grande de hashes md5 (con los que estoy trabajando ahora) y se envía a una de las tantas páginas conocidas. Se espera el resultado y... De momento ahí me estoy quedando. El problema es que hay algún sitio que, como digo, ya había visto antes de esa publicación, que tiene un CAPTCHA. Y tengo que ver cómo saltarlo o, al menos, pasarlo a la pantalla para que el usuario escriba el resultado. Además, lo tengo programado para ir saliendo del paso. De momento no está pensado para publicarlo.

Ahí están los atecedentes y las ayuda al problema que tengo relacionado con este post. Hay más frentes en los que tengo que trabajar, ya sea de este proyecto o de otras cosas que tengo en mente.

culo dijo...

Pues vaya chusta y decepcion, una captcha

oscar dijo...

como hago para que me quede en mi pagina el nombre que arroja la url http://siri.procuraduria.gov.co:8086/CertWEB/Certificado.aspx?tpo=1 tiene ese capcha real person

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares