¿Qué son los captchas?
Un CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart: test de Turing público y automático para distinguir a los ordenadores de los humanos) es una medida de seguridad que se suele usar en apps y webs donde comprueban si eres un humano o una máquina, normalmente esto se hace como una manera de autenticación para asegurarnos del spam en nuestras plataformas.
En este blog trataremos de ver las diferentes formas de romper este sistema de captchas (Esta sera la primera parte)
Tipos de captcha
En este post hablaremos de los captchas Visuales y textuales, pero por si alguien quiere saber más sobre otro tipo de captchas (Posiblemente los veamos después) tienen esta lista con su fuente de respaldo.
- Textuales
- Problemas matemáticos
- Preguntas lógicas
- Juegos de palabras
- Redes sociales
- Límite de tiempo
- Visuales
- Auditivos
- Campos ocultos
- Lúdicos
¿Los captchas son impenetrable?
En realidad no, su gran desventaja es que este tipo de sistemas no sepa quién es robot o humano y se llegan a dar captchas que para el humano visualmente sea fácil de resolver, también pasa con los bots bien entrenados, y que estos captchas simplemente solo sea un pequeño obstáculo para aquellos robots menos sofisticados.
Actualmente, tenemos herramientas como Tensorflow (Una librería para el aprendizaje automático) donde se puede llegar a entrenar una IA para resolver este tipo de captchas, también tenemos otras utilidades como vendrían siendo convert y tesseract.
La herramienta convert proveniente de ImageMagick es para el uso de la manipulación de imágenes donde podremos dilatar, eliminar un color o realizar varios filtros para la eliminación de ruido en la imagen, esto se hace para luego pasarlo a tesseract que vendría siendo un OSCR, es decir, una herramienta de Reconocimiento Óptico de Caracteres la cual hace posible que podamos extraer texto de una imagen, y aquí ya se podrían hacer una idea de ¿Entonces realizamos ediciones con filtros a la imagen para luego leerla?
en pocas palabras si, en otras no es tan sencillo pues la mejor configuración que hagas en convert para un solo captcha hará que no resuelva muchos o que el porcentaje de resolución por captcha disminuya así que tendríamos que realizar varias pruebas en un enumerado rango de captchas.
Filtro: convert y tesseract.
Dificultad 1.
En esta prueba haremos uso de 100 captchas, pero antes de saber la capacidad de uno a cien captchas haremos la primera prueba a uno solamente para que se den una idea general de lo que se puede llegar a hacer.
Tendremos como base este código de python que hace uso de Tesseract.
1
2
3
4
5
6
7
8
9
try:
from PIL import Image
except ImportError:
import Image
import pytesseract
captcha = pytesseract.image_to_string(Image.open('9RMX.jpg'),config='--psm 8 -c tessedit_char_whitelist=0123456789abcdfghijkmnlopqrsturstuvwxyz')
captcha = captcha.replace(" ", "").strip()
print(captcha)
Si desean probarlo adelante, en este ejemplo por la simplicidad del CAPTCHA pasarle un OSCR será sencillo, pueden utilizar lo de arriba o solamente poner en la terminal.
1
$ tesseract -c tessedit_char_whitelist=abcdefghijklmnopqwrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY1234567890 --psm 8 9RMX.jpg output
Y nos saldrá algo como ORMX
, confundiendo la O por el 9, y en estos casos si queremos resolver muchos captchas esto nos puede resultar algo incómodo pues aunque acierte todo no nos va a servir de mucho si falla una letra, eso si, no en todos los casos pasa y dependiendo el filtro que emplees en uno solo dejara de funcionar en muchos así que toca tener cuidado con aplicar cada filtro y hasta a veces simplemente no te va a salir nada, normalmente es más fácil cuando solamente son letras o números por separado, pero en caso de que sean ambas recuerden poner en la tessedit_char_whitlist
poner mayúsculas y minúsculas, en caso de que solamente sea mayúsculas sería mucho mejor.
Ejemplo
1
$ tesseract -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXY --psm 8 captcha.jpg output | cat output.txt
Output: RBSKW
Ahora bien se preguntarán, ¿Entonces de que me sirve hacer todo esto si igual va a fallar en un número o letra?, es buena pregunta la verdad en los primeros casos que me pregunte es en que sistema de captchas puedo utilizarlo, ¿Y me dejara usar el mismo captcha a resolver repetidas veces?, en pocas palabras no, en sistemas buenos (Casi todos) no deja que se vuelva a repetir el mismo captchas, pero hay excepciones como lo es AminoApps
que te deja realizar infinitos intentos en el mismo captcha, pero hagamos de vista gorda que nunca pasara esto en otro sistema entonces nos queda hacer nuestro propio entrenamiento de caracteres al OSCR con jTessBoxEditor.
Dificultad 2.
Muchos se darán cuenta de que esté el típico captcha que te sale para resolver un número o cuando te vas a registrar en alguna web, pero afortunadamente esto no es un problema para convert y tesseract (^^)
.
Antes de pasar la solución y explicación de este captcha haciendo pruebas resientes, aprendí que el orden de como se pasen los parámetros en tesseract es fundamental para la resolución de las letras, pues poner esto.
1
$ tesseract -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXY --psm 8 captcha.jpg output | cat output.txt
No es lo mismo que esto.
1
$ tesseract --psm 8 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXY captcha.jpg output | cat output.txt
Aunque sea algo mínimo te puede dar más números y de paso incorrecto o simplemente el correcto, por si acaso, el último es que más me funciona, pero si se preguntan porque el primero funciono con RBSWK
es porque es un caso muy simple, por lo que da igual en que orden este OSCR lo va a resolver.
El filtro que usaremos con esta imagen será el siguiente:
1
$ convert captcha.png -morphology Erode Disk:2.2 captcha.tif
Lo primero que hacemos es pasar nuestra imagen captcha.png
al método de morfología, pero antes ¿Qué es la morfología?, es un método en el cual limpia y estudia la estructura de las imágenes comparando cada pixel de varias maneras o métodos, por ejemplo, el método que vamos a usar será el de erode
, lo que hace es expandir las zonas blancas haciendo que sean más grandes y más suave de tratar, pero esto dependerá con el número de iteraciones que le pasemos, esto hará que también se erosionen las zonas negras en la imagen quedando de esta forma.
output
Pasamos la imagen a la extension.tif, porque es mas facil almacenar imágenes en alta resolucón en mejor calidad.
Luego de que tengamos los números más claros de trabajar los pasamos al siguiente filtro.
1
$ convert captcha.tif -gaussian-blur 0 -threshold 41% -paint 1 captcha.tif
-gaussian-blur
difuminará la imagen para luego pasarla a blanco y negro con -threshold 41%
después de esto rellenamos los espacios en blanco con paint 1
(Recordar que las líneas de colores en este tipo de captchas a veces atraviesa a los números haciendo que queden espacios)
Lo leemos con OSCR, y de paso quitamos las letras, pues en este tipo de captchas solamente nos interesa leer los números (A veces también aplica lo primero que dije del orden de poner cada cosa, este igual es así en el orden de que pongas letras minúsculas, mayúsculas y números.)
1
$ tesseract --oem 3 --psm 6 -c tessedit_char_whitelist=0123456789 ejemplo.tif output | cat output.txt
output: 319653
Para realizar pruebas con este filtro le recomiendo ver este pequeño código que hice de paso, aplico lo de realizar fuerza bruta en los captchas, también aclaro que el nombre de las extensiones es el número de cada captcha, así no pierde el tiempo en verificar si quedo bien o mal x captcha. (^^)
.
1
$ git clone https://github.com/Sstandby/bypass-captcha
Opinión
Aunque no sea muy creíble, redes sociales como AminoApps o webs que pueden llegar a ser de stu propia empresa pueden sufrir de este tipo de ataques creando información falsa o sobre información innecesaria en tu plataforma como lo que ha ocurrido en Amino que gracias a este tipo de bypass más sofisticado se ha logrado romper la seguridad del registro de la misma app creando así miles y miles de cuentas falsas.
Aunque se a tratado de impedir esto poniendo una barrera de x cuentas por IP, pero ¿Hasta qué punto esto es viable?, ya que como sabemos realizar simples request con proxy no es nada del otro mundo y tener unos 100 proxys funcionales por 5 cuentas con cada uno al día es algo que dice mucho, y aclaremos que muchas plataformas de por sí no solo dependen de este un captcha si no de diferentes formas de seguridad como por ejemplo, filtrar correo al registrarse admitidos y no simplemente crear cuenta porque si como ha sido del caso que usan simplemente e-mails temporales.