Tecnologia e Digital Hacks
23-09-2008

Captcha for Spammers

Introduzione

Il termine captcha (o HIP, Human Interactive Proofs) deriva dall'inglese "completely automated public Turing test to tell computers and humans apart" (Test di Turing pubblico e completamente automatico per distinguere computer e umani). Quello che fa, cioé, è controllare se determinate operazioni sono effettuate da una computer (in gergo "bot") anziché da un umano, eventualmente bloccandole in caso di fallimento. I captcha, ad esempio, sono spesso usati per moderare i commenti o le iscrizioni al forum, per evitare spam. Oppure in campi di ricerca ed altre operazioni, per limitare il carico nei database e nei server o bloccare tentativi di brute forcing. In questo articolo voglio approfondire questa tematica affrontandola nel modo più ampio possibile. Parlerò delle tipologie e dei pregi e dei difetti di ognuna. Ci sarà una sezione relativa alla decifrazione e una all'implementazione nel nostro software.

Tipologie dei captcha testuali

La varietà di captcha testuali è veramente impressionante. Di seguito ne riporto una buona panoramica con qualche descrizione:
Origine Esempio Commento
Authimage Debolezze: font non variabile, glifi allineati, posizione dei glifi costante, rotazione costante, nessuna deformazione, background fisso, colori costanti, nessuna perturbazione. Sito di riferimento: http://www.gudlyf.com/index.php?p=376Clubic
Debolezze: font non vareiabile, nessuna rotazione, nessuna deformazione, glifi allineati, background fisso, debole variazione nel colore, debole perturbazione.
linuxfr.org Debolezze: font non variabile, glifi allineati, nessuna rotazione, nessuna deformazione, debole variazione di colore, debole perturbazione.
LiveJournal? Debolezze: font non variabile, posizione costante dei caratteri.
lmt.lv Debolezze: font costante, glifi quasi allineati, nessuna rotazione, nessuna deformazione, sfondo fisso, nessuna variazione di colore, debole perturbazione.
Ourcolony Debolezze: font costante, nessuna rotazione, nessuna deformazione, nessuna variazione di colore, nessuna perturbazione.
Paypal Debolezze: font non variabile, glifi quasi allineati, nessuna rotazione, nessuna deformazione, background costante, nessuna variazione di colore, nessuna perturbazione addizionale.
phpBB Sito di riferimento: http://www.phpbb.com/ Debolezze: font costante, nessuna rotazione, nessuna deformazione, colori costanti, debole perturbazione.
Scode and derivatives Sito di riferimento: http://james.seng.cc/archives/000145.html Debolezze: al massimo 3 font diversi, nessuna rotazione, nessuna deformazione, debole variazione nei colori, perturbazione non efficace (basta separare le chiavi di colore).
Slashdot Debolezze: font costante, nessuna deformazione, colori costanti, debole perturbazione.
vBulletin Sito di riferimento: http://www.vbulletin.com/ Debolezze: font costanti, glifi in posizione fissa, nessuna rotazione, nessuna deformazione, colori quasi costanti, debole perturbazione.
Xanga Debolezze: posizione orizzontale dei glifi fissata, nessuna rotazione, nessuna deformazione, colori costanti, perturbazione insufficiente.
Drupal Debolezze: glifi allineati, nessuna deformazione, perturbazione insufficiente, font costanti.
Trencaspammers Debolezze: posizione orizzontale dei glifi fissata, font costante,colori costanti, nessuna deformazione.
20six Captcha estremamente debole, perturbazioni facilmente rimovibili.
Authimage (3) Un captcha molto molto buono, ma non sempre facile da risolvere per un umano.
CFXCaptcha Il captcha perfetto =) (per ora).
Clearscreen Debole perturbazione, ma interessante uso di caratteri non alfanumerici.
EZ-Gimpy (eg. Yahoo! Briefcase) Sconfitto agevolmente.
Hoke Captcha molto debole.
.Mac Un captcha debole che non sempre è facile da risolvere da un umano.
ICQ Un captcha relativamente buono che utilizza una larga varietà di sfondi e fonts.
IMDb Un buonissimo captcha con una buona implementazione ma un piccolo dizionario.
MS MVPS Sconfitto dall'AI captcha.
MVN Forum Un captcha relativamente buono che utilizza una larga varietà di sfondi e fonts.
Passport Un captcha molto buono, ma spesso difficile da risolvere per un uomo.
Pichan Un captcha all'apparenza facile da risolvere.
Screenname Un capthca relativamente buono che utilizza una grande varietà di sfondi, fonts e deformazioni.
Yahoo! Un captcha molto buono, ma non sempre facile da risolvere per un uomo.
ReCaptcha Captcha relativamente buono, ma dipende moltissimo dal caso. La perturbazione rimane irrisoria. In compenso ottima rilevazione ip sospetti.
Mailblocks Un captcha abbastanza buono, anche se non abbastanza perturbato.
Gmail Nessuna perturbazione. Buon disallineamento. Già sconfitto.
Register.com Captcha molto facile da risolvere. Bassa perturbazione, font fisso.

Attacco ai captcha

Esistono molti modi per implementare un decodificatore di captcha. Molti ad esempio si appoggiano su programmi perl o php che permettono di girare sui più comuni webserver e spesso vengono inseriti in hosting bacati, assieme a quelli di spam comune. Addirittura si trovano dei servizi online, come quello di CaptchaKiller.com, che permette, pur con alcune limitazioni, di decifrare i propri captcha (alcuni sospettano che si appoggi anche ad un servizio di decoding umano). Il suo scopo è nobile: aumentare l'accessibilità della rete.

Breve approfondimento sull'accessibilità

Infatti l'utilizzo dei captcha spesso pregiudica l'accesso o la fruizione veloce dei contenuti alle persone che soffrono di cecità. Per questo spesso vengono associati dei file audio con il suono o la pronuncia dei caratteri del captcha. Purtroppo anche questo pregiudica la fruizione a chi soffre sia di cecità che di perdita dell'udito. Ultimamente per assolvere ad entrambi questi problemi si fa largo uso dei cosidetti MAPTCHA, cioé captcha matematici che propongono domande come "Cosa fa 1+1" (e più complicate, con frazioni, ecc.), oppure domande di senso comune, come "Di che colore è il cielo". Certo che risulta difficile fornire una grossa varietà di domande. Il W3C, World Wide Web Consortium, ha creato un ottimo documento (in Inglese ma di facile interpretazione) che spiega le difficoltà, le limitazioni e le soluzioni per l'accessibilità dei turingtest (in particolare l'autenticazione tramite pin o altri sistemi). Ve ne consiglio la lettura [7].

Cosa deve saper fare un captcha decoder

Informazioni tratte da [6],[9],[10],[12] e altre fonti (wikipedia inglese, ecc.). Un captcha decoder rappresenta una delle molte sfide di Artificial Intelligence attuali. Per decodificare un captcha i passi principali sono solitamente questi:
  • Pulizia: rimozione delle linee e del rumore sullo sfondo.
  • Segmentazione: divisione dell'immagine in regioni conenenti ciascusa un singolo carattere.
  • Classificazione: identificare il carattere in ciascuna regione.
C'é da dire, però, che alcuni preferiscono un approccio olistico sull'immagine intera. In particolare l'algoritmo B descritto in [10] utilizza questa tecnica, seppure richieda un maggiore costo computazionale vista la maggior dimensione dei modelli. Essa infatti ha un maggior potere descriminante visto che è possibile confrontare aree più grandi.
Per quanto riguarda alcuni esempi potete leggere velocemente l'articolo generale [9].
Pulizia
Un banale primo passo per la pulizia dell'immagine, ad esempio, può essere la trasformazione della stessa in bianco e nero.
In php potremmo usare una funzione di questo tipo (ripresa da qui):
function convertJPEGtoMonochromeGIF( $infile, $outfile ) {
        list($width, $height) = getimagesize($infile);
        $source = imagecreatefromjpeg($infile);
        $bwimage= imagecreate($width, $height);

        $paletteBlack = imagecolorallocate( $bwimage, 0, 0, 0 );
        $paletteWhite = imagecolorallocate( $bwimage, 255, 255, 255 );

        for ($y=0;$y<$height;$y++)
        for ($x=0;$x<$width;$x++)
        {
                $rgb = imagecolorat($source,$x,$y);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;

                $gs = (($r*0.299)+($g*0.587)+($b*0.114));
                if ( $gs > 150 )
                        imagesetpixel($bwimage,$x,$y,$paletteWhite);
                else
                        imagesetpixel($bwimage,$x,$y,$paletteBlack);
        }
        imagegif( $bwimage, $outfile );
}

Segmentazione

Sicuramente l'operazione attualmente più difficile a livello di intelligenza artificiale. Con captcha come quello di Mailblocks è necessario anche saldare le parti in comune tra le lettere. E' la parte del riconoscimento che più deve essere aggiustata tra captcha e capthca, oltre che quella che richiede un maggiore numero di calcoli da parte del processore. Ad esempio in [12] si controlla il cambio di colore nella riga media orizzontale dell'immagine per separare i caratteri.

Classificazione

Solitamente effettuata per comparazione di forme ed affidata a reti neurali. Ovviamente risulta proibitivo utilizzare un database contentente le possibili deformazioni su cui fare un confronto. Il metodo preparato da Mori ([10]) specifica ad esempio due fasi:
  • Scrematura veloce: data un'immagine, trovare velocemente un set di possibili forme candidate da accoppiare al carattere della regione prese da un database potenzialmente molto grande di forme.
  • Confonto dettagliato: una volta che si ha un piccolo set di forme candidate, si può effettuare una più pesante ed accurato procedura di confronto per trovare la forma che più combaciano con quella del carattere della regione.
Per descrivere le caratteristiche di ogni punto nella forma (vedi disegno a destra) si può associare un vettore tangente di lunghezza unitaria, che rappresenta la direzione nel punto. Sommando le distanze quadratiche si possono creare delle forme generalizzate da inserire nel database per i confronti (effettuati con i diagrammi circolari logaritmici visibili in figura (c) ). Alla fine basta cercare la forma a minore distanza da quella rappresentata nell'immagine della regione. Nella scrematura veloce per effettuare il confronto si scelgono r punti casuali dall'immagine. Nel confronto dettagliato invece si controlla il costo delle trasformazioni necessarie per far combaciare i template con l'immagine. Alla fine si sceglie il template con il costo minore. Un altro metodo efficace si basa sull'hashing geometrico, con una misura molto più leggera di distanze e posizioni. Un esempio di facile comprensione è rappresentato dai molti captcha decoder php presenti online (ad esempio [16] di cui trovate uno spezzone di codice qui).

Passiamo alla pratica

Per fare un po' di pratica ho cercato alcuni programmi appositamente sviluppati per risolvere captcha. La mia scelta è caduta su PWNtcha ([1]), sebbene sia un po' vecchiotto. Altre tecniche utilizzano OCR di vario tipo, come Conjecture (usatissimo per questi scopi, aggiornato, open source [14] e derivato da GOCR [13] di cui trovate una guida veloce all'utilizzo qui) oppure Pegasus (a pagamento ed associato a Captcha Killer 1.8 / 2.0 usato da molti perché su ambiente windows e di semplice utilizzo per il bruteforce di account ecc.). Per quanto riguarda le implementazioni via PHP saranno trattate con maggiore riguardo in un prossimo articolo (vedi immagine per il php learning di AlixAxel).

PWNtcha

Con PWNtcha la creazione di un sistema ad hoc per decodificare un determinato captcha è davvero semplice a livello di programmazione. Preferisco però non aggiungere maggiori dettagli (se non l'ha fatto il suo programmatore probabilmente è meglio così =D). Possiamo però vederlo all'opera su moltissimi dei captcha esistenti. Installiamo le librerie SDL_image indispensabili per il funzionamento tramite Synaptic (su Uby). Per installare PWNtcha scarichiamolo dal repository ed installiamolo (privilegi di root necessari) con:
svn co svn://svn.zoy.org/libcaca/pwntcha/trunk pwntcha
./bootstrap ./configure make make install
Bene ora PWNtcha risulta installato. Per vederlo all'opera con un'immagine che appartiene al gruppo sconfitto. Cerco una vittima casuale (a cui non ho fatto niente :P e la trovo in un normale blog Lifetype con Authimage). Scarico il captcha. Digito ./pwntcha INDIRIZZO IMMAGINE (impostando la cartella di share dentro src) e il captcha viene decodificato correttamente.

Aziende che se ne occupano

Esistono vere e proprie aziende (principalmente in India) che si occupano di captcha solving, umanamente e non e a prezzi irrisori (2€ circa per 1000 captcha). Alcune (le trovate ad esempio in queste richieste al famoso GetFreeLancer https://www.getafreelancer.com/projects/Data-Processing-Data-Entry/CAPTCHA-TEAM.html o http://www.getafreelancer.com/projects/Data-Processing-Data-Entry/Data-Entry-Solve-CAPTCHA.html) come http://dataentry.sbgc.in/services.php. Per farvi un'idea visitate questo articolo su zdnet: http://blogs.zdnet.com/security/?p=1835. Peraltro spesso gli spammer hanno dei siti in cui inseriscono captcha prelevati da varie fonti che poi fanno risolvere agli stessi ignari visitatori.

Captcha non testuali

Da Wikipedia.
Un altro tipo di tecnica che si sta sviluppando negli ultimi anni, è quella di realizzare dei test, basati sul riconoscere all'interno di un'immagine particolarmente familiare una faccia. Per questo tipo di CAPTCHA si parla di RTT based on faces recognition. In letteratura allo stato attuale sono stati implementati soltanto due metodi basati su questo tipo di CAPTCHA: l'ARTiFACIAL e un CAPTCHA basato sul face recognition. Dati i loro risultati, rispetto ai CAPTCHA text-based, ben presto prenderanno piede nel web. Non è obbligatorio ricorrere a tecniche visive; qualunque problema di intelligenza artificiale che abbia lo stesso grado di complessità, ad esempio il riconoscimento vocale, è adatto a fare da base per un test di questo tipo. Alcune implementazioni consentono all'utente di scegliere in alternativa un test basato su tecniche auditive, anche se tale approccio ha subito uno sviluppo più lento e non è detto che possieda lo stesso grado di efficacia di quello visivo. Inoltre, è possibile ricorrere ad altri tipi di verifiche che richiedano un'attività di comprensione testuale, quali la risposta a una domanda o a un quiz logico, il seguire delle specifiche istruzioni per creare una password, eccetera. Anche in questo caso i dati sulla resistenza di tali tecniche alle contromisure sono scarsi.

Qualche implementazione

Un captcha vincente, come abbiamo visto, è quello che rende il più possibile complicato il processo di segmentazione. Un esempio: Seppur possa sembrare complicato, a tutti gli effetti una persona riesce a risolvere agilmente questo tipo di captcha. Certo non possiamo arrivare a HIP di questo tipo: Attualmente mi sento di consigliare queste implementazioni:

ReCaptcha

http://recaptcha.net/ Per chi non ha bisogno di captcha estremamente robusti, ma conta alla semplicità di lettura e ad una buona accessibilità. Il captcha presenta inoltre notevoli perturbazioni casuali, non facilitando il lavoro del decoder. Per finire risulta un notevole servizio sociale visto che permette la digitalizzazione di molti testi.

OpenCaptcha

Personalmente utilizzo spesso OpenCaptcha, per la facilità di personalizzazione e poi di lettura da parte dell'utente. Facile da sconfiggere, ma non se personalizzato a dovere.

FreeCap

Altro captcha che consiglio, ottima distorsione. Facilità di lettura impressionante. Lo trovate qui.

Altri ancora

Ci sono molte altre implementazioni. Ora avete le conoscenze per giudicare un buon captcha da un cattivo captcha.

Conclusione

Spero che questo articolo abbia scatenato il vostro interesse. Avere in mano la possibilità di decifrare i captcha è un'arma potentissima nel web. In definitiva permette di indirizzare una gigantesca mole di utenti verso contenuti di nostra scelta. Oppure di armarsi di bruteforce e simili per ottenere l'accesso a molte pagine. Per questo sto creando una trilogia di articoli, di cui questo è il primo, che spero potrà interessarvi. Come sempre, spero non utilizzerete queste informazioni per scopi poco etici bensì per aumentare la sicurezza dei form e la conoscenza sul mondo dell'AI. Alla prossima.

Sitografia sparsa

  1. http://libcaca.zoy.org/wiki/PWNtcha - Ottimo progetto open source di captcha decoding.
  2. http://www.captchakiller.com/ - Servizio online di captcha decoding.
  3. http://en.wikipedia.org/wiki/CAPTCHA - Wikipedia inglese sui captcha.
  4. http://it.wikipedia.org/wiki/CAPTCHA - Wikipedia italiana sui captcha.
  5. http://recaptcha.net - Progetto ReCaptcha per la scannerizzazione di testi online tramite i captcha.
  6. http://www.cs.sfu.ca/~mori/research/gimpy/high_level.html - Il lavoro di Greg Mori e colleghi sulla decifrazione di ez-gimpy.
  7. http://www.w3.org/TR/turingtest/ -Documento W3C sui Turing Test e la loro accessibilità.
  8. http://captchas.net/ - Uno dei molti servizi di captcha online (peraltro con audio poliglotta in italiano :D).
  9. http://research.microsoft.com/~kumarc/pubs/chellapilla_nips04.pdf - Documento sul captcha solving.
  10. http://www.cs.sfu.ca/~mori/research/papers/mori_cvpr03.pdf - Documento sul captcha solving.
  11. http://www2.parc.com/istl/projects/captcha/history.htm - Storia del captcha (per chi vuole saperne di più).
  12. http://www.brains-n-brawn.com/default.aspx?vDir=aicaptcha - Documento di captcha solving basato su AI.
  13. http://jocr.sourceforge.net/ - OCR Framework (obsoleto).
  14. http://www.corollarium.com/conjecture/ - OCR Framework.
  15. http://www.elancetalk.com/decaptcha.php - Captcha decoder online.
  16. http://www.alixaxel.com/wordpress/2007/06/15/php-captcha-decoder/ - Semplice captcha decoder in php di Alix Axel.
  17. http://sourceforge.net/projects/phpocr/ - PHP decoder abbastanza potente con poche perturbazioni.
  18. http://www.phpclasses.org/browse/package/2874.html - Classe PHP per decodificare captcha molto semplici.
  19. http://www.blackhat-seo.com/2008/how-to-break-captchas/ - Alcuni link utili.
  20. http://crypto.stanford.edu/~pgolle/papers/dogcat.pdf - Attacco all'Asirra Captcha
Un ringraziamento va a Zedor per la sua disponibilità.

8 Commenti a “Captcha for Spammers”

  1. Zedor scrive:

    Ottimo articolo! Soprattutto per la ricca bibliografia. Sono rimasto sconvolto dalle aziende di human-solving XD Certo che in India fanno proprio di tutto... Aspetto i restanti capitoli della trilogia! ;-)

  2. Nick scrive:

    @Zedor Ti ringrazio. Si è vero. Sono pericolosi. Aggiungo un articolo appena trovato sulla cattiva implementazione dei captcha su hotmail =D http://blackhatseo-blog.com/hotmail-captcha-extraction

  3. Aricolo complet sui captcha - Caputo’s Blog - Tecnologia, web, papertoy e papercraft scrive:

    [...] ARTICOLO Potresti trovare interessanti anche gli articoli:Vari script per PHP [...]

  4. Sam scrive:

    Article about hack captcha http://network-security-research.blogspot.com/2008/08/around-captcha.html

  5. Nick scrive:

    @Sam Grazie per il link..Molto interessante.. Thanks for the link..Very very interesting.. =D

  6. Nick scrive:

    Interessantissimo documento sul captcha breaking di google (gmail et similarities) http://securitylabs.websense.com/content/Blogs/2919.aspx

  7. eric scrive:

    Captcha Entry sites are everywhere like http://www.beatcaptchas.com

  8. Slack scrive:

    Sotto ubuntu non riesco ad installarlo..Dov\'è che trovo queste librerie SDL_image?? GRazie a chi mi risponde