Всем, кто бродит по инету, иногда бывает
просто необходимо заполучить чужой пароль.
Всякие мутанты в чатах докопаются, или твоя
подружка изменяет тебе с кем-нибудь из
Сибири с помощью е-маил’а. Вот бы почитать, о
чем же они там друг с другом болтают. Да и
пара-тройка номеров для аськи не будет
лишней. Но если для icq найти программу для
подбора пароля в инете не проблема, то для
чата из твоей родной Тмутаракани просто
нереально. Выход есть: попроси друга
сделать для тебя такую прогу. Если этот
вариант тебе подходит, то ты зря читаешь эту
статью. Здесь тебя долго и нудно будут
заставлять делать все самому. Но если ты все
же решился на это, твои усилия не пропадут
даром — у тебя появится собственная
программа для подбора паролей, и плюс ко
всему она будет пригодна и для чатов, и для е-майлов
(которые через www), и для всего остального,
что есть работать через www.

Анализируй это, анализируй то

Итак, приступим к сдаче анализов. Для начала
разберемся, как работают все эти чаты и т.п.
Мы заходим на страницу, вводим логин и
пароль и нас впускают, вернее не впускают.
Пробуем еще раз — опять не впускают. Да,
подбор вручную — гиблое дело, поэтому
оставим его на крайний случай :). После
нажатия кнопки, серверу отправляются все
данные, которые мы ввели. Делаться это может
двумя способами: POST и GET, о которых ты уже
скорее всего слышал не раз, и даже слышал,
что POST передает параметры в теле сообщения,
а GET в заголовке, но что это может значить
только догадывался. Чтобы понять, посмотрим
на формат пакетов, посылаемых www-серверу.
Пример заголовка запроса GET:

GET /login.php?name=Glasha&password=kawabunga HTML/1.0
Accept: text/html
Accept: image/gif

Заголовок заканчивается
последовательностью <cr><lf><cr><lf>,
т.е. двойным переводом строки. В первой
строке собственно то, что нам нужно. login.php —
скрипт, которому передаются параметры в
виде "параметр=значение" и отделяются
от адреса символом "?". Сами пары "параметр=значение"
разделяются символом "&". Строки "Accept:
[…]" — это тоже часть заголовка, но для
данной задачи они не важны, т.к. не
обязательны и описывают тип данных, которые
может распознать твой браузер. А тело
сообщения в данном случае пусто. Теперь
посмотрим на пример запроса POST:

POST /cgi-bin/login.cgi HTTP/1.0
Accept: text/html
Accept: image/gif
Content-Length: 36

name=Glasha
&password=kawabunga

Посмотрев на первую строку заголовка мы
видим, что параметры там уже не записаны. В
заголовке появилась новая строка: Content-Length,
длинна тела сообщения, которая должна
обязательно быть указана, если используем
этот метод. Затем, после двойного перевода
строки (<cr><lf><cr><lf>), идет тело
сообщения, и все параметры скрипта записаны
в нем. С форматом запросов вроде бы
разобрались, идем дальше.

Распотрошить дабы узнать

Теперь выясним, что нам нужно передавать
скрипту. Для этого просмотрим html-код
страницы, на которой расположена форма для
входа. Ищем внутри нужную нам форму и
смотрим имена всех параметров. Допустим,
что мы нашли что-то такое:

<form name=loginform action=http://chat.server.com/userservice.php method=post>
<input type=hidden name=action value=login>
<input type=text name=login value="" size=35 maxlength=15>
<input type=password name=password value="" size=35 maxlength=15>
<input type=submit value="Войти">
</form>

В данном случае скрипту передаются три
параметра: action, login, password. Запрос методом GET
будет выглядеть следующим образом:

GET /userservice.php?action=login&login=Glasha&password=kawabunga HTTP/1.0

А методом POST так:

POST /userservice.php HTTP/1.0
Content-Length: 52

action=login
&login=Glasha
&password=kawabunga

Как видишь, запрос GET гораздо меньше и проще,
и content-length считать не надо. Хотя реализация
POST не на много сложнее, все же будем делать
GET. Некоторым сервакам есть разница, каким
методом им отправляется запрос, поэтому,
если приспичит, сможешь сделать его сам.

Кодинг

Поговорим теперь о том, как мы будем делать
наш брутфорс. Работать будем с сокетами,
поэтому понадобятся заголовочные файлы
WinSock2 для Delphi (ссылка в конце статьи), сетевые
функции описываться не будут, т.к. их
описание можно с легкостью найти в инете.
Притом человек, немного знающий английский
и не первый раз включивший Delphi, без труда
разберется со смыслом функций, глядя на
исходник.

В отдельном массиве будем хранить символы
для перебора. Это будут как бы цифры из
нашей системы счисления. Мы должны задать
начальное число и потом увеличивать его на
единицу (т.е. задаем строку, с которой
начинаем перебор, состоящую из символов из
нашего массива). Допустим, что все уже
задано. Процедура, увеличивающая строку на
единицу (не длину строки, а значение "числа-строки")
представлена в листинге
1
. В ней реализовано обычное прибавление к
числу единицы столбиком (ты, наверное, и не
думал, что понадобится считать столбиком,
чтобы прибавить к числу единицу :). Но
перебор должен когда-то закончиться,
поэтому нам нужно задать строку, на которой
надо остановиться. Она также должна
состоять из символов из набора. Понадобится
функция сравнения строк в нашей системе
счисления. Перебор будет идти до тех пор,
пока текущая строка не станет больше
конечной. Функция приведена в листинге
2
.

Переходим к следующему. Наша программа
должна работать с любым сервером, поэтому
нам нужно ввести много разной шняги. Во-первых
это адрес сервера, во-вторых путь и имя
скрипта, которому передаются параметры. В-третьих
— сами параметры и их значения, а один
параметр, по которому будет вестись перебор,
пусть будет содержать некую особую
последовательность символов в качестве
значения, чтобы мы могли его распознать. Для
ввода параметров и значений будем
использовать компонент типа TStringGrid. Также
нужно ввести набор символов. Как вариант
можно сделать набор чекбоксов, или
попросить юзера самого ввести нужный набор
символов. Нужно ввести начальную и конечную
строки. Не помешает и перебор по словарю,
тогда понадобятся два таймера — один для
полного перебора, второй для перебора по
словарю. Нужно ввести частоту таймера, и,
наконец, выводить текущий пароль. Также
нужно знать ответ сервера в случае, когда
ввели неправильный пароль. Идея такова:
если в ответе от сервера на текущий пароль
нет строки, которая есть в ответе на
неправильный пароль, то текущий пароль
подозреваем на правильный. Тут может
случиться неприятная ситуация. Многие
страницы сильно нагромождены, и нужная нам
уникальная строка в ответе (типа "Неправильный
пароль" или что-то в этом роде) может
находиться очень далеко от начала и не
поместиться в буфер. Поэтому нужно будет
поэкспериментировать с размером буфера.
Лучше посмотреть html код, найти в нем нужную
строку и оценить, насколько далеко она
отстоит от начала. Не стоит забывать и про
заголовок ответа сервера. Размести все
нужные компоненты примерно как на рисунке.

Создай процедуру для события onClick для
кнопки "Выбрать" и в теле напиши:

if OpenDialog1.Execute then Edit4.Text:=OpenDialog1.FileName;

Edit4 у меня это поле, куда нужно вводить имя
файла словаря. В компонент StringGrid1 будем
вводить параметры и их значения (в левую
колонку имена, в правую значения). Установи
у него FixedCols в 0, а ColCount в 2, установи в Options
goEditing в true, иначе нельзя будет вводить туда
свои значения. Значение параметра, который
нужно перебирать, вводится в компонент Spesial
(мы его так назвали) типа TEdit (на рисуке он
находится под строкой "Спец строка").
Например, чтобы перебрать параметр password
нужно в Spesial ввести скажем "@#$", а затем
в таблице в качестве значения password ввести
"@#$". В примере (адрес, по которому его
можно скачать — в конце статьи) количество
параметров вводится в компонент Edit1. Для
него создадим процедуру onChange и поместим
внутрь текст из листинга
3
. Теперь количество строк у StringGrid1 будет
равным числу, которое мы введем в Edit1. Пару
слов о начальном и конечном значениях.
Сделаем так: если соответствующая галочка
установлена, то будем считать, что в поле
введена длинна строки, в противном случае —
сама начальная или конечная строка.

Черновую работу сделали, приступим к
основной части. Опишем константы и
переменные (они глобальные, помести их
после implementation):

const
BS = 1024; /
/размер буфера
для передачи, со значением лучше
поэкспериментировать

Lats = ‘abcdefghijklmnopqrstuvwxyz’; //
наборы
символов

Latb = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
Num = ‘0123456789’;

var
FirstStart: boolean; /
/это чтобы
можно было делать паузу

Str1, Str2, PswStr, EndPswStr, ChrSet: string; //
для
пароля

WLfile: Text; //
файл словаря
info: TWSADATA; //
для работы с
сокетами

Sock: TSocket;
Addr: TSockAddr;
Buf: array[0..BS-1] of char; //
буфер
для передачи

Connected: boolean; //
удалось ли
законнектиться

Создадим основную процедуру, которая будет
отправлять серверу запрос и принимать
ответ. Назовем ее TryPass, она представлена в листинге
4
. Создадим еще процедуру проверки ответа
и назовем ее CheckPass, ее содержимое тоже в
листинге 4. Теперь зададим, что должны будут
делать наши таймеры. Процедуры Timer1Timer и
Timer2Timer в листинге
5
. Timer1 будет работать при прямом переборе,
а Timer2 при переборе по словарю. Теперь нужно
задать процедуры, которые будут
выполняться по событию onClick для кнопок "Пуск",
"Пауза" и "Стоп" (в примере это
Button2, Button3, Button4 соответственно). "Пуск"
должен формировать набор символов,
начальный и конечный пароль, заполнить
структуру Addr, запустить таймер. Ее листинг номер
6
. Кнопки "Пауза" и "Стоп" должны
останавливать таймер, "Стоп" еще
должен присвоить FirstStart значение истины.
Чтобы разобраться смотри исходник и все
станет понятно. Процедуры для этих двух
кнопок в листинге
7
. Осталось только сделать, чтобы при
создании формы переменным присваивались
начальные значения. Для формы создай
процедуру по событию onShow и запиши туда
следующее:

StringGrid1.Cells[0,0]:=’Имя’; //названия
колонок

StringGrid1.Cells[1,0]:=’Значение’;
WSAStartup(MAKEWORD(2,0), info); //
начинаем
процесс работы с библиотекой winsock

FirstStart:=true; //еще не запускали
Timer1.Enabled:=false;
Timer2.Enabled:=false;

А в процедуру по событию onClose нужно написать
всего одну строчку:

WSACleanup;

Вот и готов наш брутфорс к бою. Если он у
тебя не работает, на это может быть
несколько причин: в разделе uses не стоит
winsock2, не подключен к инету, плохая связь, не
правильно найдены параметры из html-страницы,
кривые руки. Как заполнить окно брутфорса
для примера, который я приводил выше, смотри
на рисунке:

http://www.cydsoft.com/vr-online/download.htm
— заголовочные файлы -> WinSock2
http://webhome.fromru.com/_files/xak/brutesrc.zip
— полный исходник примера

1 комментарий

  1. Sloki

    30.10.2017 at 17:34

    Первая ссылка невалидная, вторая ведёт на левый сайт.

Оставить мнение

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …