[+]Topic: Paper [+]Von: Perforin [+]Return: Paper
DaRk-CoDeZDaRk-CoDeZDaRk-CoDeZDaRk-CoDeZ DaRk- DaRk- CoDeZ Pick the Cat Captcha CoDeZ Trust my Technolust! :) DaRk- breaking DaRk- CoDeZ by Perforin CoDeZ www.vx.perforin.de.vu DaRk- DaRk- www.DarK-CodeZ.com DaRk-CoDeZDaRk-CoDeZDaRk-CoDeZDaRk-CoDeZ <1> ______Intro______ Ja, hallo und willkommen in meinem Tutorial wie man sogenannte "Pick the Cat" Captchas umgehen kann. Das beste daran ist, wir kommen ganz ohne OCR Software aus =) Also, was werdet ihr nun hier erfahren? Hier bekommt ihr die Anleitung wie man sowas umgehen kann und dazu gebe ich noch ein Beispiel Code ab. Jedoch ist dieser Code nur genau auf meine Testseite "http://tinyurl.com/67pfxo" zugeschnitten! Erwartet nicht dass ihr hier einen funktionsfähigen Code findet um z.B vbulletin Boards zu spammen. <2> ______How_to______ Wie oben schon gesagt kommen wir ganz ohne OCR Software aus.Die ganze Idee hinter dieser Methode ist einfach die, dass wir die Bilder die zur Auswahl stehen herunterladen, sie anschliessend per Checksumme zu überprüfen und dann mit einer kleinen Datenbank abzugleichen. Dies ist sogar sehr effektiv da die meisten Board Betreiber nur die standart Bilder nehmen die man zum Beispiel bei vbulletin sofort dazu bekommt.Um unsere Datenbank nun aufzubauen müssen wir für jedes dieser Bilder, die Checksumme berechnen und diese speichern. Etwa in diesem Format: Katze:d27f8307d4548653d85b983d11ed3c27 Hund:f9446816127cb98667e7b97f0e362dd1 Fisch:1acf2d3261faaa95b21301fecbc379d4 Wenn dieser Schritt gemacht wurde, müssen wir uns noch ein Skript/Prog schreiben dass auf unser gewünschtes Ziel connected und dann: - Herrausfindet, welches Bild ausgewählt werden soll (Katze,Hund,Fisch etc). - Die angezeigten Bilder herunterläd, die Checksumme prüft und sie mit unserer Datenbank vergleicht. Haben wir unsere benötigten Informationen können wir nun dem gewünschtem Link folgen und haben somit die Barriere des "Pick the Cat" - Captcha überwunden.Dies kann man mit der simplem POST Methode machen. <3> ______Beispiel_Code______ Ich hab hier einen Beispiel Code in Perl, der wie auch schon oben erwähnt wurde, nur speziell an meine Testseite angepasst wurde! ------------------------------------------------------------------------->8 #!/usr/bin/perl # Pick the Cat - Captcha Breaker by Perforin use IO::Socket::INET; use Digest::MD5 qw(md5 md5_hex md5_base64); ($Target,$Path) = @ARGV; ($cat,$dog,$fish) = ("d27f8307d4548653d85b983d11ed3c27","f9446816127cb98667e7b97f0e362dd1","1acf2d3261faaa95b21301fecbc379d4"); if (length($Target) eq 0) { print <<"HLP"; -------------------------------- captcha_breaker.pl URL PATH -------------------------------- HLP exit; } print <<"STG1"; -------------------------------- "Pick the cat" - Captcha Breaker -------------------------------- STG1 $sock = new IO::Socket::INET(PeerAddr => "$Target", PeerPort => 80, Proto => 'tcp', Timeout => 2) || die "[-] Connection refused!\n"; print "[+] Connected\n"; print $sock "GET $Path HTTP/1.1\r\n"; print $sock "Host: $Target\r\n"; print $sock "User-Agent: Mozilla/5.0 (BeOS; U; BeOS X.6; en-US; rv:1.7. Gecko/20070421 Firefox/2.0.0\r\n"; print $sock "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"; print $sock "Connection: close\n"; print $sock "\r\n\r\n"; print "[+] Sending request\n"; open(TMP,">","t3mp.tmp"); while(<$sock>) { $_ =~ tr/"/\n/; print TMP $_; } close(TMP); open(TMP,"<","t3mp.tmp"); while () { if (m/\w+\.png/) { push(@Images_crawl,"$&"); } } close(TMP); print "[+] Image links received\n"; foreach $Image (@Images_crawl) { $counter++; $sock1 = new IO::Socket::INET(PeerAddr => "$Target", PeerPort => 80, Proto => 'tcp', Timeout => 2) || die "[-] Connection refused!\n"; print $sock1 "GET $Path$Image HTTP/1.1\r\n"; print $sock1 "Host: $Target\r\n"; print $sock1 "User-Agent: Mozilla/5.0 (BeOS; U; BeOS X.6; en-US; rv:1.7. Gecko/20070421 Firefox/2.0.0\r\n"; print $sock1 "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"; print $sock1 "Connection: close\n"; print $sock1 "\r\n\r\n"; binmode($sock1); print "[+] Downloading Image $counter\n"; open(IMG,">","$Image"); binmode(IMG); while(<$sock1>) { if (m/^HTTP\/1.1/) { $_ =~ s/$_//; } elsif (m/^Date:/) { $_ =~ s/$_//; } elsif (m/^Server:/) { $_ =~ s/$_//; } elsif (m/^Last-Modified:/) { $_ =~ s/$_//; } elsif (m/^ETag:/) { $_ =~ s/$_//; } elsif (m/^Accept-Ranges:/) { $_ =~ s/$_//; } elsif (m/^Content-Length:/) { $_ =~ s/$_//; } elsif (m/^Connection:/) { $_ =~ s/$_//; } elsif (m/^Content-Type:/) { $_ =~ s/$_//; } elsif (m/^\s\n/) { $_ =~ s/$_//; } else { print IMG $_; } } close(IMG); } $sock2 = new IO::Socket::INET(PeerAddr => "$Target", PeerPort => 80, Proto => 'tcp', Timeout => 2) || die "[-] Connection refused!\n"; print $sock2 "GET $Path HTTP/1.1\r\n"; print $sock2 "Host: $Target\r\n"; print $sock2 "User-Agent: Mozilla/5.0 (BeOS; U; BeOS X.6; en-US; rv:1.7. Gecko/20070421 Firefox/2.0.0\r\n"; print $sock2 "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"; print $sock2 "Connection: keep-alive\n"; print $sock2 "\r\n\r\n"; while(<$sock2>) { if (m/^Please pick the/i) { if (m/cat/i) { $fWORD = "cat"; } elsif (m/dog/i) { $fWORD = "dog"; } elsif (m/fish/i) { $fWORD = "fish"; } else { print "[-] Could not read the word!\n"; exit; } print "[+] Image to click: $fWORD\n"; } } foreach $picture (@Images_crawl) { open(TMP,"<","$picture") || die "[-] Something went wrong!"; binmode(TMP); if ($fWORD =~ m/cat/) { $digest = Digest::MD5->new->addfile(*TMP)->hexdigest; if ($digest =~ $cat) { print "[+] Captcha cracked: First picture to click!\n"; exit; } } elsif ($fWORD =~ m/dog/) { $digest = Digest::MD5->new->addfile(*TMP)->hexdigest; if ($digest =~ $dog) { print "[+] Captcha cracked: Second picture to click!\n"; exit; } } elsif ($fWORD =~ m/fish/) { $digest = Digest::MD5->new->addfile(*TMP)->hexdigest; if ($digest =~ $fish) { print "[+] Captcha cracked: Third picture to click!\n"; exit; } } else { print "[-] Could not crack the Captcha!\n"; exit; } close(TMP); } ------------------------------------------------------------------------->8 Dazu sollte man noch folgendes wissen: - Bei meiner Testseite befinden sich die Bilder immer an der selben Position, dass dies aber bei vielen Seiten anders ist, sollte bekannt sein! - Ich sende wenn das Captcha gecrackt wurde, anschliessend nichts per POST an den Server, da das Captcha dort auch nicht wirklich einen Sinn hat, und eben nur fürs Vorführen gedacht ist. - Perl rockt. <4> ______Outro______ Hier nochmal in Kurzform was zu tun ist: 1) Datenbank anlegen 2) Skript/Prog schreiben das die benötigten Infos ausliest und die Bilder herunterläd 3) Die Checksumme dieser einzelnen Bilder werden mit unserer Datenbank verglichen 4) Skript/Prog sendet per POST unsere gesammelten Daten an den Server damit wir somit z.B einen User anlegen können. Ich hoffe ich konnte euch somit helfen oder euch nen Denkanstoss verpassen ;) Wer fragen diesbezüglich hat, kann mir gerne eine Mail an perforin[ät]hackermail[d0t]com senden! Grüsse an: SkyOut von Wired-Security, sowie an Sph1nX, Neo2k8, ringwrath-4, thejanky und den ganzen Rest von DarK-CodeZ sowie natürlich an alle VX´er und die die mich kennen.