Брутальная простота Из этой статьи Вы подчерпнёте полезную информацию относительно того, как следует обходиться с разнообразными дампами бд. В частности, дампами форумов. А кто ещё совсем маленький и неопытный, узнает много всего интересного и познавательного - в бруте ничего сложного нет, нужно только не промахиваться мимо кнопочек. Я дам несколько действенных советов относительно брута хэшей и посоветую тем кто недопёр сам, что и как брутить. И также экслюзивно для читатейлей журнала и специально для журнала 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знаки также можно выложить/загнать под флуд. Вот сколько перспектив перед Вами открывается =). Однако вернёмся к написанному выше. С пунктом а) думаю Вы сами решите как быть, если Вам самим влом разбираться с базами, а по второму пункту я продолжу повествование дальше. Не правда ли, было бы крайне неплохо привести все имеющиеся дампы в вид всего пары файлов со всеми хэшами для дальнейшей отправки на брут в ПассворсПро, причём отсортировать всё по роду вашей деятельности (аськи, мыла, пассы админов), убирая всё лишнее, имея возможность выбрать, в каком порядке всё сортировать. Ведь не разбирать же всё вручную! Специально и экслюзивно, только для Вас и только сегодня (аплодисменты и крики на заднем плане) - универсальный скрипт для разбора баз данных! (слова тонут в овациях) Code: <? /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~[ 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==$hash_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_comment)) 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($comment,', '); 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. В последней части необходимо указать название первой ячейки в таблице. Конечно можно было сделать более универсально, однако пардон, сейчас это уже лениво (со всеми улучшениями в более полной версии контактируйте лично, если Вы заинтересованы - договоримся). Приведу пример. Допустим есть дамп такого вида: Code: 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). Из-за того что стоит ограничение, статья выложена не полностью. Думаю ссылки на словари и составление правил для гибридной атаки не так важны.