Пишем клиент для 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, где первая строка описание параметра, вторая - его значение. Все параметры добавлял туда по мере разработки проекта, Вам привожу окончательный вид на данный момент:
Код:
Файл с хэшами (очередь с сервера запишется в него, сохраняется в папку брутфорса, путь указывать не надо)
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 для получения очереди (и не только) таким образом:
Код:
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:
Файл hcb.exe получен 2009.10.15 08:23:52 (UTC)
Текущий статус: закончено
Результат: 1/41 (2.44%)
Форматированные
Печать результатов Антивирус Версия Обновление Результат
a-squared 4.5.0.41 2009.10.15 -
AhnLab-V3 5.0.0.2 2009.10.14 -
AntiVir 7.9.1.35 2009.10.14 -
Antiy-AVL 2.0.3.7 2009.10.15 -
Authentium 5.1.2.4 2009.10.15 -
Avast 4.8.1351.0 2009.10.14 -
AVG 8.5.0.420 2009.10.15 -
BitDefender 7.2 2009.10.15 -
CAT-QuickHeal 10.00 2009.10.15 -
ClamAV 0.94.1 2009.10.15 -
Comodo 2606 2009.10.15 -
DrWeb 5.0.0.12182 2009.10.14 -
eSafe 7.0.17.0 2009.10.14 Suspicious File
eTrust-Vet 35.1.7068 2009.10.14 -
F-Prot 4.5.1.85 2009.10.14 -
F-Secure 8.0.14470.0 2009.10.15 -
Fortinet 3.120.0.0 2009.10.15 -
GData 19 2009.10.15 -
Ikarus T3.1.1.72.0 2009.10.15 -
Jiangmin 11.0.800 2009.10.15 -
K7AntiVirus 7.10.870 2009.10.14 -
Kaspersky 7.0.0.125 2009.10.15 -
McAfee 5771 2009.10.14 -
McAfee+Artemis 5771 2009.10.14 -
McAfee-GW-Edition 6.8.5 2009.10.15 -
Microsoft 1.5101 2009.10.15 -
NOD32 4508 2009.10.14 -
Norman 6.01.09 2009.10.14 -
nProtect 2009.1.8.0 2009.10.15 -
Panda 10.0.2.2 2009.10.15 -
PCTools 4.4.2.0 2009.10.14 -
Prevx 3.0 2009.10.15 -
Rising 21.51.31.00 2009.10.15 -
Sophos 4.46.0 2009.10.15 -
Sunbelt 3.2.1858.2 2009.10.15 -
Symantec 1.4.4.12 2009.10.15 -
TheHacker 6.5.0.2.042 2009.10.14 -
TrendMicro 8.950.0.1094 2009.10.15 -
VBA32 3.12.10.11 2009.10.14 -
ViRobot 2009.10.15.1985 2009.10.15 -
VirusBuster 4.6.5.0 2009.10.14 -
Дополнительная информация
File size: 1940992 bytes
MD5 : 93eec2db8430807c74e43755811ff533
SHA1 : fad3cf6e15b777ed62f3531def196932c22c57b6
SHA256: dca892e6762fda509e7a9d065edc7912731d922b1d317504fd 51e89e678bff4b
PEInfo: PE Structure information
( base data )
entrypointaddress.: 0x572C60
timedatestamp.....: 0x484FDF6F (Wed Jun 11 16:21:35 2008)
machinetype.......: 0x14C (Intel I386)
( 3 sections )
name viradd virsiz rawdsiz ntrpy md5
UPX0 0x1000 0x3AE000 0x0 0.00 d41d8cd98f00b204e9800998ecf8427e
UPX1 0x3AF000 0x1C4000 0x1C4000 7.92 ea71cf96a348295c58a509d39b862875
.rsrc 0x573000 0x16000 0x15A00 5.10 a9ba721f582fbed730f0f561d05e6079
( 13 imports )
> advapi32.dll: RegCloseKey
> comctl32.dll: -
> comdlg32.dll: ChooseColorA
> gdi32.dll: PatBlt
> kernel32.dll: LoadLibraryA, GetProcAddress, VirtualProtect, VirtualAlloc, VirtualFree, ExitProcess
> msimg32.dll: AlphaBlend
> msvcrt.dll: getc
> ole32.dll: OleCreate
> oleaut32.dll: -
> shell32.dll: SHGetMalloc
> user32.dll: GetDC
> winmm.dll: PlaySoundA
> ws2_32.dll: -
( 0 exports )
TrID : File type identification
UPX compressed Win32 Executable (43.8%)
Win32 EXE Yoda's Crypter (38.1%)
Win32 Executable Generic (12.2%)
Generic Win/DOS Executable (2.8%)
DOS Executable Generic (2.8%)
ssdeep: 49152:79O8Q1n7aqJXCcE39S5gQC0RTG/ZHAccWOtssTuQ8GO:g8M7tJXm39QC0ZGRAccXCsyQ
PEiD : -
packers (Kaspersky): PE_Patch.UPX, UPX
packers (F-Prot): UPX
RDS : NSRL Reference Data Set
P.P.S. Если траблы с запуском установите Open SSL Win32 и Visual C++ 2008 Redistributables, скачать тут: http://www.slproweb.com/products/Win32OpenSSL.html