Creando un bash script para burlar formularios con campos CAPTCHA

1. Introducción

El término CAPTCHA hace referencia a una prueba utilizada en las páginas web para determinar si es un humano el que intenta realizar una acción como comentar en un artículo, visualizar información, también es muy común en páginas de descargas como depositfiles, turbobit, fileshare, etc.

Podría apostar que existen varios softwares "navegando por la web" con el único fin de buscar información, realizar comentarios spam, etc.

El método CAPTCHA es realmente sencillo, se le muestra al usuario una imagen, a partir de ella debe poner los caracteres que están en la imagen, si los caracteres son correctos se le muestra o permite realizar la acción previamente solicitada, en caso contrario simplemente bloquea la acción o da otra oportunidad para que pueda ingresar el texto de la imagen.

Pero ésta seguridad es muy relativa, existen los denominados software OCR(Optical Character ecognition) los cuales convierten una imagen a texto. Las imágenes CAPTCHA se obtienen mediante la misma página web, lo cual posibilita , sabiendo la URL, que un software pueda realizar una llamada HTTP , ej. usando  curl, y una vez obtenida la imagen se use un programa OCR para convertir la imagen a texto.

1.1. Contenidos

  1. Requerimientos.
  2. Análisis de peticiones http
  3. Script en bash para la resolución del captcha.

Este artículo redacta la forma en como burlar una "seguridad CAPTCHA" para obtener información. El escenario es que se debe resolver el captcha para obtener información acerca de algo, pero como se desea realizar de manera automática, se creará un script que emule a un humano para obtener la información de ese algo. Se eliminará la referencia a la página original y será modificada por http://webatacada.com/formulariocaptcha.php.

2. Requerimientos

Los requerimientos necesarios para entender el presente documento se dividen en :

Conocimientos

  • Conocimiento básico del protocolo HTTP, POST, GET,HTML y formularios.
  • Bash scripting

Software

  • Firefox, para el análisis http o chromium.
  • GNU/Linux, cualquier distribución
  • curl, software que permite el envío y obtención de información a través de URL(comando)
  • tesseract, software de reconocimiento OCR(comando), es común en la mayoría de distribuciones GNU/Linux.

3. Análisis HTTP

En esta sección usaremos firefox para poder analizar las peticiones HTTP realizadas por una página que solicita el ingreso de código CAPTCHA, de esta manera obtendremos las URL usadas para llamarlas automáticamente con curl.

3.1. Obtención de imagen captcha

Lo primero que tenemos que hacer es determinar cómo se obtiene la imagen CAPTCHA. La única manera de enviar imágenes dinámicas con una misma URL, es que una página web(URL) se encargue de eso. Abrimos la página http://webatacada.com/formulariocaptcha.php con firefox, ubicamos la imagen CAPTCHA,  damos clic derecho y seguidamente damos clic en Inspeccionar elemento:

Ahora nos fijamos en el atributo src de la imagen para ver la URL:

Como se puede observar en la imagen anterior la URL de la imagen CAPTCHA es captacha?accion=image&magic=1, ésta es una ruta relativa por lo cual hay que unirla a la URL de la página para saber la ruta completa, de esta manera la ruta completa de la imagen captcha sería:http://webatacada.com/captacha?accion=image&magic=1, para estar seguros abriremos la URL de la imagen en otra ficha del navegador:

Y efectivamente, la URL anterior nos da la imagen CAPTCHA.

3.2. Obtención de página de recepción de datos y método de envío

Ahora que sabemos cuál es la URL para la imgen CAPTCHA, tenemos que averiguar a que página se realiza la petición POST. La URL la podemos encontrar en el atributo action de un formulario HTML, así que buscaremos el formulario a partir del elemento submit del formulario, en este caso el botón buscar. Ubicamos el botón buscar, damos clic derecho, seguidamente a inspeccionar elemento. Debemos navegar entre los diferentes elementos hasta encontrar el formulario:

En la imagen anterior se puede visualizar el nombre de la página en el atributo action, en este caso la ruta relativa es info.php,(he tachado la parte de la ruta además de poner una página ficticia por las razones expuestas arriba), al igual que en la imagen hay que concatenar la URL base de la web con la ruta relativa en el atributo action, quedando la URL de envio de datos como: http://webatacada.com/info.php. Hay que tomar en cuenta que el método de envío utilizado es POST el cual está indicado en el atributo method.

3.3. Obtención de datos enviados a través del formulario

En chromium también se pueden realizar los pasos anteriores.

Para obtener los datos enviados en un formato que podamos usarlo posteriormente con curl utilizaremos chromium, primero debemos activar la barra de desarrolladores con el atajo de teclado SHIFT+CTRL+I, una vez activada la barra daremos clic en  Network(Red):

Ahora simplemente cargaremos el formulario CAPTCHA, lo llenaremos como normalmente lo haríamos y presionamos el botón buscar, esto nos dará una lista de peticiones realizadas(llamadas a URL). Nosotros debemos buscar una petición POST a la página a la que se envía la información del formulario(EL nombre de la página lo obtuvimos en 3.2.):

Al darle clic a la petición nos aparecerá un panel en el cual nos dará la información que ha sido enviada, buscaremos la sección Form data y daremos clic en view source(En la imagen ya está activada la opción view source):

Listo!, con esto ya sabemos qué información es enviada. Cada uno de los valores está representado por:

<variable>=<valor>

Donde:

<variable> es el nombre que se le da, esto no debes modificarlo por ningún motivo.

<valor> es el valor que se le está dando a la variable, cuando uses curl para obtener la información deberás modificar los valores para ajustarlo a tu necesidad.

Cada uno de los pares variable-valor están separados por un &.

Ejemplo:

busqueda=hola&tipo=1&codigo=CVLD

Ahora debemos identificar en qué variable se está usando para el enviar el texto que escribimos como resolución del CAPTCHA, para este caso el nombre de la variables es codigo(Simplemente usa tu cerebro para deducirlo cheeky).

4. Creación del Script en Bash

En la sección 3. se abarca un concepto básico de análisis de la página web para ver su comportamiento y emular a un humano, aquí describo las acciones realizadas por la página:

  1. Se carga una imagen CAPTCHA a través de una URL dinámica, http://webatacada.com/captacha?accion=image&magic=1.
  2. La información del formulario es enviado a http://webatacada.com/info.php
  3. Tenemos la información enviada por POST a la página del punto 2.

Como verán los pasos son muy simples y sencillos, para emular este comportamiento utilizaremos los siguientes softwares a manera de comandos:

  1. curl: nos permitirá obtener la imagen CAPTCHA además de almacenar la cookie en una carpeta temporal además de enviar la información a la página http://webatacada.com/info.php .
  2. tesseract: convertirá la imagen a texto
Se asume que ya tienes instalado en software necesario en tu PC.

Primero el código para obtener la imagen CAPTCHA asumiendo que la página es http://webatacada.com/captacha?accion=image&magic=1:

out=`curl -c cookie.txt -o captcha_image --request GET http://webatacada.com/captacha?accion=image&magic=1`

Al almacenar el resultado de curl en la variable out obligamos a bash que termine con la ejecución de curl antes de pasar a la siguiente linea de código. En el código anterior la imagen CAPTCHA se guardará como captcha_image y las cookies generadas por la página en cookie.txt. Ahora obtenemos el texto de la imagen con tesseract

tesseract captcha_image texto -psm 7
A pesar de que en el argumento de archivo de salida para tesseract se ha puesto texto, el texto se guardará en el archivo texto.txt

Con el script anterior, el texto generado a partir de la imagen se guardará en texto.txt. Ahora simplemente almacenamos el texto CAPTCHA en una variable bash y enviaremos la información a http://webatacada.com/info.php con curl:

CAPTCHA_TEXT_VALUE=`cat texto.txt`
out=`curl -b cookie.txt --data "XXXXXXXXXXXXXXXXXX&codigo=$CAPTCHA_TEXT_VALUE&XXXXXXXXXXXXXXXXXXXXXX" -o info.html  http://webatacada.com/info.php

En el argumento data hay que enviar la información enviada por el método POST obtenido en 3.3., obviamente hay que cambiar el campo dónde debe estar el CAPTCHA por el valor obtenido, en este caso es en la variable código. Las XXXX deben ser reemplazadas por toda la información adicional enviada. Esto varía en cada página.

Finalmente este sería el código completo:

out=`curl -c cookie.txt -o captcha_image --request GET http://webatacada.com/captacha?accion=image&magic=1`
tesseract captcha_image texto -psm 7
CAPTCHA_TEXT_VALUE=`cat texto.txt`
out=`curl -b cookie.txt --data "XXXXXXXXXXXXXXXXXX&codigo=$CAPTCHA_TEXT_VALUE&XXXXXXXXXXXXXXXXXXXXXX" -o info.html  http://webatacada.com/info.php
La importancia del script radica en que tu puedes modificar los valores de cada variable enviada a través de curl(--data), esto te hará obtener la información que deseas de manera automática. Además de que puedes usarlo en otros programas o llamarlos a través de páginas web.

Conclusiones

  • Sólo es necesario el conocimiento básico de HTML y HTTP para poder entender el funcionamiento del método CAPTCHA. Con la información obtenida se puede crear un simple script que haga la tarea de manera automática. Por tal motivo usar CAPTCHA para determinar si el que realiza la petición es un  humano suena a un mal chiste :).
  • Los pasos para crear el SCRIPT no serán iguales para todas las páginas. Para deducirlas debes analizar las llamadas HTTP realizadas en la página.
Sistemas Operativos: 
Lenguaje de programación: 
Actividad: 

Comentarios

Una pregunta es que cuando hago lo de obtener el atributo src de la imagen para ver la URL mi url es esta http://webatacada.com/captacha.php y al abrir esa url me sale código encriptado como puedo obtener la imagen?

Imagen de Jean Mazuelos
Enviado por Jean Mazuelos el Lun, 10/20/2014 - 10:43

Depende mucho, puede ser que cada que se realiza la solicitud de captcha la URL http://webatacada.com/captacha.php verifica si la petición viene de la página o es a través de una solicitud externa a la página.

La mejor manera es analizar es el código JAVASCRIPT y revisar de manera minuciosa los datos enviados en las peticiones que realiza una página cuando se solicita el captcha (en el punto 3.3. Obtención de datos enviados a través del formulario). De ésta manera puedes detectar si se envían "datos ocultos" cuando se solicita el captcha.

Si gustas puedes escribirme en el facebook de la página con mayor detalle para ver si puedo ayudarte con algo más específico.