Contenido principal

De captchas y otros demonios

Agosto 8, 2008

Según Wikipedia, los captchas (Completely Automated Public Turing test to tell Computers and Humans Apart), son sistemas computacionales que permiten hacer pruebas para diferenciar entre seres humanos y máquinas.

En el campo de la seguridad informática, se utiliza mucho para poder evitar que programas que reconocen estas pruebas puedan hacerse pasar por humanos. Muchos de estos programas utilizan sistemas que vamos a ver mas adelante, los cuales pueden identificar por ejemplo letras distorsionadas que aparecen en una imagen tales como son los de esta página.


La mayoría de captchas que podemos encontrar son captchas visuales donde debemos ingresar el contenido de una imagen o el contenido de audio que contiene dicho captcha, hay muchos captchas que son simples y que pueden ser fácilmente identificados por los programas, mientras que hay muchos otros donde se utilizan diferentes tipos de letra, tamaño, rotación, además de ello agregan cierto ruido que permiten que la imagen o el audio sea mas dificil de identificar por estos programas.

En esta página podemos encontrar varios Ejemplos de Catpchas, y de como es la eficiencia del proyecto "PWNtcha" en cuanto al reconocimiento de dichos captchas.

Ocr (Optical character recognition, Reconocimiento óptico de caracteres)
Es la traducción electrónica de imágenes a un tipo de texto editable. Muchos de estos sistemas vienen incorporados con los scanner y otros productos que proporcionan al usuario la posibilidad de pasar de un tipo de texto no editable como lo es una imagen a uno editable como lo es un texto plano.

Además de los productos comerciales que comúnmente podemos encontrar, existen otros programas que no son comerciales y son libres de uso, y que permiten a un usuario con pocos conocimientos llevar a cabo reconocimiento de texto de imágenes.

En la seguridad informática podemos fabricar nuestros propios sistemas de reconocimiento óptico de caracteres, o aprovechar los programas que ya estan hechos (Para no reinventar la rueda) para fabricar nuestros propios programas reconocedores de texto.

Ahora pasamos de la parte teorica a la parte práctica que es la mas divertida.
Aprovecharemos el funcionamiento de un excelente programa que puede reconocer texto en imágenes, y da también la posibilidad de crear nuestros propios diccionarios de letras en el caso de que las letras no sean un tipo de fuente reconocida por el programa. Los detalles del programa los pueden ver en su página oficial: http://jocr.sourceforge.net

El captcha que romperemos hoy será este

Lo primero que haremos será programar un pequeño script en php para poder dejar la imagen en blanco y negro, para luego poder hacer la identificación del texto con el gocr.
El código del script es el siguiente, está comentado para que quede todo bien claro:

// @título: Blanco y negro
// @autor: www.sinfocol.org
// Es necesario tener instaladas las librerías GD (http://es.php.net/gd)
$ruta = 'captcha_break.jpg';
$img = imagecreatefromjpeg($ruta); //Cargamos la imagen como tipo de archivo png
$x = imagesx($img);
$y = imagesy($img);

$nimg = imagecreatetruecolor($x, $y); //Creamos una nueva imagen con las dimensiones de la primera
imagecolorallocate($nimg, 255, 255, 255); //Ponemos el fondo de la imagen en blanco
$negro = imagecolorresolve($nimg, 0, 0, 0);

//A continuación recorremos cada pixel y sacamos su color
for ($i = 0; $i < $x; $i++) {
    for ($j = 0; $j < $y; $j++) {
        $rgb = imagecolorat($img, $i, $j);
        $colores = imagecolorsforindex($img, $rgb);
        $r = $colores['red']
        $g = $colores['green'];
        $b = $colores['blue'];
        if($r > 200 && $g < 150 && $b < 150){ //Si el color es rojo, entonces ponemos un pixel negro en la nueva imagen
            imagesetpixel($nimg, $i, $j, $negro);
        }
    }
}

imagejpeg($nimg,'captcha_break2.jpg',100); //Creamos la imagen con la mas alta calidad para que no haya perdida en la imagen

Y al ejecutar el script, la imagen resultante es:

Ahora lo que sigue es armar nuestro diccionario de letras con el programa gocr, pero antes de eso debemos convertir nuestra imagen tipo "jpeg" a una imagen tipo "pnm", la cual es la que interpreta correctamente el programa reconocedor de texto. Para esto basta utilizar una línea de comandos y otro programa llamado Djpeg.

djpeg captcha_break2.jpg captcha_break2.pnm

Ahora probemos con el gocr, y veamos que nos sale

gocr captcha_break2.pnm
S97YY

Y con ello comprobamos que el gocr no tiene soporte al tipo de fuente que vemos en la imagen, así que hacemos uso de este pequeño comando para poder enseñarle al gocr cuales son las letras indicadas

gocr -p ./captcha/ -m 256 -m 130 captcha_break2.pnm
DB ./captcha/db.lst not found

./captcha/ es la ruta de la carpeta donde queremos que se guarde la base de datos de la fuente reconocida.
Ahora que hemos ejecutado esta instrucción, nos sale un cuadro de texto parecido al siguiente

Así que la letra de la cual el programa quiere almacenar sus patrones es la que está señalada con "#", mientras que las otras posibles letras estan con "0" y lo demás que el programa dice que no es importante está con ",". Ahora insertamos todas las letras que nos pide el programa, y luego para reconocer el texto señalado en la imagen debemos correr el siguiente comando

gocr -p ./captcha/ -m 256 -m 2 captcha_break2.pnm
S93744

Y ahora el programa nos ha dado el texto correcto.
Hay que tener en cuenta que el proceso de enseñanza debe ser reiterativo, e ingresar varias veces las letras para poder asegurarnos que la base de datos tenga un buen nivel de variaciones de la fuente.

Archivado en: Hacking |

10 comentarios

  1. PervetrhsO Agosto 9, 2008 @ 11:35 am

    muy bueno tuto ;) jeje me servira para el cruel captchar 1 saludos

  2. Sysroot Agosto 9, 2008 @ 11:45 am

    Mas adelante publicaré un script de PHP que pueda quitarle el ruido a la imagen. Mientras tanto creo que se puede pasar ese reto con lo que publique aquí. Los otros cruel captcha (el 3 y 4) creo que son mas complicados, al menos el 3 donde hacen que las letras roten y cambian de fuente, aunque todo es posible.

  3. ulaterck Agosto 9, 2008 @ 8:31 pm

    Muy bueno XD a ver si me hago uno para el del comentario jaja,

  4. Sysroot Agosto 9, 2008 @ 8:35 pm

    Con el captcha de este site me parece que es complicadísimo, porque primero que todo las fuentes no tienen adentro un color definido sino que solo se les ve el borde y para hacer que las identifique no tengo idea (podría ser contando las líneas y los círculos), y segundo porque las letras rotan, algo que lo hace más complicado.
    Cuando lo hagas me lo pasas XD

  5. PerverthsO Agosto 25, 2008 @ 9:37 am

    Bueno tengo un apregunta existe el gocr para win32?? ya q segun me dijieron corre en linux?? gracias

  6. Sysroot Agosto 25, 2008 @ 11:39 am

    Sí, el programa Gocr para windows o para otros sistemas operativos se puede encontrar en la página oficial.
    El binario de windows lo podes descargar de acá: http://www-e.uni-magdeburg.de/jschulen/ocr/gocr045.exe
    Y para buscar los correspondientes binarios de los demás sistemas operativos podes descargarlos de acá:
    http://jocr.sourceforge.net/download.html

  7. cicklow Abril 4, 2009 @ 4:05 am

    Si usan esta funcion
    [code]
    function img2neg($pic) {
    $source=imagecreatefromjpeg($pic); // Source
    $width=imagesx($source);
    $height=imagesy($source);

    $im = imagecreatetruecolor($width, $height); // Our negative img in the making

    for($y=0; $y < $height; $y++) {
    for($x=0; $x < $width; $x++) {
    $colors=imagecolorsforindex($source, imagecolorat($source, $x,$y));
    // Modificacion by Cicklow
    $r=95-$colors['red'];
    $g=95-$colors['green'];
    $b=95-$colors['blue'];
    $test=imagecolorallocate($im, $r,$g,$b);
    imagesetpixel($im,$x, $y, $test);
    }
    }

    imagejpeg($im,$pic,100);
    imagedestroy($im);
    }
    [/code]
    hacen que la imagen quede en blanco y negro y solo quedaran las letras ;)

  8. Bypass a Captcha de Servel.cl : Felipe Barriga Richards Noviembre 6, 2009 @ 4:20 pm

    [...] http://www.sinfocol.org/2008/08/de-captchas-y-otros-demonios/ [...]

  9. kagure Noviembre 16, 2009 @ 12:46 am

    No he podido hacer que me quede en blanco y negro siempre me queda en negro jejeje gracias cualquier ayuda.

  10. Sysroot Noviembre 16, 2009 @ 6:41 pm

    Si no te funciona el script tenes la alternativa de hacerlo con el programa djpeg de la siguiente forma, así te evitas el paso en el que tienes que convertir la imagen de colores a negro.

    djpeg -grayscale captcha_break2.jpg captcha_break2.pnm

    Con ese comando es como si estuvieras usando el script y al mismo tiempo convirtiendo la imagen de jpeg a pnm, la cual será usada con gocr. El único inconveniente que veo con él, es que está convirtiendo la imagen de colores a escala de grises.

    Si queres podes descargar un paquete que contiene varias utilidades para trabajar con imágenes llamado imagemagick, usando el programa "convert" que se encuentra en él, podes convertir la imagen a blanco y negro de esta forma:


    convert -monochrome captcha_break2.jpg captcha_break2.pnm

Deja un comentario