Los captchas (Completely Automated Public Turing test to tell Computers and Humans Apart) están ampliamente extendidos hoy en día. Cualquier aplicación web con cierto nivel de seguridad que permita entrada de datos a usuarios no autentificados debería contar con un captcha para dificultar ataques de fuerza bruta. La mayoría de los captchas suelen ser visuales, en ellos se ha de escribir en un campo de texto los caracteres mostrados en una imagen. Pero el hecho de tener un captcha en una aplicación no significa que automáticamente estemos a salvo de ataques de fuerza bruta.
Un captcha visual débil resulta sencillo de romper gracias a programas de reconocimiento óptico de caracteres (OCR). Un captcha visual que resulte difícil de crackear debe contar con diferentes fuentes tipográficas, tamaños, colores, caracteres distorsionados y ruido en el fondo.
En esta entrada me gustaría mostrar lo sencillo que resulta el crackeo de un captcha débil. Para ello voy a exponer un caso real, omitiendo la dirección de la página web en cuestión. Se trata de una página que permite a sus usuarios hacer pública cierta información en forma de código. Este proceso se realiza anonimamente y sin ningún tipo de autentificación, tan sólo cuenta con el siguiente captcha:
A simple vista se aprecia que el captcha no aporta gran seguridad gracias a sus caracteres perfectamente definidos.
Ejemplo práctico de crackeo de captcha débil
Para crackearlo usaremos el programa GOCR, el cual es open souce y en Linux se puede instalar desde las fuentes habituales.
Este programa requiere un «entrenamiento» previo para reconocer los caracteres, por lo que será lo que hemos de hacer en primer lugar:
mkdir ocrdb gocr -d 2 -p ./ocrdb/ -m 256 -m 130 captcha.png
La ruta ./ocrdb/ será en dónde se guardarán los datos que genere gocr a partir de su «entrenamiento», este directorio lo tenemos que crear manualmente. ‘captcha.png’ es el captcha que crackearemos. Al ejecutar este comando, nos encontraremos con lo siguiente:
En esta captura vemos como gocr nos pregunta por la primera letra, en este caso una «V». La letra por la que nos pregunte en cada momento estará pintada con corchetes ‘#’, las demás con ‘O’. Al introducir la letra «V» continuará con las siguientes letras del captcha. Este proceso lo tendremos que repetir cuantas más veces mejor, hasta que gocr sea capaz de entender el captcha sin nuestra ayuda. Por lo que tendremos que ejecutar el comando bastantes veces, para agilizar el proceso podemos usar el siguiente script:
#!/bin/bash while [ 1 ]; do wget -O captcha.png http:/servidor-ejemplo.com/captcha_gen.php ; gocr -d 2 -p ./ocrdb/ -m 256 -m 130 captcha.png ; done
Cuando gocr sea capaz de descifrar la mayoría de captchas por si mismo pulsamos ctrl+c para detener el script. Lo siguiente sería poner a prueba el programa:
gocr -p ./ocrdb/ -m 256 -m 2 captcha.png
Este sería el método general para usar gocr, pero en el ejemplo que he propuesto es poco útil. Vamos a crear un script que se encargue del crackeo del captcha y del envío de nuestros códigos a la página con wget:
#!/bin/bash # este será el código que se le enviará a la web miCodigo='XPEYWZA-002' # urls de la página. La general y la que recibe los datos por POST url='http:/servidor-ejemplo.com' postUrl='http:/servidor-ejemplo.com/add-code.php' # rutas temporales de trabajo dirActual=`pwd` dirTrabajo='/tmp/captcha' # si existe el directorio temporal lo borramos if [ -d "$dirTrabajo" ]; then rm -Rf $dirTrabajo fi mkdir $dirTrabajo cd $dirTrabajo # hacemos una primera petición a la web guardando cookies wget --save-cookies $dirTrabajo/cookies.txt --keep-session-cookies \ -r $url # renombrarmos el captcha, realizamos el OCR y eliminamos los espacios en blanco mv captcha.php captcha.png captchaResuelto=`gocr -p $dirActual/ocrdb/ -m 256 -m 2 captcha.png` captchaResuelto=${captchaResuelto/ /} echo 'CAPTCHA RESUELTO:' $captchaResuelto # envíamos por POST el código a añadir y el resultado del captcha, # teniendo en cuenta las cookies y datos de sesión wget --post-data="add=$miCodigo&captcha_code=$captchaResuelto" \ --keep-session-cookies --load-cookies $dirTrabajo/cookies.txt \ $postUrl cd $dirActual
Este script lo guardaremos el el mismo directorio en el que tenemos «ocrdb/». Le podríamos añadir algunas comprobaciones de respuesta de la web, algún bucle para repetir el envío, ejecutarlo cada X tiempo vía crontab, etc. Pero eso se sale de las pretensiones de esta entrada.
Nota: Las urls de los scripts están mal formadas intencionadamente (http:/) para que el resaltador de código no las incluya como enlaces.
gracias por compartir esto, me fue de mucha utilidad, sobre todo la parte del wget ;)
Buenas me interesaria mucho esto porque necesitaria tener el texto de un captcha
El problema es que la web el tipo de imagen no es ninguno solo pone captcha.php, y no consigo sacarselo
Hola Jesús, echa un ojo a la siguiente dirección: http://stackoverflow.com/questions/724391/saving-image-from-php-url
Si aun así no consigues solución dime la URL de la imagen y a ver si se me ocurre algo.
Mira te comento yo ya tengo mi GOCR con todas las letras que necesito vale? Aunque lo e echo todo a mano… Te explico resulta que yo quiero utilizarlo para una página web que ponen a veces captchas, he probado a hacer wget -O captcha.png http:/servidor-ejemplo.com/captcha_gen.php ; pero con mi url y no me funciona no se porque en la web sale una imagen en el captcha pero es encriptada no se puede descarar ni nada, entonces no se que url poner para que me coja las imágenes. La mia tiene url principal y después donde coge el post es index.php si no te doy la web y un usuario y me dices como hacer a ver si existe solución? Muchas Gracias
Puedes probar con «curl» en vez de «wget».
Primero de todo querría hacer este script correctamente pero no tengo ni idea de como conectarlo con la web
#!/bin/bash
while [ 1 ]; do
wget -O captcha.png http:/servidor-ejemplo.com/captcha_gen.php ;
gocr -d 2 -p ./ocrdb/ -m 256 -m 130 captcha.png ;
done
Pero como utilizo el cURL en un script?
$url = ‘http://example.com/image.php’;
$img = ‘/my/folder/flower.gif’;
file_put_contents($img, file_get_contents($url));
La url de la imagen es esta http://www.vendecookies.com/captcha.php
Por lo que veo el captcha es generado una vez identificado como usuario. Tal vez el código que genera el captcha comprueba que a la hora de hacer la petición se esté identificado. Tendrías que ver alguna forma de identificarte antes de hacer la descarga del captcha.
Si me identifico y cuando realizo una acción tengo que pasar el captcha, pero a la hora de descargar, si lo guardas te lo guarda como .php y si lo abres a una nueva pestaña en la imagen viene encriptado, con un montón de símbolos y letras