[+]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.