Пишем клиент для Web-сервиса на примере Hash Cracking Bot (HCB) для hashcracking.info [Intro]Сидел я на работе в одно дождливое осеннее утро попивая утренний кофе и мечтал... Мечтал о суперботнете для распределённых вычислений на GPU. Ведь если взять хотя бы 10% мощности современной видеокарты, то скорость перебора для MD5 хэшей получится в районе 30-50 млн. пасс/сек. Представим ботнет из 1К таких компьютеров и получаем производительность 30-50 млрд. пасс/сек. Две самые мощные видеокарты на одном компе дадут производительность 1-1,5 млрд. пасс/сек, но это при 100% загрузке обеих GPU, что отрицательно сказывается на производительности компьютера в целом. (Т.е. чтоб комфортно работать на нём, ресурсов не хватит, конкретно - пропускной способности шины данных между GPU-память не хватает). Вообщем мечты, мечты... Тут я вспомнил подпись Электа "Кто, если не ты сам?" и решил начать с малого, чтоб мечта, хоть как-то приблизилась к той альтернативной реальности, где этот бот уже существует в виде "правильного" набора байтов (реализован в коде). Теперь посмотрим вперёд: У ATI тоже есть своя технология для разработки и написания софта для параллельных вычислений, пример тому программа брутфорсер IGHASHGPU (https://hashcracking.info/forum/viewtopic.php?f=10&t=304) которая поддерживает как видеокарты nVidia 8xx, так и ATI 4хх и пока бесплатна. Т.е. логично предполагать, что каждый второй или третий комп через 1-2 года будет оснащён такой видеокартой. Активные пользователи интернета - молодёжь, а значит, они любят и развлечься - поиграть в компьютерные игры, т.е. имеют в компе современную видеокарту. Конечно это предположение... Но скорее всего именно через 1-2 года бот будет как нельзя кстати, т.е. есть время начать его писать уже сейчас. Термины используемые в статьеcURL — это свободная (распространяемая по лицензии MIT)[1], кроссплатформенная служебная программа командной строки для передачи файлов по различным протоколам с синтаксом URL. Автором и обладателем всех прав является Daniel Stenberg. SSL (англ. Secure Sockets Layer — уровень защищённых сокетов) — криптографический протокол, обеспечивающий безопасную передачу данных по сети Интернет. (c) Вики [Для кого написана статья?]Статья для начинающих кодеров на PHP, для тех кто не работал с CURL, SSL, а использовал сокеты. Как раз этот пробел я восполню, ибо в сети полная инфа по CURL есть на английском и мало примеров использования на русском. Статья будет интересна хэшкрякерам, тем, кто использует программы брутфорсы и юзает сервис hashcracking.info (имеет там учётную запись). [Нафиг я её писал?] Раскрутка сервиса hashcracking.info? (она имеет обратную сторону - при использовании бота Вам заходить на сайт совсем не надо - он всё сам делает) Так что не обвиняйте меня в том, что это реклама! Популяризация хэшкряка (как занятия, хобби, работы) как такового в рунете. Популяризация кодинга на PHP для создания win-приложений. Пополнение рядов хэшкрякеров в этом увлекательном деле. Кто-то любит ловить рыбу, хэшкрякеры любят ловить пароли, и чем жирнее (чарсет) и длиннее тем лучше. Вообщем я ничего давно не писал и вот решил написать, я думаю многие по достоинству оценят сей труд, а немногие будут плеваться, ну на это мне самому, как бы, наплевать. Социалки достали уже, если честно, эпоха расцвета WEB2 [Подготовка]На чём писать? Подумал я... Хотелось бы конечно сделать в идеале на Visual С++ c красивыми окошками и т.д. но учитывая мои слабые знания в этой области (где брать либы, где достать хороший ман по функциям и т.д.) я решил это дело оформить на PHP. PHP привлекателен тем что содержит мощный набор встроенных функций и заточен под WEB. Кроме того вспомнил одну запись в блоге Raz0r`a, что есть удобные инструменты для разработки полноценных приложений для windows и компиляции php в exe, прикручивания GUI к приложению. Вообщем полез я в его блог искать ту запись и нашёл в архивчике. Инструментов обнаружилось два: это mini PHP Studio (http://exvision.net/miniphp/) и RoadSend Studio (http://www.roadsend.com/home/index.php). Я скачал оба и попробовал некоторые тестовые скрипты, в итоге мне больше понравился mini PHP Studio своей лаконичной простотой в управлении, а с RoadSend Studio постоянно возникали какие-то проблемы из-за отсутствия нужных библиотек (хотя я их подключал практически все). Вообщем инструмент я выбрал. Будем использовать mini PHP Studio. Для того чтоб заюзать все возможности CURL и SSL нам необходимо будет найти и подключить к php соответствующие либы (расширения). Необходимы две либы это: php_curl.dll и php_openssl.dll. Так же я узнал чтоб всё это дела работало необходимы системные библиотеки это libeay32.dll и ssleay32.dll. Чтоб не заморачиваться с их поиском просто рекомендую установить поддержку Open SSL Win32 (http://www.slproweb.com/products/Win32OpenSSL.html) и они появятся в системе. Теперь всё готово и можно приступать к кодингу. [Постановка задачи]Мы хотим разработать клиентское приложение для общения с WEB-сервисом, а именно бота для hashcracking.info , который будет выполнять следующие функции: 1. Скачивание нужной очереди хэшей с сервиса (авторизация не требуется). 2. Запуск программы брутфорса (тут на примере будем EGB натравливать на очередь хэшей). 3. Отправка найденных паролей от хэшей в очереди на сервис (необходима авторизация). Это неполный список задач, но это только начало. [Подводные камни]Ну во-первых, всем известно что hashcracking.info работает только по https протоколу, при обращении к любой странице по http отображается морда-заглушка сайта, с которой потом идёт редирект на https. Во вторых, на работе у меня локальная прокся (UserGate4), поэтому надо сделать так чтоб бот её мог использовать, иначе он не сможет достучатся до сервиса. Ну и последнее, что использовать сокеты или CURL? Дружит ли он с SSL? Кроме того для отправки паролей необходима авторизация на сервисе. Чтобы разрешить все сомнения я полез в гугл и нашёл ман по СURL на английском и убедился что поддержка SSL и PROXY в нём реализована, поэтому и остановил свой выбор на нём. Кроме того использовать его намного проще чем заморачиваться с сокетами. [Кодим]Настройки бота я решил положить в один файл hcb.ini, где первая строка описание параметра, вторая - его значение. Все параметры добавлял туда по мере разработки проекта, Вам привожу окончательный вид на данный момент: Code: Файл с хэшами (очередь с сервера запишется в него, сохраняется в папку брутфорса, путь указывать не надо) md5.txt -------------------------------- Файл с найденными паролями (сюда складываются найденные пассы) EGB пишет в ту же папку где находится бот, путь указывать не нужно: md5.dic -------------------------------- Путь к EGB (без кавычек, пример: D:\EGB\ ) D:\EGB\ -------------------------------- Тип запуска EGB(0-без создания окна, 1 - в свёрнутом виде) 1 -------------------------------- Тип скачиваемой очереди: (только mysql, md5, sha1, mysql5) md5 -------------------------------- Логин на сервисе hashcracking.info логин ------------------------------- Пароль на сервисе hashcracking.info пароль ------------------------------- HTTPS Прокси (если не используется оставляем пустую строку) ------------------------------- Порт ------------------------------- Тип прокси (по умолчанию https или SOCKS5) https ------------------------------- Время, через которое проверять найденные новые пароли в сек. 1 ------------------------------- Пароли от двойных md5 хэшей (0 не добавлять, 1- добавлять) 1 Имена модулей EGB, ini-файла, выходного файла найденных стандартные по названию алгоритма хэширования. т.е. [md5.exe md5.ini md5.dic]; [mysql.exe mysql.ini mysql.dic] Учётная запись на сервисе hashcracking.info, от имени которой будет работать бот. Напишем шапку бота, который прочитает все эти параметры: PHP: $ipArray = array_map("trim", file("hcb.ini")); //читаем файл параметров $file_1 = trim($ipArray[1]); // имя файла с полученными хэшами $file_2 = trim($ipArray[4]); // имя файла с наденными паролями $dir = trim($ipArray[7]); // директория где расположена EGB $hidden=trim($ipArray[10]); // 0-Запуск EGB без созднания окна 1 - в свёрнутом окне $type = trim($ipArray[13]); // тип очереди хэшей $login = trim($ipArray[16]); //Ваш логин на сервисе $passwd = trim($ipArray[19]); //Ваш пароль на сервисе $proxy = trim($ipArray[22]); //HTTPS прокси-сервер. $port = trim($ipArray[25]); //Порт прокси $t = trim($ipArray[28]); //Тип прокси, по умолчанию HTTPS $time = trim($ipArray[31]); //Время через которое проверять новые найденные пароли $md5md5 = trim($ipArray[34]); // признак того, что добавляются пароли от двойных md5 хэшей if ($t=='') $t='https'; Приступим теперь к реализации функции скачки очереди: [1.Скачивание очереди хэшей]Казалось бы тривиальная задача скачать файл оборачивается написанием функции из-за использования SSL. Сервис хэшкрэкинга предоставляет нам свой API для получения очереди (и не только) таким образом: Code: https://hashcracking.info/check.php?hash=[тип хэша], где тип хэша может принимать значения mysql, md5, sha1, mysql5 т.е. авторизация никакая не требуется для получения очереди хэшей. Напишем функцию скачки очереди get_hash($n), предварительно объявив несколько глобальных переменных, которые будут использоваться как в функциях, так и в основном коде, это параметры прокси-сервера: PHP: GLOBAL $proxy, $port, $t; Теперь сама функция: PHP: function get_hash($n)//Функция скачки очереди с hashcracking.info по https { GLOBAL $proxy, $port, $t; // Объявляем глобальными $ch = curl_init(); // инициализация cURL сессии $uri='https://hashcracking.info/check.php?hash='.$n; //URL Гет-запроса curl_setopt($ch, CURLOPT_URL, $uri); // Устанавливаем опцию, т.е. формируем хидеры запроса if ($proxy!='') // Если прокси задан, то задаём два доп. параметра { curl_setopt($ch, CURLOPT_PROXYTYPE, $t); // Устанавливаем тип прокси curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port); //Устанавливаем IP и PORT Прокси-сервера } curl_setopt($ch, CURLOPT_TIMEOUT, 120); // Устанавливаем таймаут, в течении которого cRUL будет ждать получения всего ответа от сервера curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // вернуть результат запроса, а не выводить в браузер. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // Не проверяем хост (на hashcracking.info самоподписанный просроченый сертификат) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // Удалённый сервер не будет проверять наш сертификат $answ=curl_exec($ch); // Отсылаем запрос и плучаем ответ - строку с хэшами. curl_close($ch); // Закрываем cURL сессию. return $answ; // Возвращаем список хэшей. } Я думаю тут ничего пояснять не надо, кого интересуют другие возможные передаваемые параметры, можете глянуть тут: http://htmlweb.ru/php/php_curl.php [2. Запуск программы брутфорса]И так мы должны скачать очередь, записать её в файл и положить в папку брутфорсера EGB, далее запустить брутфорсер в фоновом режиме. Т.е. бот не будет ждать завершения брутфорса, а должен будет продолжить свою работу. PHP: $file_1=$dir.$file_1; // дописываем путь к имени файла @$handle1 = fopen($file_1, "w"); //открываем файл для записи очереди хэшей @$handle2 = fopen($file_2, "a+"); //открываем файл для чтения паролей @$size2=filesize($file_2); //получаем размер файла паролей $day=0; // инициализация счётчика дней работы бота echo "Download hashlist $type ..."; //Выводим в консоль if (fwrite($handle1, get_hash($type)) === FALSE) //скачиваем очередь хэшей { echo "Don`t write to $file_1\r\n"; // Выводим ошибку записи в файл. exit; } else { @$size1=filesize($file_1); //Размер файла очереди в байтах echo "ok!\r\nWrite to $file_1 done! $size1 byte\r\n"; // Успешно записан! } fclose($handle1); //Закрываем файл Итак, очередь мы скачали. Теперь требуется запустить брутфорс из под бота. Недолго погуглив я нашёл приемлемые варианты запуска в фоновом режиме: PHP: $WshShell = new COM("WScript.Shell"); //создаём COM объект WScript.Shell if (file_exists($dir.$type.".exe")) //если исполняемый модуль брутфорсера найден.... иначе выход { if ($hidden==0) // запуск без создания окна в фоновом режиме { $command_line=$dir.$type.".exe /C dir /S %windir% ".$dir.$type.".ini ".$dir.$type.".txt"; //формируем командную строку $oExec = $WshShell->Run($command_line, 0, false); // запуск брутфорсера } else // запуск в свёрнутом окне в фоновом режиме { $command_line=$dir.$type.".exe ".$dir.$type.".ini ".$dir.$type.".txt"; //формируем командную строку $oExec = $WshShell->Run($command_line, 7, false); // запуск брутфорсера } echo "EGB Working!\r\n"; // Печатаем в консоль что EGB работает. //................................. } else echo "EGB not found! I can`t run it!"; // Иначе EGB не найден, запуск не возможен. Половина задачи решено, тестим, видим что это дело всё работает. Теперь мы подошли к третьему шагу: Отслеживание изменения файлов и отправка результатов на сервер. 3. Отправка найденных паролей от хэшей в очереди на сервис (необходима авторизация).Тут надо определится как мы будем отслеживать какие пароли нашёл брутфорсер. Я решил буду это определять считывая размер файла. Т.е. если размер файла изменился, то читаю пароли с указателя равному предыдущему размеру файла до конца файла. Размер файла будем замерять периодически. Итак: PHP: clearstatcache (); // сбрасываем кэш в файл на диск if ($size2<@filesize($file_2)) // если размер файла увеличился { $n=0; $passlist=''; $fs=fseek($handle2 ,$size2,'SEEK_SET'); //устанавливаем позицию на начало участка дописанных данных while (!feof ($handle2)) // пока не достигнут конец файла { $string=fgets($handle2); //читаем строки (пароли) if ($string!='') {$passlist.=$string; $n=$n+1;} // если строка не пустая, до добавляем, счетчик паролей } $size2=filesize($file_2); //Присваиваем переменной новый размер файла echo "\r\n".convert_cyr_string($passlist,'w','a'); // Выводим список найденных паролей в консоль if ($passlist!=chr(9).chr(10)) // если пасслист не пустая строка из символов возврат каретки и перевод строки { echo "\nNew ".($n)." pass found! Sending..."; //Печатаем отправка паролей echo "Ok!\r\n".put_pass($passlist); //Отправляем пароли на сервис } } Для отправки паролей функцией put_pass($passlist) необходима авторизация на сервисе, оформим её отдельной функцией. ...Продолжение следует. Оно нужно? Если тема не найдёт свою аудиторию, боян и т.д., то продолжать не буду, юзайте готового бота и не лазайте на сайт браузером P.S.Скачать готового бота и затестить можно тут: http://slil.ru/28080917 Результаты проверки на VirusTotal.com: P.P.S. Если траблы с запуском установите Open SSL Win32 и Visual C++ 2008 Redistributables, скачать тут: http://www.slproweb.com/products/Win32OpenSSL.html
Щас весит много (1.8 Мб.) ибо php->exe (курл+ssl либы) поэтому это как бы легальный бот Для полноценного нормального бота всё надо переписать на С++. Кроме того впихнуть туда много доп. функций: определения наличия видеодаптера в системе, апдейт системы, дров, если необходим, для норм. работы брутфорсера, приёма комманд от главного сервера и т.д. P.S. и Это... самого брутфорсера пока там нет! Он только запускает EGB-брутфорс (уже должен стоять на компе).
2Lebed А не легче будет просто очищать файл после успешной отправки сереверу? ввести на сервере дополнительно функцию положительного ответа о приеме данных "считаем сколько пасов в файле - Соединяемся - отправляем - ждем подтверждения с количеством - если количество совпадает то рвем соединение - очищаем файл - на сервере помечаем как найденные и больше не даем их ботам" (это как я вижу)/ конечно нужно, у самого давно уже лежит эта идея но все нет времени заняться этим, так что если что то помогу чем могу.
Как бы коллекция реалрассов не мешает на локальном компе (потом можно юзать как словарь для гибридной атаки). Можно поставить удаление как опцию, хотя оно и не нужно. Тут ещё такой смысл, что могут работать несколько брутфорсов и писать результат в один и тот же файл! Ну вот бот и будет из общей кучи забирать пароли. Есть ответы от сервера, примерно так выглядит всё: Code: Download hashlist md5 ...ok! Write to D:\Brute\EGB151\md5.txt done! 975018 byte EGB Working! Authorized as:-=lebed=- хэшкиллер регистрация: 2008-04-22 80 / 12511 На счёте / Репутация Days:0 Time:18 sec. LUkekeVI New 1 pass found! Sending...Ok! Добавлено паролей с очереди: 1 Вы заработали +0 кредитов! Ваш рейтинг повысился на: 1 Days:0 Time:359 sec. Ещё раз повторяю это легал бот, т.е. запускает его владелец компа. Очередь хэшей чистится, другой бот зайдя за хэшами уже не получит те хэши от которых пароли нашлись и отправились уже. P.S. Продолжение будет завтра или сёдня вечером, (пара функций дома осталась)
это хорошо но тогда нужно отслеживать время "взяли тогда-то" и например через определенное время проверять стоит ли пометка о возврате сбрученого хэша . Если его не вернули то снимать пометку о том что он взятый и отдавать обратно в очередь ибо если этого не делать то может получиться что человек взял хэш а у него бумсь и слетела винда - хэши так и останутся висеть где то в воздухе. (мысли в слух - просто строю картинку у ся в голове) Я и не говорю о нелегале, а про коллекцию как-то и не подумал - звыняюсь. З.Ы. уже как две недели колупаю CUDA под C++
Не... хэши остаются висеть в очереди на сервисе для других пользователей, бот их не удаляет оттуда, просто скачивает копию себе для локального брута, найденные пассы потом отправляет обратно на сервер. Если хэши от паролей на момент отправки всё ещё находятся в очереди, то происходит успешное добавление паролей в базу и удаление хэшей из очереди.
ну тогда боту, вместе с хэшем нужно передавать еще и диапазон для сканирования ибо получится что куча ботов будет брутить один и тот же диапазон что сведет на НЕТ всю идею распределенности. (просто ссылке что в коде, по "md5" я увидел только хэши а EGB начнет брутить с первого символа диапазона, или я ошибаюсь насчет EGB?)
... продолжение как и обещал. ... Для отправки паролей функцией put_pas($passlist) необходима авторизация на сервисе, оформим её отдельной функцией: PHP: function authorization($login,$passwd)//Функция заливки найденных паролей на hashcracking.info по https { GLOBAL $proxy, $port, $t; $ch = curl_init(); $uri='https://hashcracking.info/'; curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); if ($proxy!='') { curl_setopt($ch, CURLOPT_PROXYTYPE, $t); curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port); } curl_setopt($ch, CURLOPT_POSTFIELDS, "login=".$login."&passwd=".$passwd."&Submit='войти");//Устанавливаем данные POST полей (логин и пасс) curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie'); // сохраняем кукисы в файл curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie'); // имя файла с кукисами $answ=curl_exec($ch); curl_close($ch); $pattern='/<td width="140" align="left" rowspan="2" background="images\/top1.gif" class="style8"><center><b><span class="green">(.+)<br><b><a href="index.php\?9" class="link">/s'; // Шаблон поиска preg_match ( $pattern, $answ, $res ); // Парсим информацию об авторизации (ник, счёт,репутация и т.д.) $info=strip_tags($res[0],'<br>'); // Убираем все html тэги, кроме <br> $info=str_replace ('<br>',chr(9).chr(10),$info); // Заменяем тэг <br> на символы перевода строки. $info=str_replace (' ','',$info); // Убираем табуляцию если присутствует return convert_cyr_string($info,'w','a').chr(13); // Конвертируем кирилицу в кодировку 866 (DOS) для корректно отображения символов кирилицы в консоли и возвращаем текст об успешной авторизации. В случае неудачной авторизации вы просто не увидите ничего в консоли. } Т.е. тут всё просто: подготавливаем все данные для POST запроса и передаём их, затем парсим ответ сервера на предмет нужной нам инфы, в данном конкретном случае я ищу некоторый блок текста, который содержит Логин, счёт и репутацию с датой регистрации и поэтому опредяляю что бот удачно авторизовался на сервисе. Теперь переходим к функции заливки паролей она практически идентична авторизации, только заменяем данные POST PHP: function put_pass ($passlist) // Функция отправки паролей на сервис { GLOBAL $proxy, $port, $t, $md5md5; $ch = curl_init(); $uri='https://hashcracking.info/'; curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'); curl_setopt($ch, CURLOPT_TIMEOUT, 120); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); if ($proxy!='') { curl_setopt($ch, CURLOPT_PROXYTYPE, $t); curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port); } curl_setopt($ch, CURLOPT_POSTFIELDS, 'passlist='.$passlist.'&checkhash=0&md5md5='.$md5md5);//Передаем пасслист ПОСТ запросом curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie'); $answ=curl_exec($ch); curl_close($ch); $pattern='/<td class="style6"><b>(.+)<\/b><\/b><\/td>/s'; preg_match ( $pattern, $answ, $res ); $info=strip_tags($res[0],'<br>'); $info=str_replace ('<br>',chr(9).chr(10),$info); $info=str_replace (' ','',$info); return convert_cyr_string($info,'w','a').chr(9).chr(10); } Отправляем POST-запросом строку с найденными пассами. К этому времени мы должны быть авторизованы т.е. создана сессия на сервере, а в куках у нас будет лежать идентификатор этой сессии. собираем всё воедино: PHP: function get_hash($n)//Функция скачки очереди с hashcracking.info по https { GLOBAL $proxy, $port, $t; // Объявляем глобальными $ch = curl_init(); // инициализация cURL сессии $uri='https://hashcracking.info/check.php?hash='.$n; //URL Гет-запроса curl_setopt($ch, CURLOPT_URL, $uri); // Устанавливаем опцию, т.е. формируем хидеры запроса if ($proxy!='') // Если прокси задан, то задаём два доп. параметра { curl_setopt($ch, CURLOPT_PROXYTYPE, $t); // Устанавливаем тип прокси curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port); //Устанавливаем IP и PORT Прокси-сервера } curl_setopt($ch, CURLOPT_TIMEOUT, 120); // Устанавливаем таймаут, в течении которого cRUL будет ждать получения всего ответа от сервера curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // вернуть результат запроса, а не выводить в браузер. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // Не проверяем хост (на hashcracking.info самоподписанный просроченый сертификат) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // Удалённый сервер не будет проверять наш сертификат $answ=curl_exec($ch); // Отсылаем запрос и плучаем ответ - строку с хэшами. curl_close($ch); // Закрываем cURL сессию. return $answ; // Возвращаем список хэшей. } function authorization($login,$passwd)//Функция заливки найденных паролей на hashcracking.info по https { GLOBAL $proxy, $port, $t; $ch = curl_init(); // инициализация cURL $uri='https://hashcracking.info/'; curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'); //UserAgent, в принципе для хэшкрэкинга не нужен, сервер не проверяет его. curl_setopt($ch, CURLOPT_TIMEOUT, 10); // Таймаут на авторизацию curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // вернуть результат запроса, а не выводить в браузер. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // Не проверяем хост (на hashcracking.info самоподписанный просроченый сертификат) curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // Удалённый сервер не будет проверять наш сертификат if ($proxy!='') { curl_setopt($ch, CURLOPT_PROXYTYPE, $t); // тип прокси curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port); // прокси:порт } curl_setopt($ch, CURLOPT_POSTFIELDS, "login=".$login."&passwd=".$passwd."&Submit='войти");//Устанавливаем данные POST полей (логин и пасс) curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie'); // сохраняем кукисы в файл curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie'); // имя файла с кукисами $answ=curl_exec($ch); // получение контента страницы curl_close($ch); //закрытие сессии CURL $pattern='/<td width="140" align="left" rowspan="2" background="images\/top1.gif" class="style8"><center><b><span class="green">(.+)<br><b><a href="index.php\?9" class="link">/s'; // Шаблон поиска preg_match ( $pattern, $answ, $res ); // Парсим информацию об авторизации (ник, счёт,репутация и т.д.) $info=strip_tags($res[0],'<br>'); // Убираем все html тэги, кроме <br> $info=str_replace ('<br>',chr(9).chr(10),$info); // Заменяем тэг <br> на символы перевода строки. $info=str_replace (' ','',$info); // Убираем табуляцию если присутствует return convert_cyr_string($info,'w','a').chr(13); // Конвертируем кирилицу в кодировку 866 (DOS) для корректно отображения символов кирилицы в консоли и возвращаем текст об успешной авторизации. В случае неудачной авторизации вы просто не увидите ничего в консоли. } function put_pass ($passlist) // Функция отправки паролей на сервис { GLOBAL $proxy, $port, $t, $md5md5; $ch = curl_init(); $uri='https://hashcracking.info/'; curl_setopt($ch, CURLOPT_URL, $uri); curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'); curl_setopt($ch, CURLOPT_TIMEOUT, 120); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); if ($proxy!='') { curl_setopt($ch, CURLOPT_PROXYTYPE, $t); curl_setopt($ch, CURLOPT_PROXY, $proxy.':'.$port); } curl_setopt($ch, CURLOPT_POSTFIELDS, 'passlist='.$passlist.'&checkhash=0&md5md5='.$md5md5);//Передаем пасслист ПОСТ запросом curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie'); $answ=curl_exec($ch); curl_close($ch); $pattern='/<td class="style6"><b>(.+)<\/b><\/b><\/td>/s'; // Шаблон поиска preg_match ( $pattern, $answ, $res ); // Парсим информацию о добавлении найденных паролей $info=strip_tags($res[0],'<br>'); // Удаляем тэги $info=str_replace ('<br>',chr(9).chr(10),$info); //Заменяем <br> на перевод строки $info=str_replace (' ','',$info); // Удаляем табуляцию return convert_cyr_string($info,'w','a').chr(9).chr(10); // Конвертируем кирилицу в 866 (DOS) } GLOBAL $proxy, $port, $t, $md5md5; $ipArray = array_map("trim", file("hcb.ini")); $file_1 = trim($ipArray[1]); // файл с полученными хэшами $file_2 = trim($ipArray[4]); // файл с наденными паролями $dir = trim($ipArray[7]); // директория где расположена EGB $hidden=trim($ipArray[10]); // 0-Запуск EGB без созднания окна 1 - в свёрнутом окне $type = trim($ipArray[13]); // тип очереди хэшей $login = trim($ipArray[16]); //Ваш логин на сервисе $passwd = trim($ipArray[19]); //Ваш пароль на сервисе $proxy = trim($ipArray[22]); //HTTPS Прокси-сервис. $port = trim($ipArray[25]); //Порт прокси $t = trim($ipArray[28]); //Тип прокси, по умалчанию HTTPS $time = trim($ipArray[31]); //Время через которое проверять новые найденные пароли $md5md5 = trim($ipArray[34]); //Время через которое проверять новые найденные пароли if ($t=='') $t='https'; $file_1=$dir.$file_1; // дописываем путь к имени файла @$handle1 = fopen($file_1, "w"); //открываем файл для записи очереди хэшей @$handle2 = fopen($file_2, "a+"); //открываем файл для чтения паролей @$size2=filesize($file_2); //получаем размер файла паролей $day=0; // инициализация счётчика дней работы бота echo "Download hashlist $type ..."; //Выводим в консоль if (fwrite($handle1, get_hash($type)) === FALSE) //скачиваем очередь хэшей { echo "Don`t write to $file_1\r\n"; // Выводим ошибку записи в файл. exit; } else { @$size1=filesize($file_1); //Размер файла очереди в байтах echo "ok!\r\nWrite to $file_1 done! $size1 byte\r\n"; // Успешно записан! } fclose($handle1); //Закрываем файл $WshShell = new COM("WScript.Shell"); //создаём COM объект WScript.Shell if (file_exists($dir.$type.".exe")) //если исполняемый модуль брутфорсера найден.... иначе выход { if ($hidden==0) // запуск без создания окна в фоновом режиме { $command_line=$dir.$type.".exe /C dir /S %windir% ".$dir.$type.".ini ".$dir.$type.".txt"; //формируем командную строку $oExec = $WshShell->Run($command_line, 0, false); // запуск брутфорсера } else // запуск в свёрнутом окне в фоновом режиме { $command_line=$dir.$type.".exe ".$dir.$type.".ini ".$dir.$type.".txt"; //формируем командную строку $oExec = $WshShell->Run($command_line, 7, false); // запуск брутфорсера } echo "EGB Working!\r\n"; // Печатаем в консоль что EGB работает. // ----------- Засекаем время -{Начало}---------------------------- $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $tstart = $mtime; // ------------ Засекаем время {Конец}------------------------------ authorization($login,$passwd); // авторизуемся на сервисе echo "Authorized as:".authorization($login,$passwd); //выводим результат авторизации в консоль do // начало бесконечного цикла проверки изменения файла с паролями { sleep ($time); // спать $time секунд (указывается в настройках - интервал проверки файла паролей на изменение, дозапись данных) // ------- считаем пройденное время --------------Начало $mtime = microtime(); $mtime = explode(" ",$mtime); $mtime = $mtime[1] + $mtime[0]; $tend = $mtime; $totaltime = ceil($tend - $tstart); echo "Days:".$day." Time:".$totaltime." sec.\r"; // Выводим в консоль количество дней и секунд работы бота if ($totaltime==86400) {$day=$day+1; $totaltime=0; authorization($login,$passwd);} // повтрорная авторизация через сутки, когда сдохнет сессия на сервере clearstatcache (); // сбрасываем кэш в файл на диск if ($size2<@filesize($file_2)) // если размер файла увеличился { $n=0; $passlist=''; $fs=fseek($handle2 ,$size2,'SEEK_SET'); //устанавливаем позицию на начало участка дописанных данных while (!feof ($handle2)) // пока не достигнут конец файла { $string=fgets($handle2); //читаем строки (пароли) if ($string!='') {$passlist.=$string; $n=$n+1;} // если строка не пустая, до добавляем, счетчик паролей } $size2=filesize($file_2); //Присваиваем переменной новый размер файла echo "\r\n".convert_cyr_string($passlist,'w','a'); // Выводим список найденных паролей в консоль if ($passlist!=chr(9).chr(10)) // если пасслист не пустая строка из символов возврат каретки и перевод строки { echo "\nNew ".($n)." pass found! Sending..."; //Печатаем отправка паролей echo "Ok!\r\n".put_pass($passlist); //Отправляем пароли на сервис } } } while (true); //конец бесконечного цикла. } else echo "EGB not found! I can`t run it!"; // Выводим , что EGB не найден ?> [заключение]Вот мы и рассмотрели работу cURL по HTTPS протоколу, отправку GET, POST запросов, пример авторизации и работы с кукисами. Теперь Вам не составить труда написать любой клиент, работающий по HTTPS c поддержкой прокси (например https брутфорс или какой-нибудь кликатель) Анализировать передаваеммые данные GET и POST запросов можно через любую программу, перехватывающую их, я использовал плагин для FF UrlParams 2.2.0 P.S. Отдельное спасибо Raz0r за его блог, буду почаще туда заглядывать, что и другим советую, Red_Red1 за ответы на мои некоторые вопросы.
Настройки брута задаёт хэшкрякер самостоятельно индивидуально в ini-файле модуля брутфорса. Как параметры задать, так и будет брутить. На первом этапе распределённой атаки на хэши, можно распределить диапазоны брута между участниками вручную. В итоге каждый будет брутить свой участок диапазона без взаимных пересечений. Отсутствие пересечений - это задача как раз ложится на плечи координатора проекта (а в будущем на сервер - он будет раздавать задания на брут).
я лично предлагаю формировать ini файл на сервере при запросе хэшей и подгружать его вмести с ними(хэшами), тоесть бот с сервера получает Хэш + ini (название думаю можно взять такое-же как и хэш) и EGB уже запускать c этим ini. но правда EGB не очень подходит к даной идее ибо придется заместь одного EGB, запустить 2,4,10,n , что врятле положительно скажется на скорости перебора. =/ -=lebed=-, подскажи плиз такую вещь как - EGB работает так - сгенерил пасс -> пошол проверять его на всем списке хэшей? З.Ы. тут не так программная как организаторская проблема. не злитесь на мну, я не задрот, мне просто действительна понравилась идейка -=lebed=-
Дело в том что весь ini файл раздовать не нужно, ввиду того что у кажого могут быть разные видеокарты, потому в этом ini файле не только параметры атаки, но и настройки брутфорсера: число ядер GPU и потоков. Можно будет раздавать только параметры атаки, а потом модифицировать нужный ini-файл брутфорса. Как работает EGB это надо спрашивать у InsidePro. Но предполагаю что он генерит сразу много паролей в несколько потоков, а потом сравнивает хэши в каждом потоке со списком. P.S. Лучше бота заточить под IGHASHGPU, вот тогда можно раздавать и сам брутфорсер (он бесплатен) и его настройки (параметры брута) он сам всё определяет (параметры видеокарты и её тип: nVidia или ATI) В боте нужно лишь немного поменять: формат списка хэшей у него user:hash и настройки запуска командной строки, а также добавить скачку самого брутфорсера и его параметров брута (задачи). Такую модификацию бота могу сделать в ближайшее время. Будет удобно: настроил бота, запустил и всё. Бот скачал с сервера очередь, параметры брута, сам брутфорс, запустил его с нужными параметрами и начал брутить, переодически отсылая то что он нашёл. Скачать HCB
Вот. Я же говорил что EGB не в тему я сначала хотел написать что только диапазоны модифицировать но потом решил глобально выразиться. (пошол читать доки по IGHASHGPU)
Ну почему же? Каждый из этих двух бутфорсов имеет свои достоинства и не достатки, к примеру EGB имеет пользовательские чарсеты и маски на основе их, но платна. IGHASHGPU имеет только чарсеты, но гибкие маски не позваляет задать, но + то что бесплатна безусловно. Она как никак кстати подходит для организации распределённого перебора на GPU и встраивания в будущий бот-брутер, только вот как бы ещё уменьшить нагрузку на GPU в нём, чтоб брутер работал на 10% мощности, что позволило бы ему оставаться незамеченым в системе...
негодяй.. а кто тут говорил о легальности? у меня в ближайших планах - писать свой брутер на GPU так что твоя тема мне еще также интересна тем что могу почерпнуть нужный функционал, но вот дойдет ли у меня до логического конца еще не знаю , что-то я слегка завяз в логике GPU
Это в будущем , а так будут версии обе, сначала легал конечно. А смысл изобретать велосипед? Можно взять готовый модуль брутфорса, тот же IGHASHGPU и написать только функции бота для его успешного последующего запуска: 1. Определение видеоадаптера (поддерживается/не поддерживается) 2. Апгрейт системы и драйверов, если не обходим. 3. Ну и сами функции бота (приём команд, получени заданий и отправка результатов, запуск брутфорса/остановка)