"גוגל האקינג" הוא השם שניתן לתהליך של מציאת, חיפוש ויישום שאילתות חיפוש מורכבות יחסיות במנוע החיפוש גוגל. מה שמייחד את השאילתות הללו הוא שלרוב הם יפנו את הגולש לאתרים שבהם מצויים חורי אבטחה כלשהם. בחלק מהמקרים, באתרים שרמת האבטחה בהם לקויה במיוחד, גוגל מסוגל להגיע אפילו לקבצי הסיסמאות של האתר.
את המונח "גוגל האקינג" הטביע בחור חביב בשם ג’וני לונג, שגם מתחזק כרגע את ה-"גוגל האקינג דאטאבייס", או GHDB בקיצור. כתובת האתר שלו:
http://www.johnny.ihackstuff.com/ghdb.php
הבעיה:
נבירה קצרה בקישור שנתתי למעלה תעלה קרוב ל-14 קטגוריות שונות שביחד מכילות כמה מאות שאילתות שונות. בהנחה שתוקף מסויים ירצה לסרוק אתר ספציפי אחד בעזרת כל השאילתות הללו, חיפוש ידני הוא בטח לא התשובה. בדיוק מהסיבה הזאת כתבתי את ה-Ghacker. מדובר בתוכנית בשפת פרל שבעיקרון כל מה שהיא עושה זה לאחזר את רשימת השאילתות מהמסד ולהריץ אותן, אחת-אחרי-השניה, כנגד אתר מסוים (שם האתר מועבר לתוכנית כפרמטר שורת פקודה).
בלי להתברבר יותר מידי, הנה הקוד:
קוד:#!/usr/bin/env perl
#####
##### [ Required Modules ] #####
use strict;
use warnings;
use diagnostics;
use constant GHDB => ’http://johnny.ihackstuff.com/’;
use Getopt::Long;
use LWP::Simple;
use LWP::UserAgent;
use HTML::TreeBuilder;
use Net::Ping;
##### [ Main Script ] #####
print "Starting Ghacker 1.0 at ", scalar(localtime), "\n";
my %options = ( );
GetOptions("h|help" => \$options{help},
"site=s" => \$options{site},
"logfile=s" => \$options{logfile},
"browser=s" => \$options{browser},
"timeout=i" => \$options{timeout},
);
&show_help if ($options{help} || ! $options{site});
$options{logfile} ||= "ghacker-$options{site}.txt";
$options{browser} ||= "Ghacker/1.0 ($^O)";
$options{timeout} ||= 20;
$| = 1;
open(LOG, ">$options{logfile}");
print LOG "Scan result for target [$options{site}]:\n\n";
my $content1 = get(GHDB . ’/ghdb.php’);
my $parser1 = HTML::TreeBuilder -> new_from_content($content1);
my @categories = $parser1 -> look_down(’_tag’, ’a’,
’href’, qr/function=summary/,
);
foreach ($categories[9]) { # foreach (@categories) { ... }
my $content2 = get(GHDB . $_ -> attr(’href’));
my $parser2 = HTML::TreeBuilder -> new_from_content($content2);
my @links = $parser2 -> look_down(’_tag’, ’a’,
’href’, qr/function=detail/,
);
my @queries = ( );
foreach (@links) {
my $content3 = get(GHDB . $_ -> attr(’href’));
my $parser3 = HTML::TreeBuilder -> new_from_content($content3);
my $query = $parser3 -> look_down(’_tag’, ’a’);
push(@queries, $query -> as_text);
}
&run_queries(@queries);
}
close(LOG);
##### [ Defined Subroutines ] #####
sub show_help {
print <<EOM;
Ghacker 1.0 usage: perl $0 [proxy-file *] --site=[site-url] <Options>
Options are:
-h | --help: show this run manual page
--browser=[user-agent]: identify as browser [user-agent]
--timeout=[timeout-seconds]: set the timeout [timeout-seconds]
* if [proxy-file] not given, read proxy list from STDIN
EOM
exit(0);
}
sub run_queries {
my $browser = LWP::UserAgent -> new(agent => $options{browser},
timeout => $options{timeout},
max_redirect => 0,
);
$browser -> default_headers -> push_header(’Referer’ => ’http://www.google.com/’);
while (my $q = shift) {
$browser -> proxy([’http’, ’https’], &set_proxy);
my $response = $browser -> get(’http://www.google.com/search?btnI=&q=’ . $q . " site:$options{site}");
if (index($response -> status_line, ’302’) != -1) {
print LOG $q, "\n";
}
}
}
sub set_proxy {
my $ping = Net::Ping -> new(’icmp’);
my($ip, $port) = split(’:’, <>);
until ($ping -> ping($ip)) {
printf "Host %-15s is dead. Moving on...\n", $ip;
($ip, $port) = split(’:’, <>);
}
$ping -> close;
chomp($port);
"http://$ip:$port";
}
כמה הבהרות שיש לי בקשר לקוד:
1. מדובר בגרסה ניסיונית. למעשה, רוב הסיכויים שהיא לא תעבוד אם תשימו אותה במבחן אמיתי.
2. יש לה כמה בעיות חמורות מאוד שדורשות פיתרון מיידי. נכון לעכשיו, לתוכנית אין שום דרך לשחזר את רשימת שרתי הפרוקסי לאחר שהיא עברה עליה בפעם הראשונה. חוץ מזה, גוגל מצליח למרות שרתי הפרוקסי לאתר את המקור של הבקשות ולאחר לאחר מספר מסוים של שאילתות התוכנית נחסמת (גוגל מונע ממנה גישה לדף החיפוש).
אז מה אני כן צריך מכם?
במידה ואתם מסוגלים להציע פיתרון לאחת מהבעיות שהצגתי בסעיף הקודם - אני אשמח (ואני אשמח אפילו עוד יותר אם תצליחו לפתור לי את שתיהן).
עוד דבר שאני זקוק לו הוא הערות על סגנון הקידוד, הצעות לפיצ’רים וכדומה. חוץ מזה, אני מתכנן להתחיל בקרוב את הכתיבה של מעטפת גרפית לתוכנית הזאת, ואם יש עוד מתכנת פרל כאן שיודע קצת לעבוד עם המודול Tk אני אשמח לקצת עזרה.
תודה והמשך יום טוב.[ההודעה נערכה על-ידי MasterBlaster ב-29/04/2008 19:21:32]