Содержание статьи
Если честно, я люблю Microsoft. Люблю давно, беззаветно, не расстаюсь с виндой и даже приобрел себе лицензионную версию Семерки. И тем не менее, мне кажется, что разработкой операционной системы в Майкрософте занимаются лучшие разработчики, а разработкой браузера… ну, скажем так, троечники.
Ода премудрому Smartscreen’у
Довелось мне по роду своей милицейской деятельности исследовать SmartScreen — это система в Internet Exlorer, которая должна защищать нас от «злых» мошенников со сплойтами на сайте. SmartScreen при открытии любой странички посылает запрос на адрес urs. microsoft.com приблизительно такого содержания:
POST /urs.asmx?MSPRU-Client-Key=l7m7EvM2K/IVNQCBF7AVPg%3d%3d&MSPRU-Patented-Lock=XdXWSI8WgDg%3d
HTTP/1.1
Host: urs.microsoft.com
<soap:Envelope ...>
<soap:Body>
<Lookup xmlns="http://Microsoft.STS.STSWeb/">
<r soapenc:arrayType="xsd:string[1]">
<string>http://tutamc.com</string>
</r>
<ID>{B3BB5BBA-E7D5-40AB-A041-A5B1C0B26C8F}</ID>
<v soapenc:arrayType="xsd:string[5]">
<string>7.0.6004.6</string>
<string>7.00.5824.16386</string>
<string>7.0.6000.16386</string>
<string>6.0.6000.0.0</string>
<string>en-us</string>
</v>
</Lookup>
</soap:Body>
</soap:Envelope>
В данном запросе IE отсылает URL сайта, несколько непонятных цифр и хешей, и, само собой, немного инфы о нас — такой, как IP-адрес. В ответ мы получаем ответ — «хороший» это сайт или «плохой». Только из-за этой системы блэклистов, построенной на онлайн-запросах, я не юзаю данный браузер. Не очень-то приятно, что кто-то может по IP-адресу узнать историю моих посещений. Конечно, мы можем отключить данный функционал в настройках браузера, но тогда останемся полностью беззащитными, поэтому выбор таков: либо палиться, либо подвергаться опасности, либо сменить браузер. «Условия использования», которые идут со SmartScreen, заверяют, что полученная инфа не будет использоваться и что все это хозяйство абсолютно анонимно. Нам бы теоретически следовало поверить в это :), но мои эксперименты показывают, что это утверждение не совсем соответствует действительности. Однако, пока опустим данный факт, оставив его для будущих статей.
Аналогичный метод проверки URL’ов на блэки использует последняя Opera. Ничего не понимаю! На мой взгляд, нормальная система — это когда браузер скачивает базу блэков на локальный комп и там уже их тестирует. Так, как это реализовано в браузерах Chrome и FireFox. Еще одним нововведением в IE 8 стал Штирлиц-режим (InPrivate Browsing), при использовании которого теоретически на компе ничего не должно сохраняться. Мне захотелось исследовать, как совместно работают эти две системы.
Окей, задумано-сделано. Я перешел в Штирлиц-режим, зашел на сайт из блэклиста, и… IE показал красное окошко. Получается, и в Штирлиц-режиме SmartScreen работает как обычно — Майкрософт знает, какие сайты мы посещаем.
Ну хорошо, ставим в уме еще один минус и продолжаем. Для детального исследования я навесил на IE снифер для мониторинга запросов. Открыл сайт — запрос идет на urs.
microsoft.com. Закрыл браузер, снова открыл тот сайт… запрос не идет. Значит, результат закэшировался. А работает ли кэширование в Штирлиц-режиме? Дрожащими (от волнения, а не от похмелья) руками проверяю эту гипотезу. Вот черт! В InPrivat’е кэширование тоже работает!
Пробую закрыть браузер и открыть заново — и все еще немного надеюсь, что кэш очистится. Но нет. Он остается. То есть, после того как ты походишь в приватном режиме по сайтам подозрительного содержания, теоретически завтра к тебе могут прийти компетентные личности и узнать, что именно ты был вчера на сайте похеканного банка.
Пруфы в студию
А что, если я ошибаюсь? Пожалуй, нам нужны доказательства. И лучшим доказательством будет прога, которая сможет показать нам список сайтов, посещенных юзером ушастым в особо приватном режиме от Майкрософт.
Идеальный вариант — найти кэш и посмотреть в нем конкретные URL’ы. Чтобы его найти, я натравил файловый анализатор на IE, и после просмотра логов нашел такой интересненький файлик:
C:\Documents and Settings\admin\Local Settings\Temporary Internet Files\AntiPhishing\2CEDBFBC-DBA8-43AA-B1FD-CC8E6316E3E2.dat (адрес в XP).
После удаления этого файла оказалось, что IE делает повторный запрос.
Но, к сожалению, это не он, поскольку файл не изменяется ни по размеру, ни по содержанию. Найти настоящий кэш мне не удалось. Но какой я был бы хакер, если бы не смог найти обходной вариант?
Вспомни мою статью о нестандартном использовании Socks-сервера, следуя этому принципу можно написать прокси-сервер, который будет смотреть, пошел запрос на urs.microsoft.com, или нет. Если запрос был, значит, на сайт юзер еще не заходил, а вот если запроса нет, то это значит, что юзер раньше был на этом сайте, и проверка сайта на блэки взялась из кэша!
Мир, труд, май, Python!
Написать прокси-сервер с нуля несложно, но лень. Поэтому взял для нашего эксперимента TinyHTTPProxy, написанный, конечно же, на Python’e. В нем есть функция do_CONNECT, которая обрабатывает HTTPS-запросы. Если заставить IE использовать наш прокси, то эта функция будет вызываться каждый раз при запросе urs.microsoft.com.
Для передачи полученной информации другим программам можно использовать мютексы, базу данных или еще что-то, но мы пойдем легким путем и заюзаем файлы как флаги. Если файл есть — запрос к Майкрософту был, файла нет — значит, и запроса не было.
def do_CONNECT(self):
open('d:\\test.txt', 'w+').close()
# …
А теперь напишем скрипт, который будет открывать в IE сайты, и проверять, есть ли наш файл-флаг test.txt. Если файла нет, то выведем сообщение о том, что юзер раньше на нем был:
urls = (
'http://not_porn1.com/',
'http://super_puper_porn1.com/',
)
for url in urls:
time.sleep(1)
try:
os.remove('d:\\test.txt')
except: pass
test_url(url)
if not os.path.exists('d:\\test.txt'):
print "U were on this site: %s"%url
Осталось лишь написать функцию test_url, которая запустит IE с нашим URL. Знаешь, кажется просто открывать другие приложения, и раньше я думал, что Python сможет запустить IE даже без дополнительных либ, но натолкнулся на маленькую «фичу» — если я запускаю IE (или любую другую программу), то скрипт не завершится без закрытия IE. Поэтому для запуска лучше использовать модуль pywinauto (http://pywinauto.openqa.org), который использует WinAPI. Получим такой код запуска IE:
prog_ie = r"C:\Program Files\Internet Explorer\iexplore.exe"
application.Application.start("%s %s"%(prog_ie,url.decode(‘utf-8’)))
А закрывать браузер мы также будем через WinAPI, для чего подойдут маленькие функции:
import win32gui
import win32con
def window_enumeration_handler_ie(hwnd, resultList):
if string.find(win32gui.GetWindowText(hwnd), \
"Internet Explorer") != -1:
resultList.append(hwnd)
else:
None
def close_program_ie():
ie_windows = []
win32gui.EnumWindows(window_enumeration_handler_ie, ie_windows)
for i in ie_windows:
win32gui.SendMessage(i,win32con.WM_CLOSE,0,0)
Функция window_enumeration_handler_ie получает хендл окна и проверяет title, если это заголовок IE, то этот хендл добавляется к списку. Данная функция используется в функции close_program_ie, которая через WinAPI EnumWindows перебирает все окна и возвращает список окон IE. Дальше всем этим окнам мы посылаем сообщение WM_CLOSE, что аналогично нажатию пользователем кнопки «закрыть окно».
Собрав все в кучу, получим нужную нам test_url:
import win32gui
import win32con
from pywinauto import application
def test_url(url):
prog_ie = r"C:\Program Files\Internet Explorer\iexplore.exe"
application.Application.start("%s %s" % (prog_ie,url.decode('utf-8')))
time.sleep(5)
close_program_ie()
time.sleep(2)
Полностью готовый скрипт прокси-сервера и сам тестирующий скрипт лежат на диске. Кроме того, по старой-доброй традиции я снял для тебя видео и ты сможешь увидеть их работу.
Я же еще долго продолжал тестировать свой IE, и с каждым разом все больше огорчался. Оказалось, что даже при использовании встроенной функции «Очистить историю», кэш не удаляется. Пару раз у меня получилось так, что после нажатия в IE «Reset IE», он долго что-то делал с винчестером, но этот кэш все равно не удалил. Может, это лишь неправильное совпадение: звезд на небе было, а IE тут и ни причем. Я верю в чудеса :).
Парочка плюсов
У меня есть стойкое ощущение, что под конец этой статьи я должен объявить о нахождении в IE какого-нибудь важного плюса. Я долго думал и в результате пришел к выводу, что в Ослике их есть целых два:
- первый — это тот факт, что система от Майкрософта очень неплохо работает, быстро и оперативно добавляя «плохие» домены в блэклист;
- второй плюс придется по душе обладателям плохого интернета, с маленькой скоростью и большим количеством (ни единых!) разрывов.
Мне кажется, что в таких условиях IE работает лучше, чем другие браузеры. Я привык называть режим InPrivate Browsing «Порно-режимом», но мне сказали что это слишком пошло (вообще-то я этого не говорил, это ты сам придумал — прим.ред), пришлось изменить его шуточное название на Штирлиц-режим.
Принцип работы Safe Browsing от Google
Работа системы блэклистов от Гугла построена на основе локальных баз блэков. По адресу http://safebrowsing.clients.google.com/ браузеры Chrome и FireFox получают обновления баз данных блэклистов в формате md5 от url. Дальше браузер берет md5 от каждого адреса, на который заходит, и смотрит, есть ли данный md5 в базе. Если есть — значит, сайт «плохой». Это первая версия их API.
Вторая версия несколько сложнее, но принцип остался тот же. О новой версии можно почитать здесь — http://code.google.com.
Links
- Описание работы Safe Browsing от Google http://code.google.com/apis/safebrowsing
- Модуль для Python для тестирования приложений http://pywinauto.openqa.org