Содержание статьи
Как провести SDRF, используя PDF
Атака SDRF (Same Domain Request Forgery) не нова и появилась уже лет пять назад. Помнится, я присутствовал на выступлении d0znpp из ONsec’а на Сhaos Constractions 2010 года, тогда и услышал впервые сам термин и познал все радости самой атаки. Надо сказать, что веб‑приложений и сайтов, уязвимых к ней, нашлась масса, и они систематически до находятся сих пор. Несмотря на то что сама она когда‑то описывалась на страницах «Хакера», позволю себе повториться и добавлю немного новых подробностей.
Если говорить без глубоких деталей, то SDRF во многом похожа на всем известную атаку CSRF (Cross Site Request Forgery). Важнейшее различие здесь в том, что при CSRF мы заставляем браузер жертвы отправлять запросы с первичного сайта (на который зашел пользователь) на другой (где и нужно что‑то выполнить с правами юзера). Ты зашел на сайт А, а на нем находится код, который заставит твой браузер отправить на сайт Б какой‑то запрос. Самый важный компонент CSRF — куки при запросе на сайт Б будут подставлены браузером автоматически, а потому запрос будет обработан на сайте Б.
Так вот, SDRF — это аналогичная атака, но проводится она только внутри контекста одного сайта Б. По сути, мы должны впихнуть на сайт Б что‑то, что сможет отправлять запросы. Если сравнить с CSRF, роль сайта А здесь играет сайт Б, а роль сайта Б — какой‑то исполняемый код. Теоретически если мы можем вставить свой JavaScript- или HTML-код, то это и будет SDRF (ну и по факту также XSS). Но чаще всего SDRF проводится за счет использования сторонних плагинов, поддерживаемых браузером, например Adobe’овских.
Например, если мы можем загрузить на атакуемый сайт PDF’ку (или флешку), то, когда жертва откроет ее в браузере, PDF’ка сможет без каких‑либо предупреждений пользователю отправлять на сайт запросы (SOP’у не на что ругаться — все в рамках одного сайта), причем браузер жертвы опять‑таки автоматически будет подставлять куки к запросам. Но еще круче то, что, в отличие от CSRF, мы получаем возможность еще и читать ответы на наши запросы. А это дает нам возможность обходить методы защиты от CSRF с помощью токенов, так как мы можем отправить запрос, прочитать ответ, вынуть из него токен и отправить уже запрос вместе с ним. Ну а раз это все — один домен, то и проверка заголовка Referer не поможет.
Немного об ограничениях. Для проведения атаки нам чаще всего необходима возможность загружать PDF’ки, SWF’ки на атакуемый сайт. Притом важно, чтобы они попадали на тот же домен, который мы атакуем: секьюрная практика говорит нам, что пользовательский контент надо хранить на другом специальном домене (который не содержит ни функционала, ни критичных кук). Второе ограничение возникает, если атакуемый сайт отдает нам наш контент с заголовком Content-Disposition: attachment (или некорректным Content-Type), это указывает браузеру, что файл надо скачать, а не открыть с помощью соответствующего плагина.
Немного технических аспектов. С флешками все ясно и просто. Функционал для генерации запросов и чтения ответов есть в ActionScript и хорошо документирован. А вот с PDF’ками… В PDF как бы разрешается вставлять яваскрипт, но он живет там в жесткой песочнице, которая систематически меняется, — совсем не гуд. А вот FormCalc — еще один поддерживаемый Adobe язык — позволяет делать необходимое: посылать произвольные GET-/POST-запросы, читать и парсить ответы. Насколько мне известно, эта особенность ничуть не поменялась с 2010 года. Так что пример от d0znpp все еще должен отлично работать.
Теперь немного новостей. В 2010 году SDRF-атаке (через PDF) были подвержены все браузеры, в которых был установлен плагин от Acrobat Reader, исключением был IE. Фишка с ним была в том, что по умолчанию он PDF’ку сначала скачивал, а потом уже открывал через плагин. То есть открывалась она в другом сайте (локально), и тогда уже вмешивалось Same Origin Policy, из‑за которого перед отправкой запроса PDF’ка запрашивала у пользователя разрешение на него.
Но вот миновали годы, поменялись браузеры и соотношение их использования у пользователей. Кое‑что поменялось и с PDF’ками. В браузерах FireFox и Chrome теперь по умолчанию (даже если установлен плагин Acrobat Reader) для открытия PDF’ок используется специальная JS-либа — PDF.js, то есть сам браузер парсит и отображает PDF’ки. Понятное дело, что FormCalc’ом там и не пахнет, а JavaScript жестко порезан (хотя качество этого дела требует проверки). Зато IE исправился и теперь имеет обычное поведение: при открытии PDF’ок сразу открывает плагин Acrobat Reader’а. Получается, возможность провести атаку уменьшилась в одном месте, но прибавилась в другом (особенно в корпоративном секторе, плотно сидящем на IE).
Как переслать пакет данных из Wireshark’а
При анализе приложений я систематически сталкиваюсь со странными протоколами. С Wireshark’ом можно заглянуть внутрь их, а инет подскажет общие факты. Но иногда хочется и потыкать их: переслать еще разок, изменить что‑нибудь и опять послать, сравнить ответы. Причем, поскольку время ограниченно, хочется все делать оперативно.
Я думаю, многие из нас приходили к мысли, что было бы хорошо, если бы в Wireshark’е был редактор пакетов: клик‑клик, поменял и отправил. Но пока этого не случилось, мы вынуждены искать иные пути. Фактически задачку приходится свести к тому, что мы снифаем трафик в Wireshark’е, находим необходимые пакеты и сохраняем только их в pcap-файл. А далее каким‑то «редактором» их меняем на свой вкус и отправляем в канал. Задачка приводится к выбору этого редактора.
Как ни странно, одним из главных решений стал scapy (хотя кто бы сомневался, но о нем чуть позднее). Меня же заинтересовал относительно молодой и вроде бы активный проект Ostinato. Это GUI-шный мультиплатформенный (на Python’е) открытый генератор пакетов, а заодно и снифер. Можно либо взять и собрать пакет с нуля, а можно импортировать из Wireshark’а (формат pcap, pcap-ng — не понимает). Далее через GUI можно поменять любой из слоев TCP/IP-стека, что‑то убрать, что‑то добавить или изменить. Также можно посылать последовательности пакетов. По сути, все базовые потребности покрываются. Тем, кто не близко знаком со стеком TCP/IP, я бы очень посоветовал с ней поиграться. В ней «слоеность пирога» очень четко просматривается. В качестве маленького совета — глянь мини‑видео с сайта, ведь без него «методом клика» с тулзой не разберешься, несмотря на всю ее простоту.
Теперь о scapy. Это мощнейший инструмент для генерации/обработки сетевых пакетов. Функционала очень много, из коробки поддерживается большое разнообразие протоколов. Можно воссоздать практически все сетевые атаки или эмулировать протоколы. Если не знаком с ним, то The very unofficial dummies guide to scapy поможет тебе в первом приближении понять, что там и как.
Ну а теперь о решении. Все, что требуется, — это проделать следующее в scapy:
-
Открыть pcap-файл и сохранить пакеты в массив:
wspkt=rdpcap("path_to_pcap_file") -
Можно посмотреть список полученных пакетов в массиве wspkt:
wspkt.summary() -
Полностью посмотреть конкретный пакет:
wspkt[0].show() -
Не забываем, что нужно что‑то еще и отредактировать. Можно обратиться к определенным полям (из пункта выше). Например, поменяем MAC:
![o1](o1.jpg)wspkt[0][Ether].dst="67:66:66:66:66:66" -
Отправить какой‑то пакет (например, второй) из массива в сеть:
send(wspkt[1])
Как видишь, все тоже вполне быстро и просто. Но вот кстати, поставить сам scapy под Win — это тот еще геморрой.
Как проснифать трафик под Windows без WinPcap
Wireshark и его аналоги предоставляют возможность снифать трафик за счет установки WinPcap. Тот, в свою очередь, требует установки драйвера в ОС. Это мы не всегда можем себе позволить, например если хотим сделать все совсем незаметно, с минимальными следами в ОС. И первая радость: начиная с версии Win 7/2008 появилась встроенная возможность отснифать трафик! Но подход здесь совсем другой — не через драйверы, а за счет логирования событий. Возможности этой подсистемы ОС значительно расширились по сравнению с прошлыми версиями.
Одно из главных понятий в системе логирования — «провайдер». Именно провайдеры отвечают за генерацию событий, которые возникают при определенных действиях пользовательского или системного ПО. То есть захотело приложение послать HTTP-запрос на google.com — должны «отработать» провайдеры, которые отвечают и за резолв имени, и от API, отвечающего за генерацию запроса, и от файрвола с конкретными данными пакетов. Получается такая стопка блинчиков… Признаюсь, что от глубин этой части винды я очень далек, но, думаю, общее описание вполне корректно.
Но провайдеров очень‑очень много, у меня на Win 8 насчиталось около тысячи. И хотя можно логировать данные отовсюду, но очень быстро утонешь в потоках ивентов. Причем часто данных с одного провайдера может быть недостаточно. Потому есть такое понятие, как сценарии — группы провайдеров, объединенные тематически.
Перечень всех провайдеров можно получить командой (под админом в консоли)
netsh trace show providers
Перечень сетевых сценариев:
netsh trace show scenarios
Правда, с ними другая беда — без инета, чисто по описанию об их содержании ничего не поймешь. Например, «Разрешение проблем, связанных с сетевым адаптером». Ну да ладно… Можно попробовать посмотреть, какие провайдеры входят в тот или иной сценарий:
netsh trace show scenario имя_сценария
В инете для того, чтобы отснифать трафик, предлагается такая команда:
netsh trace start scenario=NetConnection capture=yes report=yes persistent=no maxsize=1024 correlation=yes traceFile=C:\Logs\Trace_name.etl
-
netsh
— стандартная последовательность для запуска логирования сетевых событий;trace start -
scenario=NetConnection
— выбираем сценарий; -
capture=yes
— указываем, что данные сетевых пакетов необходимо сохранять (можно хранить только сами события); -
report=yes
— создание итогового файла отчет; -
persistent=no
— логирование будет отключено при перезагрузке компа; -
maxsize=1024
— максимальный размер итогового файла логов в мегабайтах; -
correlation=yes
— группировка связанных событий; -
traceFile=C:\
— путь до файла с логом событий.Logs\ Trace_name. etl
Для остановки логирования нужна команда:
netsh trace stop
Фактически эта связка работает. Трафик сохраняется. Но сценарий NetConnection содержит в себе очень много провайдеров, а потому получается слишком много событий (в том числе лишних), и файл с отчетом растет на глазах. Для реальных действий рекомендую порыскать и выбрать лишь необходимые провайдеры.
На выходе работы подсистемы логирования событий мы получаем файл в формате etl. Для каких‑то дел он, может, и подошел бы, но для анализа трафика реально очень хотелось бы получить pcap, чтобы потом его запихнуть напрямую в Wireshark. Тут нам иногда может помочь тулза от Microsoft — Network Monitor. Она по функционалу во многом смахивает на Wireshark. Позволяет и снифать, и просматривать содержимое пакетов, но, имхо, значительно менее удобна. Но зато она умеет читать etl-файлы и сохранять потом в pcap (хотя и не всегда с этим успешно справляется).
Вообще, подход не на уровне трафика, а на уровне событий имеет свои плюсы. Network Monitor может указать, какое приложение выполняет те или иные действия в сети (ведь известно, кто инициировал событие), что местами помогает.
Как проснифать трафик с loopback под Windows
Мы уже не раз касались этой темы в Easy Hack. Лично у меня она систематически всплывает, а потому поиск идеального пути продолжается. Данное решение — часть предыдущей задачи, но для удобства вынесено в отдельный пункт.
Оказывается, что через подсистему логирования событий мы можем снифать и трафик с loopback. Причем и исходящие, и входящие пакеты. Все, что необходимо, — это, как я понял, использовать провайдер Microsoft-Pef-WFP-MessageProvider.
Информация была получена при тестировании относительно нового снифера от Microsoft — Message Analyzer. В нем есть отдельный пункт про loopback-интерфейс, который и выбирает вышеуказанный провайдер и позволяет сохранять данные пакетов, передаваемые по loopback.
Хотя снифать можно и через команду netsh
, но Message Analyzer значительно удобнее. Выглядит этот продукт очень прилично и содержит интересный функционал. Советую взглянуть. Но более важный момент — он позволяет сохранить итоги в необходимом нам pcap-формате. Причем иногда то, что не выгружалось нормально из Network Monitor, получилось экспортировать Message Analyzer’ом, хотя со стабильностью здесь еще есть проблемы.
Как подыскать аналог ProcMon под nix
Опять‑таки задачка, связанная с анализом какого‑либо приложения, когда нам хочется оперативно посмотреть как работает программа, какие файлы она читает или порты открывает. На основе таких данных мы найдем критичные файлы, возможно какие‑то некорректные права в ОС. Т.е. это важное подспорье для понимания, как что‑то работает. И если с Windows все сводится к наборчику Sysinternals Tools c его тулзами ProcMon, FileMon, RegMon, с которыми легко можно решить поставленные задачи, то как обстоят дела с nix’ами, точнее даже с Linux-системами? Как это ни странно — вполне хорошо, и даже лучше, чем под вин. Чаще всего можно справиться с основными задачами даже без стороннего ПО (и как обычно для nix’ов — различными путями).
Итак, для начала нам поможет команда lsof, которая по умолчанию отображает все открытые файлы в ОС и процессы, которые «стоят» за этим. Но так как мы анализируем конкретное ПО, то мы можем ограничить вывод только по нему, а точнее по его PID’у:
lsof –p 111
Тулзень хороша еще и тем, что показывает нам перечень подгруженных библиотек, а также портов, открытых данным процессом (помним, что в nix-системах каждая сущность является файлом, поэтому мы ее тут тоже видим). Иногда бывает полезно сначала найти, а что же за процесс сидит на конкретном порту:
lsof -i TCP:80
Кроме того, можно «фильтровать» по имени пользователя:
lsof –u user_name
Минус для нас в том, что если файл (с конфигом, например) был открыт, а на момент запуска lsof уже закрыт процессом, то мы его не увидим в списке.
Воспользуемся тогда другой тулзой, от которой данные моменты не укроются, — strace (или одним из ее аналогов). Она фактически мониторит системные вызовы для какого‑то приложения.
strace -f -e trace=open –p116 -o ~/log
Здесь
-
–f
указывает, что необходимо трейсить и child’ы (порожденные процессы); -
-e
— что нас интересует только открытие файлов;trace=open -
-p116
— PID процесса, к которому приаттачится strace; -
-o
— куда сохранять логи (иначе –— на стандартный вывод).~/ log
Если хотим оттрейсить с самого запуска, то вместо -p команду с аргументами указываем в конце после параметров.
О’кей, с этой частью разобрались. Если есть процесс, то понять, куда и когда он ползает, мы сможем. А как насчет другой части задачки, когда у нас есть некий файл и надо узнать, кто и когда им пользуется? Strace здесь уже не помощник, так как он не может мониторить системные вызовы от всех процессов.
Рассмотрим пару.
Первый — демон Linux auditd. Похож на strace, также позволяет просматривать системные вызовы, но на уровне всей ОС. Правда, в работе «потолще» и требует установки (хотя sudo apt-get install auditd и 600 Кб места…).
Для работы с auditd нам потребуется две команды. Сначала устанавливаем аудит события, используя auditctl:
sudo auditctl -w /etc/passwd -k passwd_mon -p rw
-
-w /
— путь до файла, который мониторим;etc/ passwd -
-k
— ключ, по которому можно будет найти события, относящиеся к данному правилу;passwd_mon -
-p
— контролировать доступ на чтение и запись.rw
Далее можно посмотреть события с помощью команды ausearch:
sudo ausearch -k passwd_mon
-
-k
— как раз ключ, который мы указали ранее.passwd_mon
Две дополнительные команды. Удаление правила (аналогично созданию, только с заглавной W):
sudo auditctl -W /etc/passwd -k passwd_mon -p rw
Список правил:
auditctl -l
Система аудита событий достаточно мощная. Логи содержат много информации. Так что можно читать мануалы и радоваться жизни. С ней главное — не погрязнуть в обилии полученных данных.
Если же тебе нравится больше GUI и минимум изменений в ОС, то можно взглянуть на тулзу glsof. Она написана на Java, систематически запускает lsof, парсит его вывод и оставляет только интересующую нас информацию. Кирпично, но работает. С первой задачкой также справится (считай это GUI для lsof). Минус может быть в том, что если за промежуток между запусками lsof процесс успеет обратиться к файлу и закончить с ним работу, то мы этого в логе не увидим.
Еще момент. Одним из первых решений было использование подсистемы inotify, которая дает возможность гибко мониторить доступ к файлам и папкам на уровне файловой системы. Для доступа к ней использовал iWatch. Все заработало быстро и четко, кроме одного важного момента — через inotify нет возможности узнать, какой процесс производит изменения.
Спасибо за внимание и успешных познаний нового!