Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Пишем консольный клиент для Web-сервиса на примере Hash Cracking Bot (HCB) (https://forum.antichat.xyz/showthread.php?t=148428)

-=lebed=- 15.10.2009 12:14

Пишем консольный клиент для Web-сервиса на примере Hash Cracking Bot (HCB)
 
Пишем клиент для 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($chCURLOPT_URL$uri); // Устанавливаем опцию, т.е. формируем хидеры запроса
   
if ($proxy!=''// Если прокси задан, то задаём  два доп. параметра
    
{
    
curl_setopt($chCURLOPT_PROXYTYPE$t); // Устанавливаем тип прокси
    
curl_setopt($chCURLOPT_PROXY$proxy.':'.$port); //Устанавливаем IP и PORT Прокси-сервера
    
}
   
curl_setopt($chCURLOPT_TIMEOUT120); // Устанавливаем таймаут, в течении которого cRUL будет ждать получения всего ответа от сервера
   
curl_setopt($chCURLOPT_RETURNTRANSFER1); // вернуть результат запроса, а не выводить в браузер.
   
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); // Не проверяем хост (на hashcracking.info самоподписанный просроченый сертификат)
   
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE); // Удалённый сервер не будет проверять наш сертификат
   
$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($handle1get_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_line0false); // запуск брутфорсера
    
}
else  
// запуск в свёрнутом окне в фоновом режиме
    
{
        
$command_line=$dir.$type.".exe ".$dir.$type.".ini ".$dir.$type.".txt"//формируем командную строку
        
$oExec $WshShell->Run($command_line7false); // запуск брутфорсера
    
}

    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

POS_troi 15.10.2009 13:31

все зависит от компилятора + тотже UPX

-=lebed=- 15.10.2009 13:35

Цитата:

Сообщение от DeluxeS
Очень понравилось. А сколько бот будет весить , т.е. сам билд? :) Который нужно будет грузить :)

Щас весит много (1.8 Мб.) ибо php->exe (курл+ssl либы) поэтому это как бы легальный бот ;) Для полноценного нормального бота всё надо переписать на С++. Кроме того впихнуть туда много доп. функций: определения наличия видеодаптера в системе, апдейт системы, дров, если необходим, для норм. работы брутфорсера, приёма комманд от главного сервера и т.д.

P.S. и Это... самого брутфорсера пока там нет! Он только запускает EGB-брутфорс (уже должен стоять на компе).

Silly.worm 15.10.2009 13:53

Продолжение в студию :)
ТС, интересная мысль возникла при прочтении, стукни лс)

POS_troi 15.10.2009 14:17

2Lebed

Цитата:

Тут надо определится как мы будем отслеживать какие пароли нашёл брутфорсер.
А не легче будет просто очищать файл после успешной отправки сереверу?
ввести на сервере дополнительно функцию положительного ответа о приеме данных

"считаем сколько пасов в файле - Соединяемся - отправляем - ждем подтверждения с количеством - если количество совпадает то рвем соединение - очищаем файл - на сервере помечаем как найденные и больше не даем их ботам" (это как я вижу)/

Цитата:

Оно нужно?
конечно нужно, у самого давно уже лежит эта идея но все нет времени заняться этим, так что если что то помогу чем могу.

-=lebed=- 15.10.2009 15:12

Как бы коллекция реалрассов не мешает на локальном компе (потом можно юзать как словарь для гибридной атаки). Можно поставить удаление как опцию, хотя оно и не нужно. Тут ещё такой смысл, что могут работать несколько брутфорсов и писать результат в один и тот же файл! Ну вот бот и будет из общей кучи забирать пароли.
Есть ответы от сервера, примерно так выглядит всё:
Код:

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. Продолжение будет завтра или сёдня вечером, (пара функций дома осталась)

POS_troi 15.10.2009 16:27

Цитата:

Очередь хэшей чистится, другой бот зайдя за хэшами уже не получит те хэши от которых пароли нашлись и отправились уже.
это хорошо но тогда нужно отслеживать время "взяли тогда-то" и например через определенное время проверять стоит ли пометка о возврате сбрученого хэша .
Если его не вернули то снимать пометку о том что он взятый и отдавать обратно в очередь ибо если этого не делать то может получиться что человек взял хэш а у него бумсь и слетела винда - хэши так и останутся висеть где то в воздухе.
(мысли в слух - просто строю картинку у ся в голове)

Цитата:

Ещё раз повторяю это легал бот
Цитата:

Как бы коллекция реалрассов не мешает на локальном компе (потом можно юзать как словарь для гибридной атаки).
Я и не говорю о нелегале, а про коллекцию как-то и не подумал - звыняюсь.

З.Ы. уже как две недели колупаю CUDA под C++

-=lebed=- 15.10.2009 16:38

Не... хэши остаются висеть в очереди на сервисе для других пользователей, бот их не удаляет оттуда, просто скачивает копию себе для локального брута, найденные пассы потом отправляет обратно на сервер. Если хэши от паролей на момент отправки всё ещё находятся в очереди, то происходит успешное добавление паролей в базу и удаление хэшей из очереди.

POS_troi 15.10.2009 18:09

ну тогда боту, вместе с хэшем нужно передавать еще и диапазон для сканирования ибо получится что куча ботов будет брутить один и тот же диапазон что сведет на НЕТ всю идею распределенности.

(просто ссылке что в коде, по "md5" я увидел только хэши а EGB начнет брутить с первого символа диапазона, или я ошибаюсь насчет EGB?)

-=lebed=- 15.10.2009 21:16

... продолжение как и обещал.
 
... Для отправки паролей функцией put_pas($passlist) необходима авторизация на сервисе, оформим её отдельной функцией:
PHP код:

function authorization($login,$passwd)//Функция заливки найденных паролей на hashcracking.info по https
  
{
   GLOBAL 
$proxy$port$t;
   
$ch curl_init();
   
$uri='https://hashcracking.info/';
   
curl_setopt($chCURLOPT_URL$uri);
   
curl_setopt ($chCURLOPT_HEADER1);
   
curl_setopt ($chCURLOPT_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($chCURLOPT_TIMEOUT10);
   
curl_setopt($chCURLOPT_RETURNTRANSFER1);
   
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);
   
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
   if (
$proxy!='')
        {
        
curl_setopt($chCURLOPT_PROXYTYPE$t);
        
curl_setopt($chCURLOPT_PROXY$proxy.':'.$port);
        }
   
curl_setopt($chCURLOPT_POSTFIELDS"login=".$login."&passwd=".$passwd."&Submit='войти");//Устанавливаем данные POST полей (логин и пасс)
   
curl_setopt($chCURLOPT_COOKIEJAR'cookie'); // сохраняем кукисы в файл
   
curl_setopt($chCURLOPT_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($chCURLOPT_URL$uri);
   
curl_setopt ($chCURLOPT_HEADER1);
    
   
curl_setopt ($chCURLOPT_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($chCURLOPT_TIMEOUT120);
   
curl_setopt($chCURLOPT_RETURNTRANSFER1);
   
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);
   
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
   if (
$proxy!='')
        {
        
curl_setopt($chCURLOPT_PROXYTYPE$t);
        
curl_setopt($chCURLOPT_PROXY$proxy.':'.$port);
        }
   
curl_setopt($chCURLOPT_POSTFIELDS'passlist='.$passlist.'&checkhash=0&md5md5='.$md5md5);//Передаем пасслист ПОСТ запросом
   
curl_setopt($chCURLOPT_COOKIEJAR'cookie');
   
curl_setopt($chCURLOPT_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($chCURLOPT_URL$uri); // Устанавливаем опцию, т.е. формируем хидеры запроса 
   
if ($proxy!=''// Если прокси задан, то задаём  два доп. параметра 
    

    
curl_setopt($chCURLOPT_PROXYTYPE$t); // Устанавливаем тип прокси 
    
curl_setopt($chCURLOPT_PROXY$proxy.':'.$port); //Устанавливаем IP и PORT Прокси-сервера 
    

   
curl_setopt($chCURLOPT_TIMEOUT120); // Устанавливаем таймаут, в течении которого cRUL будет ждать получения всего ответа от сервера 
   
curl_setopt($chCURLOPT_RETURNTRANSFER1); // вернуть результат запроса, а не выводить в браузер. 
   
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); // Не проверяем хост (на hashcracking.info самоподписанный просроченый сертификат) 
   
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE); // Удалённый сервер не будет проверять наш сертификат 
   
$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($chCURLOPT_URL$uri); 
   
curl_setopt ($chCURLOPT_HEADER1); 
   
curl_setopt ($chCURLOPT_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($chCURLOPT_TIMEOUT10);  // Таймаут на авторизацию
   
curl_setopt($chCURLOPT_RETURNTRANSFER1); // вернуть результат запроса, а не выводить в браузер.
   
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); // Не проверяем хост (на hashcracking.info самоподписанный просроченый сертификат) 
   
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);  // Удалённый сервер не будет проверять наш сертификат 
   
if ($proxy!=''
        { 
        
curl_setopt($chCURLOPT_PROXYTYPE$t);  // тип прокси
        
curl_setopt($chCURLOPT_PROXY$proxy.':'.$port);  // прокси:порт
        

   
curl_setopt($chCURLOPT_POSTFIELDS"login=".$login."&passwd=".$passwd."&Submit='войти");//Устанавливаем данные POST полей (логин и пасс) 
   
curl_setopt($chCURLOPT_COOKIEJAR'cookie'); // сохраняем кукисы в файл 
   
curl_setopt($chCURLOPT_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($chCURLOPT_URL$uri); 
   
curl_setopt ($chCURLOPT_HEADER1); 
     
   
curl_setopt ($chCURLOPT_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($chCURLOPT_TIMEOUT120); 
   
curl_setopt($chCURLOPT_RETURNTRANSFER1); 
   
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE); 
   
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE); 
   if (
$proxy!=''
        { 
        
curl_setopt($chCURLOPT_PROXYTYPE$t); 
        
curl_setopt($chCURLOPT_PROXY$proxy.':'.$port); 
        } 
   
curl_setopt($chCURLOPT_POSTFIELDS'passlist='.$passlist.'&checkhash=0&md5md5='.$md5md5);//Передаем пасслист ПОСТ запросом 
   
curl_setopt($chCURLOPT_COOKIEJAR'cookie'); 
   
curl_setopt($chCURLOPT_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($handle1get_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_line0false); // запуск брутфорсера 
    

else  
// запуск в свёрнутом окне в фоновом режиме 
    

        
$command_line=$dir.$type.".exe ".$dir.$type.".ini ".$dir.$type.".txt"//формируем командную строку 
        
$oExec $WshShell->Run($command_line7false); // запуск брутфорсера 
    


    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=0authorization($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 за ответы на мои некоторые вопросы.


Время: 02:37