fYt
09.02.2007, 14:33
Брутальная простота
Из этой статьи Вы подчерпнёте полезную информацию относительно того, как следует обходиться с разнообразными дампами бд. В частности, дампами форумов. А кто ещё совсем маленький и неопытный, узнает много всего интересного и познавательного - в бруте ничего сложного нет, нужно только не промахиваться мимо кнопочек. Я дам несколько действенных советов относительно брута хэшей и посоветую тем кто недопёр сам, что и как брутить. И также экслюзивно для читатейлей журнала и специально для журнала Xakepy.ry выложу скрипт, написанный для работы с базами. Оговорюсь, что для успешного применения всего, описанного ниже, понадобятся следующие инструменты:
- PHP 4.3.3 и выше
- Passwords Pro, есть такой программ полезный
- руки и голова в полном боекомплекте
Итак, допустим Вы каким-то образом заполучили дамп базы данных. И причём не один :-D (нет и не два), а целую кучу. Упустим каким именно образом. Пусть это будут дампы форумов. Причём дампы таблицы пользователей (ну а что ещё то надо? ). При обретении сего полезного кладезя данных перед Вами сразу встаёт один из двух возможных путей:
а) кудаб загнать всё это добро
б) чем бы разложить все эти кучи одинаковых баз данных по полочкам для дальнейшего
1) брута админских, асечных, и мыльных паролей
2) сортировки по мыльным базам в зависимости от содержания сайта/форума (мало ли Вы злобный спамер или крабер).
Ни для кого думаю не является открытием, что пароль на форуме и пароль на мыле или номере аськи совпадает у 70% пользователей. Ведь тогда надо для каждого форума придумывать новый отдельный пароль, а их надо записывать или запоминать, а это так лениииво.. Что можно получить от асек и мыл? Ну пфф, кто ещё не догадался, перечислю:
- сами базы мыл, особенно если на форуме зарегистрировано много пользователей, можно использовать/загнать как базы для спама, причём тематические (ясно что на автомобильном форуме в основном будут регистрироваться люди, которым интересна данная тема).
- сбрученные мыла можно использовать/загнать под спам (именно для отправки спама через них), только было бы неплохо проверить сначала их на предмет валидности (около 15-20% всё равно отсеятся). Но многопоточный скрипт для проверки мыл пардон я Вам выкладывать не буду, уж простите ;-)
- сбрученные 6-7знаки можно использовать самому, как понравится, либо отдать в асечный магазин. Проверять аси можно IPDBrute (asechka.ru в downloads), нужно иметь только список проксей (Forum Proxy Leecher) и свободное время.
- сбрученные 8-9 знаки бывают порой очень даже красивые (xy, xyz, как вам 222272222?%) ), т.н. слоны, их тоже можно использовать или отдать в магаз/продать. Остальные же 9знаки также можно выложить/загнать под флуд.
Вот сколько перспектив перед Вами открывается =). Однако вернёмся к написанному выше. С пунктом а) думаю Вы сами решите как быть, если Вам самим влом разбираться с базами, а по второму пункту я продолжу повествование дальше. Не правда ли, было бы крайне неплохо привести все имеющиеся дампы в вид всего пары файлов со всеми хэшами для дальнейшей отправки на брут в ПассворсПро, причём отсортировать всё по роду вашей деятельности (аськи, мыла, пассы админов), убирая всё лишнее, имея возможность выбрать, в каком порядке всё сортировать. Ведь не разбирать же всё вручную!
Специально и экслюзивно, только для Вас и только сегодня (аплодисменты и крики на заднем плане) - универсальный скрипт для разбора баз данных! (слова тонут в овациях)
<?
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ xxx ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
/* Forum Dump Parser v0.2 (FDPv0.2)
/* by Re@ctor
/* http://truenet.net.ru/security/
/*
/*
/* Скрипт предназначен для частного использования и позволяет
/* привести имеющиеся дампы баз данных в единый удобный формат для
/* дальнейшего анализа в программе Passwords Pro, либо просто
/* в списки для других программ.
/*
/* Скрипт запрещается использовать в корыстных целях и автор не
/* несёт ответственности за возможный ущерб, причинённый от исполь-
/* зования данного скрипта.
/*
/* Скрипт запрещается использовать в противозаконных целях, либо
/* целях, ведущих к умышленному или неумышленному нарушению законода-
/* тельства Российской Федерации.
/*
/* Хорошего дня и доброго насроения!;-)
/* Помните про существование TrueNET! =)
/*
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ xxx ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
###### 1. выходной формат файлов ######
# для брута, формат Passwords Pro
#$sort = array('username','password','salt'); # пользователи
#$sort = array('email','password','salt'); # мыльники
$sort = array('icq','password','salt'); # аськи
# помните, что формат PPro - имя:хэш:сальт:расшифр.парол ь:комментарий
# поэтому надо писать от 2 до 3 значений, т.к. меньше или больше
# будет воспринято неверно программой.
# просто базы
#$sort = array('email'); # e-mail
#$sort = array('icq'); # icq
###### 2. формирование строк ######
$delim = "¤"; # разделитель между значениями
$br = "\n"; # чем заканчивать строку (\n - перенос строки)
###### 3. промежуточный вывод ######
$makefiles = 1; # делать ли отдельные файлы для каждого дампа
$ext = "txt"; # расширение выходного файла этих файлов
###### 4. параметры сбора информации ######
$site = 1; # если $makefiles = 0;, то получать сведения о сайте
# из титла и мета-тегов (необоходимо подключение к сети) и записывать в начало файла
# ( удобно при составлении тематических спам-баз )
# формат файла должен быть префиксАДРЕС_САЙТАрасшире ие, где префикс и расширение любые
$site_prefix = ''; # если $site=1, указать префикс файлов
$site_ext = '.sql'; # если $site=1, указать расширение файлов
$convert = 0; # конвертировать полученный текст в win-1251, если оно не в нём (отключить при багах)
###### 5. общий файл с данными ######
$hashmake = 1; # делать ли единый файл со всеми хэшами
$hash_filename = '!PasswordsPro.Hashes'; # имя файла с хэшами
###### 6. выборка из дампов админов в отдельный файл ######
$admins = 1; # сделать файл с хэшами админов дампов
$admin_pass = 'password'; # имя ячейки с хэшем пароля
$admin_salt = 'salt'; # имя ячейки с салом пароля
$admin_comment = array('username','email','icq'); # то что будет в комментарии в полях пассворс-про
$admin_filename = '!admin.PasswordsPro.Hashes';
###### 7. (WARNING!) имя первой ячейки в таблице ######
$firstintable = 'userid'; # название первой ячейки в таблице (важно!)
ini_set("max_execution_time","86400");
set_time_limit(0);
function make($value) { return preg_replace("'\'(.*?)\''i",'\\1',$value); }
function checksalt($salt) { if(strlen($salt)>3) return str_replace(array("\\\\",'\"',"\'"),array("\\",'"',"'"),$salt); else return $salt; }
function koi($txt) { return convert_cyr_string($txt,'k','w'); }
function iso($txt) { return convert_cyr_string($txt,'i','w'); }
function myau() { echo "\n\nDone!;-D\n\nNice day. Visit http://truenet.net.ru/ !\n\n"; }
$d=opendir('.');
while(($e=readdir($d))!=false) {
if($e=='.'||$e=='..'||$e==$admin_filename||$e==$ha sh_filename||$e==$argv[0]) continue;
if(is_file($e)) {
if($makefiles==1)$f = fopen("$e.$ext","w+");
echo "[+] $e (".filesize($e)." bytes)\n";
$file = file($e);
foreach($file as $a) {
$tmp = explode(' ',$a); $tablesuf=$tmp[1];
if(!$vars) { if($tablesuf==$firstintable) { $vars[]=array('name'=>$firstintable,'num'=>0); } continue; }
foreach(array_unique(array_merge($sort,$admin_comm ent)) as $s) {
if($tablesuf==$s) { $vars[]=array('name'=>$s,'num'=>count($vars)); $y=1; }
}
if(!$y) $vars[]='b'; else unset($y);
if(strstr($a,'PRIMARY KEY')) break;
}
foreach($file as $a) {
if(strstr($a,"INSERT INTO")) {
$tmp = preg_replace("'INSERT INTO (.*?) VALUES\((.*?)\);'i",'\\2',$a);
$values = explode(',',$tmp);
foreach($values as $v) { $m[] = str_replace(array("\r","\n"),'',$v); }
foreach($sort as $s) {
if(!$vars) { echo "[!] Can't get table values from $e =[\n"; break; } else foreach($vars as $v) {
if($admins==1&&$hashmake==0&&$makefiles==0) {
if(!$tr) $tr[]=$e;
if($v['name']==$admin_pass) $tr[]=make($m[$v['num']]);
elseif($v['name']==$admin_salt) $tr[]=checksalt(make($m[$v['num']]));
foreach($admin_comment as $comm) if($comm==$v['name']) $comment[] = make($m[$v['num']]);
$admok=1;
} else {
if($s==$v['name']) {
if($s=='salt') $tm[] = checksalt(make($m[$v['num']]));
else $tm[] = make($m[$v['num']]);
}
if($admins==1&&!$admok) {
if(!$tr) $tr[]=$e;
if($v['name']==$admin_pass) $tr[]=make($m[$v['num']]);
elseif($v['name']==$admin_salt) $tr[]=checksalt(make($m[$v['num']]));
foreach($admin_comment as $comm) if($comm==$v['name']) $comment[] = make($m[$v['num']]);
}
}
}
if($admok==1) break; $admok=2;
}
if($tm[0])$globhash[]=$towrite[]=@implode($tm,$delim); if($admins==1)if($tr[0])$odmen[]=@implode($tr,$delim).$delim.$delim.@implode($comm ent,', ');
unset($tr); unset($m); unset($tm); unset($comment);
if($admok==1) break;
}
}
if($makefiles==1) {
if($site==1) {
$host = preg_replace("'$site_prefix(.*?)$site_ext'i",'\\1',$e);
echo "[:] connecting to $host..\n";
$fp = fsockopen($host,80,&$errno,&$errstr,5);
if(!$fp) echo "[:] Error connecting $host ($errno - $errstr)\n";
fputs($fp,"GET / HTTP/1.0\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)\r\nHost: $host\r\nAccept-Language: ru\r\nAccept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n\r\n");
while(!feof($fp)) {
$tmp=fgets($fp,1000);
if(preg_match("'charset='i",$tmp)||!$schar) {
$ch=preg_replace("'(.*?)charset=(.*?)\r\n'i",'\\2',$tmp);
if(preg_match("'koi8-r'i",$ch)) $koi=1;
elseif(preg_match("'iso8859-5'i",$ch)) $iso=1; $schar=1;
}
elseif(preg_match("'<title>(.*?)</title>'i",$tmp)) {
$title=preg_replace("'(.*?)<title>(.*?)</title>(.*?)'i",'\\2',$tmp);
echo "[:] TITLE ok..\n";
}
elseif(preg_match("'<meta (.*?)keywords(.*?)>'i",$tmp)) {
$kiwords=preg_replace("'(.*?)<meta (.*?)content=(\"|\')(.*?)(\"|\')(.*?)>(.*?)'i",'\\4',$tmp);
echo "[:] KEYWORDS ok..\n";
}
elseif(preg_match("'<meta (.*?)description(.*?)>'i",$tmp)) {
$descr=preg_replace("'(.*?)<meta (.*?)content=(\"|\')(.*?)(\"|\')(.*?)>(.*?)'i",'\\4',$tmp);
echo "[:] DESCRIPTION ok..\n";
}
elseif(preg_match("'</head>'i",$tmp)||preg_match("'<body'i",$tmp)) break;
}
fclose($fp);
if($koi||$convert==1) { $title=koi($title); $kiwords=koi($kiwords); $descr=koi($descr); }
if($iso||$convert==1) { $title=iso($title); $kiwords=iso($kiwords); $descr=iso($descr); }
$info="Site: $host\nTitle: $title\nDescription: $descr\nKeywords: $kiwords\n\n"; $title=$host=$descr=$kiwords='';
}
echo "[~] sorting and writing hashes in $e.$ext..\n"; @asort($towrite); fwrite($f,$info.@implode($towrite,$br)); fclose($f); unset($info);
}
unset($vars); unset($file); unset($towrite); unset($admok);
}
}
if($hashmake==1) { echo " sorting & writing all hashes..\n"; @asort($globhash); $f = fopen($hash_filename,"w+");fwrite($f,@implode($globhash,$br));fclose($f);}
if($admins==1) { echo " sorting & writing admin hashes..\n"; @asort($odmen); $f = fopen($admin_filename,"w+"); fwrite($f,@implode($odmen,$br)); fclose($f);}
myau();
?>
Возможности скрипта следующие:
- анализ всех дампов в директории (достаточно только побросать файлы в директорию и запустить скрипт)
- универсальность анализа данных - Вам надо всего лишь задать требуемые поля таблицы
- сортировка в удобном вам виде - по нужным полям и в нужном порядке
- генерирование отдельных файлов с каждого дампа и одного файла со всеми хэшами/мылами/etc
- выборка из дампов только админов (если таблица форумная или движковая)
- статистика по дампам (автоматический коннект к сайту и сбор информации по титлу и кейвордам) - удобно если баз много, а проверять каждый сайт лениво;
Ограничения:
- скрипт рассчитан на дампы с одной таблицей. То есть дампы с множеством таблиц будут обработаны некорректно. Потрудитесь отделить нужную таблицу в отдельный файл, сохранив структуру дампа. (либо возмозможна поставка более полной версии скрипта по определённой договорённости )
- скрипт рассчитан на дампы одного движка. То есть если в директории будут валяться дампы от других движков, они не будут обработаны корректно. Однако вам ничего не мешает разложить дампы разных движков в разные папки и поправить конфиг для каждой из них.
- для успешной обработки вы должны понимать что такое дамп бд и синтаксис sql, чтобы правильно заполнить настройки скрипта. По умолчанию скрипт настроен на vBulletin, для других форумов конечно настройки будут чуть другие.
Теперь относительно самих настроек. Они условно разделены на 7 частей.
1. В первой части вы должны раскомментировать одино из возможных значений, либо вписать то что требуется вам. В скрипте уже есть 5возможных вариантов. Не забывайте, что для Passwords Pro формат должен быть из трёх значений. Какие значения туда вписывать? Для этого потребуется открыть одну из баз данных и посмотреть на начало дампа, где делается таблица. Очерёдность в дампах не имеет значения, скрипт сам найдёт какое название ячейки соответствует тому или иному значения в таблице. Об этом в примере ниже
2. Во второй вы можете задать чем разделять значения и строки. Сейчас объясню почему разделитель там не :, далее прочтите внимательно, так как надо будет изменить настройки PPro. Имеется небольшая проблема с генерацией файлов с salt и Passwords Pro с дефолтными настройками. По дефолту разделителем стоит двоеточие (. Однако никто не мешает нам его заменить. Но вот незадача, в salt есть все возможные символы, и что не ставь, всё равно какой-нибудь сальт будет отчетвертован как разделитель.
Чего же в salt нету? Правильно, символов в юникоде. Поэтому разделителем выбран именно ¤, с ним всё будет обработано правильно. Следует заменить в программе стандартное двоеточие на этот символ (копипаст), и всё.
3. Далее. В третьей части вы можете выбрать, делать ли для каждого дампа отдельный файл, в котором будут отсортированные значения. То есть например для каждого site.com.sql, site2.com.sql будут сформированы site.com.sql.txt и тд. Данную опцию следует включать, если формируются базы мыл. При включённой этой опции можно задействовать опцию $site, о которой ниже.
4. Четвёртая категория позволяет включить возможность сбора данных по сайту, с которого сделан дамп. Скрипт коннектится к сайту и вписывает в файл его титл и мета-теги. Здесь необходимо задать, с чего начинается файл дампа, и чем заканчивается, при условии, что в имени файла фигурирует адрес сайта. То есть например, если файл имеет вид dump_www.site.com.sql, то следует вписать $site_prefix = 'dump_', и $site_ext = '.sql'. Всё сохраняется в кодировке win-1251. Можно включить перекодировку символов, если отчёты получаются нечитаемые. Однако эта часть скрипта у меня получилось не очень действенной, поэтому лучше не включать (удалять было жалко). Скрипт анализирует заголовки, выданные сервером, и если кодировка документа русская, но отлична от win-1251, конвертирует его в неё.
5. В пятой части задаём, делать ли общий файл со всеми этими данными. Удобно, если надо собрать всё со всех файлов и отсортировать.
6. Шестая часть - если требуется лишь выбрать пароли админов в отдельный файл. При этом надо указать Поля пароля и salt (второй если нету оставить пустым), а также можно добавить поля комментариев. Комментарии только для формата PasswordsPro!
7. В последней части необходимо указать название первой ячейки в таблице. Конечно можно было сделать более универсально, однако пардон, сейчас это уже лениво (со всеми улучшениями в более полной версии контактируйте лично, если Вы заинтересованы - договоримся).
Приведу пример.
Допустим есть дамп такого вида:
DROP TABLE IF EXISTS user;
CREATE TABLE dmf_user (
userid int(10) unsigned NOT NULL auto_increment,
usergroupid smallint(5) unsigned NOT NULL,
membergroupids varchar(250) NOT NULL,
...
KEY birthday_search (birthday_search)
);
INSERT INTO user VALUES('1','6','','0',....
Смотрим на первое значение после Create table - это userid, вписываем его в $firstintable параметр. Смотрим далее по дампу, что нам надо, вписываем в массив $sort. Остальное в принципе по вкусу. Далее запускаем скрипт как "php fdp.php", он выполняется и у нас получаются аккуратно сформированные файлы по дампам.
Отлично. Теперь пара рекомендаций относительно брута. Брут можно разделить на несколько этапов:
1. Предварительная атака. Заключается в проверке простых комбинаций типа aaa, 123, qwerty и тд. На этом этапе находится около 10-15% всех паролей (пользователи часто регаются "лишь бы регнуться", поэтому простые пароли не редкость)
2. Атака полным перебором ПО ЦИФРАМ (от 1 до 7 цифр). Цифровые пароли очень распространены и на этом этапе сбручиваются 15-30%, хоть брут происходит достаточно долго.
3. Атака по словарям (можно пропустить и сразу проводить гибридную атаку, если есть время). Загружаем все имеющиеся словари без разбору (ставим этот набор текущим) и брутим. Здесь сбручивается ещё где-то 5-10%. Всё зависит от качества английских словарей, так как простые слова типа hitman, hunter, warez и тд очень популярны. Атака занимает чуть меньше, чем полным перебором по цифрам (конечно если словарей у вас не на 400 и выше метров)
4. Гибридная атака по словарям. Достаточно действенный вид атаки, если есть время, и при успешном составлении правил позволяет сбрутить тоже около 5-10%. Отличие её от обычной атаки в том, что помимо проверки самого слова, его можно изменить (перевести в верхний/нижний регистр/всех символов, обратить слово или дублировать, добавить в начало или конец символы). Самое главное - не увлечься, или атака может проводиться ужасно долго. Из правил рекомендую следующие (: нужно, если только не была проведена простая атака по словарям):
5. Комбинированная атака. Последняя часть атаки может быть очень долгой, выявляет около 2-3% паролей, не более, и позволяет сбрутить "мастодонтов" с более сложными паролями. Заключается в сочетании словарей. Например словарь с английскими словами можно скрестить с цифровым словарём, чтобы получалось что-нибудь типа admin055, 3warez и так далее. В настройках первыми набором словарей грузим то, что будет началом слов, вторым - с чем будет сочетаться. Данную атаку нужно применять только если "ну очень надо", так как длиться она долго и занимается много процессорного времени. К томуже следует применять смекалку и знать состав всех своих словарей, чтобы успешно сочетать слова в них. Крайне не рекомендую большие словари по 20-30 метров для этого дела - можно просто состариться раньше.
Скорость брута зависит, во-первых, от мощности машины: мой старенький Pentium3-450/224Mb(128+64+32) работает со скоростью 160 паролей в секунду и кушает ~90метров словарей(~10000100 паролей) за ~17 часов. Более мощный Sempron2800+(up1750MHz)/512Mb на тех же словарях работает со скоростью 450 п/с и лопает словари где-то за 6 часов. Я конечно ещё хотел посмотреть на скорость брута на моём старом AMD K5-166/64Mb, но это будет слишком смешно %).
Автор: reActor ( rea.ctor.net.ru).
Из-за того что стоит ограничение, статья выложена не полностью (http://exploit.in/forum/index.php?showtopic=6430&pid=37826&st=0&#entry37826). Думаю ссылки на словари и составление правил для гибридной атаки не так важны.
Из этой статьи Вы подчерпнёте полезную информацию относительно того, как следует обходиться с разнообразными дампами бд. В частности, дампами форумов. А кто ещё совсем маленький и неопытный, узнает много всего интересного и познавательного - в бруте ничего сложного нет, нужно только не промахиваться мимо кнопочек. Я дам несколько действенных советов относительно брута хэшей и посоветую тем кто недопёр сам, что и как брутить. И также экслюзивно для читатейлей журнала и специально для журнала Xakepy.ry выложу скрипт, написанный для работы с базами. Оговорюсь, что для успешного применения всего, описанного ниже, понадобятся следующие инструменты:
- PHP 4.3.3 и выше
- Passwords Pro, есть такой программ полезный
- руки и голова в полном боекомплекте
Итак, допустим Вы каким-то образом заполучили дамп базы данных. И причём не один :-D (нет и не два), а целую кучу. Упустим каким именно образом. Пусть это будут дампы форумов. Причём дампы таблицы пользователей (ну а что ещё то надо? ). При обретении сего полезного кладезя данных перед Вами сразу встаёт один из двух возможных путей:
а) кудаб загнать всё это добро
б) чем бы разложить все эти кучи одинаковых баз данных по полочкам для дальнейшего
1) брута админских, асечных, и мыльных паролей
2) сортировки по мыльным базам в зависимости от содержания сайта/форума (мало ли Вы злобный спамер или крабер).
Ни для кого думаю не является открытием, что пароль на форуме и пароль на мыле или номере аськи совпадает у 70% пользователей. Ведь тогда надо для каждого форума придумывать новый отдельный пароль, а их надо записывать или запоминать, а это так лениииво.. Что можно получить от асек и мыл? Ну пфф, кто ещё не догадался, перечислю:
- сами базы мыл, особенно если на форуме зарегистрировано много пользователей, можно использовать/загнать как базы для спама, причём тематические (ясно что на автомобильном форуме в основном будут регистрироваться люди, которым интересна данная тема).
- сбрученные мыла можно использовать/загнать под спам (именно для отправки спама через них), только было бы неплохо проверить сначала их на предмет валидности (около 15-20% всё равно отсеятся). Но многопоточный скрипт для проверки мыл пардон я Вам выкладывать не буду, уж простите ;-)
- сбрученные 6-7знаки можно использовать самому, как понравится, либо отдать в асечный магазин. Проверять аси можно IPDBrute (asechka.ru в downloads), нужно иметь только список проксей (Forum Proxy Leecher) и свободное время.
- сбрученные 8-9 знаки бывают порой очень даже красивые (xy, xyz, как вам 222272222?%) ), т.н. слоны, их тоже можно использовать или отдать в магаз/продать. Остальные же 9знаки также можно выложить/загнать под флуд.
Вот сколько перспектив перед Вами открывается =). Однако вернёмся к написанному выше. С пунктом а) думаю Вы сами решите как быть, если Вам самим влом разбираться с базами, а по второму пункту я продолжу повествование дальше. Не правда ли, было бы крайне неплохо привести все имеющиеся дампы в вид всего пары файлов со всеми хэшами для дальнейшей отправки на брут в ПассворсПро, причём отсортировать всё по роду вашей деятельности (аськи, мыла, пассы админов), убирая всё лишнее, имея возможность выбрать, в каком порядке всё сортировать. Ведь не разбирать же всё вручную!
Специально и экслюзивно, только для Вас и только сегодня (аплодисменты и крики на заднем плане) - универсальный скрипт для разбора баз данных! (слова тонут в овациях)
<?
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ xxx ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
/* Forum Dump Parser v0.2 (FDPv0.2)
/* by Re@ctor
/* http://truenet.net.ru/security/
/*
/*
/* Скрипт предназначен для частного использования и позволяет
/* привести имеющиеся дампы баз данных в единый удобный формат для
/* дальнейшего анализа в программе Passwords Pro, либо просто
/* в списки для других программ.
/*
/* Скрипт запрещается использовать в корыстных целях и автор не
/* несёт ответственности за возможный ущерб, причинённый от исполь-
/* зования данного скрипта.
/*
/* Скрипт запрещается использовать в противозаконных целях, либо
/* целях, ведущих к умышленному или неумышленному нарушению законода-
/* тельства Российской Федерации.
/*
/* Хорошего дня и доброго насроения!;-)
/* Помните про существование TrueNET! =)
/*
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ xxx ]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
###### 1. выходной формат файлов ######
# для брута, формат Passwords Pro
#$sort = array('username','password','salt'); # пользователи
#$sort = array('email','password','salt'); # мыльники
$sort = array('icq','password','salt'); # аськи
# помните, что формат PPro - имя:хэш:сальт:расшифр.парол ь:комментарий
# поэтому надо писать от 2 до 3 значений, т.к. меньше или больше
# будет воспринято неверно программой.
# просто базы
#$sort = array('email'); # e-mail
#$sort = array('icq'); # icq
###### 2. формирование строк ######
$delim = "¤"; # разделитель между значениями
$br = "\n"; # чем заканчивать строку (\n - перенос строки)
###### 3. промежуточный вывод ######
$makefiles = 1; # делать ли отдельные файлы для каждого дампа
$ext = "txt"; # расширение выходного файла этих файлов
###### 4. параметры сбора информации ######
$site = 1; # если $makefiles = 0;, то получать сведения о сайте
# из титла и мета-тегов (необоходимо подключение к сети) и записывать в начало файла
# ( удобно при составлении тематических спам-баз )
# формат файла должен быть префиксАДРЕС_САЙТАрасшире ие, где префикс и расширение любые
$site_prefix = ''; # если $site=1, указать префикс файлов
$site_ext = '.sql'; # если $site=1, указать расширение файлов
$convert = 0; # конвертировать полученный текст в win-1251, если оно не в нём (отключить при багах)
###### 5. общий файл с данными ######
$hashmake = 1; # делать ли единый файл со всеми хэшами
$hash_filename = '!PasswordsPro.Hashes'; # имя файла с хэшами
###### 6. выборка из дампов админов в отдельный файл ######
$admins = 1; # сделать файл с хэшами админов дампов
$admin_pass = 'password'; # имя ячейки с хэшем пароля
$admin_salt = 'salt'; # имя ячейки с салом пароля
$admin_comment = array('username','email','icq'); # то что будет в комментарии в полях пассворс-про
$admin_filename = '!admin.PasswordsPro.Hashes';
###### 7. (WARNING!) имя первой ячейки в таблице ######
$firstintable = 'userid'; # название первой ячейки в таблице (важно!)
ini_set("max_execution_time","86400");
set_time_limit(0);
function make($value) { return preg_replace("'\'(.*?)\''i",'\\1',$value); }
function checksalt($salt) { if(strlen($salt)>3) return str_replace(array("\\\\",'\"',"\'"),array("\\",'"',"'"),$salt); else return $salt; }
function koi($txt) { return convert_cyr_string($txt,'k','w'); }
function iso($txt) { return convert_cyr_string($txt,'i','w'); }
function myau() { echo "\n\nDone!;-D\n\nNice day. Visit http://truenet.net.ru/ !\n\n"; }
$d=opendir('.');
while(($e=readdir($d))!=false) {
if($e=='.'||$e=='..'||$e==$admin_filename||$e==$ha sh_filename||$e==$argv[0]) continue;
if(is_file($e)) {
if($makefiles==1)$f = fopen("$e.$ext","w+");
echo "[+] $e (".filesize($e)." bytes)\n";
$file = file($e);
foreach($file as $a) {
$tmp = explode(' ',$a); $tablesuf=$tmp[1];
if(!$vars) { if($tablesuf==$firstintable) { $vars[]=array('name'=>$firstintable,'num'=>0); } continue; }
foreach(array_unique(array_merge($sort,$admin_comm ent)) as $s) {
if($tablesuf==$s) { $vars[]=array('name'=>$s,'num'=>count($vars)); $y=1; }
}
if(!$y) $vars[]='b'; else unset($y);
if(strstr($a,'PRIMARY KEY')) break;
}
foreach($file as $a) {
if(strstr($a,"INSERT INTO")) {
$tmp = preg_replace("'INSERT INTO (.*?) VALUES\((.*?)\);'i",'\\2',$a);
$values = explode(',',$tmp);
foreach($values as $v) { $m[] = str_replace(array("\r","\n"),'',$v); }
foreach($sort as $s) {
if(!$vars) { echo "[!] Can't get table values from $e =[\n"; break; } else foreach($vars as $v) {
if($admins==1&&$hashmake==0&&$makefiles==0) {
if(!$tr) $tr[]=$e;
if($v['name']==$admin_pass) $tr[]=make($m[$v['num']]);
elseif($v['name']==$admin_salt) $tr[]=checksalt(make($m[$v['num']]));
foreach($admin_comment as $comm) if($comm==$v['name']) $comment[] = make($m[$v['num']]);
$admok=1;
} else {
if($s==$v['name']) {
if($s=='salt') $tm[] = checksalt(make($m[$v['num']]));
else $tm[] = make($m[$v['num']]);
}
if($admins==1&&!$admok) {
if(!$tr) $tr[]=$e;
if($v['name']==$admin_pass) $tr[]=make($m[$v['num']]);
elseif($v['name']==$admin_salt) $tr[]=checksalt(make($m[$v['num']]));
foreach($admin_comment as $comm) if($comm==$v['name']) $comment[] = make($m[$v['num']]);
}
}
}
if($admok==1) break; $admok=2;
}
if($tm[0])$globhash[]=$towrite[]=@implode($tm,$delim); if($admins==1)if($tr[0])$odmen[]=@implode($tr,$delim).$delim.$delim.@implode($comm ent,', ');
unset($tr); unset($m); unset($tm); unset($comment);
if($admok==1) break;
}
}
if($makefiles==1) {
if($site==1) {
$host = preg_replace("'$site_prefix(.*?)$site_ext'i",'\\1',$e);
echo "[:] connecting to $host..\n";
$fp = fsockopen($host,80,&$errno,&$errstr,5);
if(!$fp) echo "[:] Error connecting $host ($errno - $errstr)\n";
fputs($fp,"GET / HTTP/1.0\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en)\r\nHost: $host\r\nAccept-Language: ru\r\nAccept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n\r\n");
while(!feof($fp)) {
$tmp=fgets($fp,1000);
if(preg_match("'charset='i",$tmp)||!$schar) {
$ch=preg_replace("'(.*?)charset=(.*?)\r\n'i",'\\2',$tmp);
if(preg_match("'koi8-r'i",$ch)) $koi=1;
elseif(preg_match("'iso8859-5'i",$ch)) $iso=1; $schar=1;
}
elseif(preg_match("'<title>(.*?)</title>'i",$tmp)) {
$title=preg_replace("'(.*?)<title>(.*?)</title>(.*?)'i",'\\2',$tmp);
echo "[:] TITLE ok..\n";
}
elseif(preg_match("'<meta (.*?)keywords(.*?)>'i",$tmp)) {
$kiwords=preg_replace("'(.*?)<meta (.*?)content=(\"|\')(.*?)(\"|\')(.*?)>(.*?)'i",'\\4',$tmp);
echo "[:] KEYWORDS ok..\n";
}
elseif(preg_match("'<meta (.*?)description(.*?)>'i",$tmp)) {
$descr=preg_replace("'(.*?)<meta (.*?)content=(\"|\')(.*?)(\"|\')(.*?)>(.*?)'i",'\\4',$tmp);
echo "[:] DESCRIPTION ok..\n";
}
elseif(preg_match("'</head>'i",$tmp)||preg_match("'<body'i",$tmp)) break;
}
fclose($fp);
if($koi||$convert==1) { $title=koi($title); $kiwords=koi($kiwords); $descr=koi($descr); }
if($iso||$convert==1) { $title=iso($title); $kiwords=iso($kiwords); $descr=iso($descr); }
$info="Site: $host\nTitle: $title\nDescription: $descr\nKeywords: $kiwords\n\n"; $title=$host=$descr=$kiwords='';
}
echo "[~] sorting and writing hashes in $e.$ext..\n"; @asort($towrite); fwrite($f,$info.@implode($towrite,$br)); fclose($f); unset($info);
}
unset($vars); unset($file); unset($towrite); unset($admok);
}
}
if($hashmake==1) { echo " sorting & writing all hashes..\n"; @asort($globhash); $f = fopen($hash_filename,"w+");fwrite($f,@implode($globhash,$br));fclose($f);}
if($admins==1) { echo " sorting & writing admin hashes..\n"; @asort($odmen); $f = fopen($admin_filename,"w+"); fwrite($f,@implode($odmen,$br)); fclose($f);}
myau();
?>
Возможности скрипта следующие:
- анализ всех дампов в директории (достаточно только побросать файлы в директорию и запустить скрипт)
- универсальность анализа данных - Вам надо всего лишь задать требуемые поля таблицы
- сортировка в удобном вам виде - по нужным полям и в нужном порядке
- генерирование отдельных файлов с каждого дампа и одного файла со всеми хэшами/мылами/etc
- выборка из дампов только админов (если таблица форумная или движковая)
- статистика по дампам (автоматический коннект к сайту и сбор информации по титлу и кейвордам) - удобно если баз много, а проверять каждый сайт лениво;
Ограничения:
- скрипт рассчитан на дампы с одной таблицей. То есть дампы с множеством таблиц будут обработаны некорректно. Потрудитесь отделить нужную таблицу в отдельный файл, сохранив структуру дампа. (либо возмозможна поставка более полной версии скрипта по определённой договорённости )
- скрипт рассчитан на дампы одного движка. То есть если в директории будут валяться дампы от других движков, они не будут обработаны корректно. Однако вам ничего не мешает разложить дампы разных движков в разные папки и поправить конфиг для каждой из них.
- для успешной обработки вы должны понимать что такое дамп бд и синтаксис sql, чтобы правильно заполнить настройки скрипта. По умолчанию скрипт настроен на vBulletin, для других форумов конечно настройки будут чуть другие.
Теперь относительно самих настроек. Они условно разделены на 7 частей.
1. В первой части вы должны раскомментировать одино из возможных значений, либо вписать то что требуется вам. В скрипте уже есть 5возможных вариантов. Не забывайте, что для Passwords Pro формат должен быть из трёх значений. Какие значения туда вписывать? Для этого потребуется открыть одну из баз данных и посмотреть на начало дампа, где делается таблица. Очерёдность в дампах не имеет значения, скрипт сам найдёт какое название ячейки соответствует тому или иному значения в таблице. Об этом в примере ниже
2. Во второй вы можете задать чем разделять значения и строки. Сейчас объясню почему разделитель там не :, далее прочтите внимательно, так как надо будет изменить настройки PPro. Имеется небольшая проблема с генерацией файлов с salt и Passwords Pro с дефолтными настройками. По дефолту разделителем стоит двоеточие (. Однако никто не мешает нам его заменить. Но вот незадача, в salt есть все возможные символы, и что не ставь, всё равно какой-нибудь сальт будет отчетвертован как разделитель.
Чего же в salt нету? Правильно, символов в юникоде. Поэтому разделителем выбран именно ¤, с ним всё будет обработано правильно. Следует заменить в программе стандартное двоеточие на этот символ (копипаст), и всё.
3. Далее. В третьей части вы можете выбрать, делать ли для каждого дампа отдельный файл, в котором будут отсортированные значения. То есть например для каждого site.com.sql, site2.com.sql будут сформированы site.com.sql.txt и тд. Данную опцию следует включать, если формируются базы мыл. При включённой этой опции можно задействовать опцию $site, о которой ниже.
4. Четвёртая категория позволяет включить возможность сбора данных по сайту, с которого сделан дамп. Скрипт коннектится к сайту и вписывает в файл его титл и мета-теги. Здесь необходимо задать, с чего начинается файл дампа, и чем заканчивается, при условии, что в имени файла фигурирует адрес сайта. То есть например, если файл имеет вид dump_www.site.com.sql, то следует вписать $site_prefix = 'dump_', и $site_ext = '.sql'. Всё сохраняется в кодировке win-1251. Можно включить перекодировку символов, если отчёты получаются нечитаемые. Однако эта часть скрипта у меня получилось не очень действенной, поэтому лучше не включать (удалять было жалко). Скрипт анализирует заголовки, выданные сервером, и если кодировка документа русская, но отлична от win-1251, конвертирует его в неё.
5. В пятой части задаём, делать ли общий файл со всеми этими данными. Удобно, если надо собрать всё со всех файлов и отсортировать.
6. Шестая часть - если требуется лишь выбрать пароли админов в отдельный файл. При этом надо указать Поля пароля и salt (второй если нету оставить пустым), а также можно добавить поля комментариев. Комментарии только для формата PasswordsPro!
7. В последней части необходимо указать название первой ячейки в таблице. Конечно можно было сделать более универсально, однако пардон, сейчас это уже лениво (со всеми улучшениями в более полной версии контактируйте лично, если Вы заинтересованы - договоримся).
Приведу пример.
Допустим есть дамп такого вида:
DROP TABLE IF EXISTS user;
CREATE TABLE dmf_user (
userid int(10) unsigned NOT NULL auto_increment,
usergroupid smallint(5) unsigned NOT NULL,
membergroupids varchar(250) NOT NULL,
...
KEY birthday_search (birthday_search)
);
INSERT INTO user VALUES('1','6','','0',....
Смотрим на первое значение после Create table - это userid, вписываем его в $firstintable параметр. Смотрим далее по дампу, что нам надо, вписываем в массив $sort. Остальное в принципе по вкусу. Далее запускаем скрипт как "php fdp.php", он выполняется и у нас получаются аккуратно сформированные файлы по дампам.
Отлично. Теперь пара рекомендаций относительно брута. Брут можно разделить на несколько этапов:
1. Предварительная атака. Заключается в проверке простых комбинаций типа aaa, 123, qwerty и тд. На этом этапе находится около 10-15% всех паролей (пользователи часто регаются "лишь бы регнуться", поэтому простые пароли не редкость)
2. Атака полным перебором ПО ЦИФРАМ (от 1 до 7 цифр). Цифровые пароли очень распространены и на этом этапе сбручиваются 15-30%, хоть брут происходит достаточно долго.
3. Атака по словарям (можно пропустить и сразу проводить гибридную атаку, если есть время). Загружаем все имеющиеся словари без разбору (ставим этот набор текущим) и брутим. Здесь сбручивается ещё где-то 5-10%. Всё зависит от качества английских словарей, так как простые слова типа hitman, hunter, warez и тд очень популярны. Атака занимает чуть меньше, чем полным перебором по цифрам (конечно если словарей у вас не на 400 и выше метров)
4. Гибридная атака по словарям. Достаточно действенный вид атаки, если есть время, и при успешном составлении правил позволяет сбрутить тоже около 5-10%. Отличие её от обычной атаки в том, что помимо проверки самого слова, его можно изменить (перевести в верхний/нижний регистр/всех символов, обратить слово или дублировать, добавить в начало или конец символы). Самое главное - не увлечься, или атака может проводиться ужасно долго. Из правил рекомендую следующие (: нужно, если только не была проведена простая атака по словарям):
5. Комбинированная атака. Последняя часть атаки может быть очень долгой, выявляет около 2-3% паролей, не более, и позволяет сбрутить "мастодонтов" с более сложными паролями. Заключается в сочетании словарей. Например словарь с английскими словами можно скрестить с цифровым словарём, чтобы получалось что-нибудь типа admin055, 3warez и так далее. В настройках первыми набором словарей грузим то, что будет началом слов, вторым - с чем будет сочетаться. Данную атаку нужно применять только если "ну очень надо", так как длиться она долго и занимается много процессорного времени. К томуже следует применять смекалку и знать состав всех своих словарей, чтобы успешно сочетать слова в них. Крайне не рекомендую большие словари по 20-30 метров для этого дела - можно просто состариться раньше.
Скорость брута зависит, во-первых, от мощности машины: мой старенький Pentium3-450/224Mb(128+64+32) работает со скоростью 160 паролей в секунду и кушает ~90метров словарей(~10000100 паролей) за ~17 часов. Более мощный Sempron2800+(up1750MHz)/512Mb на тех же словарях работает со скоростью 450 п/с и лопает словари где-то за 6 часов. Я конечно ещё хотел посмотреть на скорость брута на моём старом AMD K5-166/64Mb, но это будет слишком смешно %).
Автор: reActor ( rea.ctor.net.ru).
Из-за того что стоит ограничение, статья выложена не полностью (http://exploit.in/forum/index.php?showtopic=6430&pid=37826&st=0&#entry37826). Думаю ссылки на словари и составление правил для гибридной атаки не так важны.