Какие уязвимости эксплуатируют атаки уровня узла

XSS- и CSRF-атаки — разбираем уязвимости

XSS- и CSRF-атаки — разбираем уязвимости

Noveo Developer

В контексте веб-безопасности есть два основных вектора атаки, которые необходимо учитывать: XSS и CSRF. Прежде чем рассказать о них, необходимо понимать дефолтную политику браузера насчёт взаимодействия между вкладками — точнее, взаимодействия между скриптами с разным origin’ами. Эта политика называется Same Origin Policy (SOP). Её центральное понятие — Origin (

источник) скрипта/документа. Он определяется комбинацией трёх понятий: протокола (http/https, etc.), хоста (my-website.com) и порта (например, 443 для https и 80 для http).

Вот примеры, которые браузер будет интерпретировать как скрипты с одинаковым origin’ом. Если на открытой вкладке присутствует 3 скрипта, origin’ы которых отличаются подобным образом, то браузер будет воспринимать их как скрипты с одним origin’ом:

А такие origin’ы будут считаться разными:

Важная особенность SOP: скрипт с одним origin’ом может посылать запросы на другой origin. Однако не сможет прочитать ответ на него. Чтение ответа будет заблокировано на уровне браузера. Если требуется заблокировать в том числе отправку запросов (скажем, вы не хотите, чтобы скрипты, загруженные на вашем сайте с других origin’ов, могли делать запрос на origin сайта), это тоже возможно реализовать посредством указания Content Security Policy. Но дефолтная политика (SOP) работает именно так.

XSS / JS-Injections

Наиболее часто встречающейся атакой является Cross-Site Scripting («Межсайтовый скриптинг»), или более удачное, на мой взгляд, название — JS-инъекции (по аналогии с SQL-инъекциями). Если в html-документ вставить строку, в которой будут использоваться элементы, похожие на html-теги, то браузер будет интерпретировать их как валидный html-код и исполнять его. Например, можно прописать с пустым src и добавить onerror=“alert(‘hacked’)” (так как src пустой, то браузер сразу перейдет к вызову onerror), внутри которого выполнить любой JS-код (имея доступ к localStorage и так далее). Также можно поместить вредоносный скрипт внутрь запроса query params в следующем виде:

Предотвращение JS-инъекций

В современных фреймворках (вроде Angular/React) изначально действует санитизация, которую в случае необходимости (если вы хотите запустить inline-скрипт из строки и уверены, что там не содержится ничего вредоносного) можно отключить. В React’е это делается посредством атрибута, подчеркивающего опасность вставки inline-скриптов:

В Angular’е можно за’inject’ить санитайзер и выбрать тот уровень санитизации, который подходит под ситуацию. Например, можно разрешить чтение стилей, но при этом экранировать любые скрипты.

Выглядит это так:

Помимо санитизации существует Content Security Policy (CSP) Header. Через него можно явно задать, скрипты с каким origin’ом могут исполняться браузером на текущей странице. По дефолту Content Security Policy содержит значение *. То есть браузеру разрешено запускать скрипты с любым origin’ом, включая inline-скрипты без origin’а. Такие настройки считаются очень небезопасными, и рекомендуется всегда явно указывать, скрипты с каким origin’ом можно запустить на сайте. Явное указание ограниченного набора origin’ов заодно предотвращает исполнение inline-скриптов. Чтобы разрешить их исполнение, требуется явно это прописывать.

Пример того, как может выглядеть CSP Header:

Такие настройки означают, что изображения могут подгружаться с любого источника (*), media только с двух источников (media1.com & media2.com). А скриптам позволено запускаться, если они имеют только один origin (userscripts.example.com). default-src ‘self’ позволяет запускать скрипты с текущего origin’а, но не его поддоменов.

Tproger , Удалённо , От 100 000 до 200 000 ₽

Посредством CSP-заголовка можно очень тонко настраивать исполнение скриптов на сайте.

content-security-policy Header и access-control-allow-origin немного похожи. CSP позволяет обходить SOP, а access-control-allow-origin позволяет получать разрешение на CORS. То есть отвечать (response) на запросы скриптов с другим origin’ом.

В начале статьи я упоминал, что SOP позволяет скриптам с одним origin’ом делать запросы на другой origin, однако SOP заблокирует ответ. Посредством access-control-allow-origin можно получить доступ к этому ответу, если на сервере явно прописан origin, который имеет право получать ответы.

Если кратко и утрированно, то SCP — это про SOP и frontend-часть системы. А access-control-allow-otigin — про CORS и backend-часть.

CSRF (XSRF)

Второй по распространённости тип уязвимости — это Cross-Site Request Forgery («Межсетевая подделка запроса»). Этот вектор атаки использует склонность браузера неявно добавлять куки к любому запросу. Например, вы авторизовались на сайте, где используются куки, и в какой-то момент некий скрипт делает запрос на origin этого банка — то есть открыли почтовый клиент и перешли по вредоносной ссылке. Браузер автоматически добавит куки к запросу, даже если сам запрос происходит с другой вкладки.

Из-за SOP этот скрипт не будет иметь доступа к response. Но он сможет выполнять запросы на правах авторизованного пользователя. Например, сделать запрос на перевод денег или просто на удаление любой возможной информации.

Для предотвращения этой атаки в первую очередь рекомендуется использовать явные системы аутентификации. Например, session token / jwt в header или session token в body param. Также, если на сайте используется какая-то форма, то рекомендуется реализовывать anti-csrf token’ы. Их суть в том, что сервер в response отдаёт два случайных токена. Один предназначен для куков, другой прячется в скрытом поле формы. Когда клиент submit’ит форму, то должен отправить оба токена обратно на сервер. В случае, если они отличаются от того, что сервер выпустил изначально, сервер блокирует запрос.

Integrity

В контексте информационной безопасности существует понятие CIA triad, объединяющее три аспекта:

  • конфиденциальность; доступ к информации должен иметь только тот, кому она предназначается;
  • доступность: информация должна быть доступна в нужном объеме и в нужное время;
  • связность: то, насколько части системы могут доверять передаваемым друг другу сообщениям, и не произошло ли в процессе передачи нарушения данных.

В web’е это можно представить в виде отношений между frontend’ом и backend’ом. В html есть специальный атрибут integrity, позволяющий запускать скрипт только в том случае, если он не отличается от того, что изначально подразумевали его разработчики.

Предположим, что вы используете cdn (content delivery network) для оптимизации скорости доставки приложения, однако вы хотите быть уверены, что приложение, которое вы сбилдили сами, и то, которое получаете из cdn, — одно и то же. В этом случае можно в процессе прод-билда приложения сгенерировать integrity-хеш, который указывается следующим образом:

Кибератаки в подробностях: DoS и DDoS

С этой статьи мы начинаем серию статей, посвященных основным типам кибератак, ослабляющих безопасность IT-инфраструктуры организаций. С быстрым распространением Интернет-технологий и приложений число лиц, пытающихся получить доступ к системам также возрастает — обычно этим занимаются для того, чтобы прославиться, получить финансовую выгоду или подмочить чужую репутацию. В первой статье серии рассмотрим атаку отказа в обслуживании (Denial of Service attack, DoS) и ее распределенную версию (DDoS). Мы рассмотрим технические аспекты осуществления этих атак и обсудим пути остановки их на подходе к внутренней сети.

В основе осуществления атаки отказа в обслуживании лежит техника повышения нагрузки на целевую систему. На сервере во время приема пакета все компоненты (начиная с сетевой карты или NIC и заканчивая приложением, работающим под управлением операционной системы) участвуют в процессе, делая прием пакета успешным. Сетевая карта должна исследовать фреймы Ethernet, предназначенные для нее, выравнивать данные и передавать их драйверу сетевой карты, который применяет собственные механизмы обработки данных и отправляет их операционной системе, которая в свою очередь передает их приложению.

Каждый компонент, вовлеченный в обработку пакетов, может быть подвержен какой-либо уязвимости, а DDoS-атаки изобретены как раз для того, чтобы эксплуатировать одну или несколько уязвимостей для проникновения в систему.

Давайте попробуем понять основы протокола TCP/IP, использующего рукопожатие между отправляющей и принимающей стороной. Рисунок 1 иллюстрирует процесс работы рукопожатия TCP в штатном режиме и в режиме «атаки сегментами SYN» (SYN flood).


Рисунок 1: Рукопожатие TCP

Когда отправляющая сторона хочет начать обмен данными, она отправляет SYN-пакет со своим IP-адресом в качестве источника и IP-адресом принимающей стороны в качестве цели. Принимающая сторона отвечает пакетом SYN-ACK. Отправляющая сторона подтверждает свое намерение при помощи пакета ACK. Теперь отправляющая и принимающая стороны имеют гарантию того, что они могут начать обмен данными друг с другом.

После этого отправляющая данные сторона начинает передачу самих данных в виде небольших фрагментов и для каждого принятого пакета с данными принимающая сторона отправляет пакет ACK в ответ. Когда отправляющая сторона отправляет последний фрагмент данных, она завершает отправку сигналом FIN, на что принимающая сторона отвечает подтверждением в форме отправки FIN-ACK в ответ.

Если какой-либо порт не предназначен для ответа на запрос, принимающая сторона отправляет пакет RST, что означает отказ в приеме запроса.

Как вы убедились, программное обеспечение, реализующее стек TCP/IP, реализует сложные механизмы обмена данными, поэтому на его работу затрачивается часть ресурсов центрального процессора и оперативной памяти. К этому стоит добавить, что на сервере производится множество рукопожатий TCP для различных исходных и целевых адресов, а также портов. Все протоколы, основанные на межсетевом протоколе (IP), такие, как ICMP ping, telnet, FTP и другие в действительности основываются на этих же принципах для выполнения своей работы, причем каждый из них работает на отдельном сокете и порте.

На прикладном уровне операционная система и приложение, отправляющее или принимающее данные, резервируют области памяти для внутренних буферов данных, а также программное обеспечение отслеживает принятые и отправленные данные. Операционная система выполняет часть этой работы самостоятельно, а часть оставляет для драйвера сетевой карты и стека протоколов. Каждый процесс потребляет часть времени центрального процессора и часть оперативной памяти.

При атаке отказа в обслуживании используются приведенные выше обстоятельства и создаются TCP-пакеты со злонамеренно измененным содержимым, которые отправляются серверу. TCP-пакеты могут быть созданы или изменены для нарушения классического процесса рукопожатия с целью получения неожиданных ответов. В конечном счете это приводит к затратам ресурсов сервера, после чего сервер перестает отвечать на запросы.

Существуют разные методы для осуществления таких атак, каждый из которых использует свое техническое решение. Обратитесь к таблице, приведенной ниже — она иллюстрирует соответствие различных атак отказа в обслуживании уровням базовой эталонной модели взаимодействия открытых систем (OSI).

Прикладной уровень Атаки отказа в обслуживании на вебсайты, рассылка спама по электронной почте
Представительский уровень Специально сформированные SSL-запросы
Сеансовый уровень Атаки отказа в обслуживании на telnet
Транспортный уровень Атака SYN-пакетами (SYN Flood), атака ICMP-запросами с измененными адресами (Smurf Attack)
Сетевой уровень Атака ICMP-запросами (ICMP Flooding)
Канальный уровень Атака пакетами с разными MAC-адресами (MAC Flooding)
Физический уровень Атака специально сформированными пакетами (Dummy Packet Attack)

Рассмотрим каждую из техник подробнее.

Атаки отказа в обслуживании уровня сетевого стека

Массовая рассылка пакетов с разными MAC-адресами (MAC flood)

Это редкая атака 1 уровня OSI при которой атакующий рассылает множество Ethernet-фреймов, имеющих разные MAC-адреса. Маршрутизаторы обрабатывают MAC-адреса по отдельности, поэтому им приходится резервировать часть ресурсов для обработки каждого запроса. Когда у маршрутизатора заканчивается память, он либо отключается, либо перестает отвечать на запросы.

В отношении нескольких типов маршрутизаторов эта атака может привести к полному сбросу таблиц маршрутизации и тем самым нарушить работу всей обслуживаемой ими сети.

Массовая рассылка SYN-пакетов (SYN flood)

Атакующий отправляет множество SYN-пакетов; при приеме SYN-ACK от целевой системы, атакующая система не отправляет ACK, а вместо этого отправляет еще больше SYN-пакетов. Это заставляет TCP/IP стек считать, что происходит перегрузка или отключение сети и ожидать заданный промежуток времени. Таким образом, сетевой стек поддерживает в полуоткрытом состоянии множество соединений в ожидании пакетов ACK.

В другом типе атаки с использованием SYN-пакетов, эти пакеты отсылаются с подмененным адресом отправителя, который заменяется на целевой адрес, на который будут отправляться пакеты SYN-ACK. Поскольку система, расположенная по подмененному адресу никогда не отправляла пакет SYN, она никогда не отправит пакет ACK в ответ на этот пакет, а просто отбросит его. Целевая система не ожидает такого поведения и ожидает пакета ACK, поддерживая соединение в полуоткрытом состоянии.

В обоих примерах таблицы соединений и часть памяти на целевой системе заполняются недействительными записями. Когда таблица заполняется полностью, устройство перестает отвечать на запросы.

Атака с помощью пинг-пакетов (ping of death)

В этом случае поток специально сформированных пинг-пакетов отправляется целевой системе. Поскольку стек TCP может отвечать только на определенный тип пинг-пакетов, он не может ответить на специально сформированные пакеты и затрачивает ресурсы на их обработку.

Атаки с помощью установления соединений TCP

Эта атака является усовершенствованной атакой массовой рассылки SYN-пакетов, разница в них состоит в том, что в данном случае трехэтапное рукопожатие TCP производится в полном объеме. При этом не производится подмен адресов, не игнорируются ACK-ответы, а просто устанавливаются TCP-соединения, посредством которых не передается никаких данных. По этой причине соединения остаются активными до истечения времени ожидания: большое количество установленных соединений приводит к отказу в обслуживании с стороны атакуемой системы.

Поскольку трехэтапное рукопожатие производится корректно, эту атаку непросто отследить и требуются сложные технические решения для обнаружения этой атаки и ее нейтрализации.

Атака ICMP-запросами с измененными адресами (Smurf Attack)

Это очень известная атака 3 уровня OSI при которой атакующий отправляет поток пинг-запросов на широковещательные IP-адреса. При этом адрес источника пакетов подменен на адрес атакуемой системы. Таким образом, маршрутизаторы доставляют ответы системам, на которые направлена атака, а они отправляют пинг-ответы. В большой сети с большим количеством оборудования эта атака может произвести разрушительный эффект и привести к тому, что маршрутизаторы перестанут отвечать на запросы.

Существует похожая атака (Fraggle attack), при которой вместо TCP-пакетов отправляются эхо-пакеты UDP.

Атаки TCP RST-пакетами

Это новый вид атак отказа в обслуживании, при которых IP-адрес источника подменяется на IP-адрес атакуемой системы и этот специально сформированный пакет отправляется межсетевому экрану. В свою очередь межсетевой экран запоминает это соединение на некоторое время.

Эта атака используется очень редко; единственной целью этой атаки является введение в заблуждение логической части системы обнаружения проникновения на недорогих межсетевых экранах. В отличие от настольного компьютера, межсетевой экран со своей системой обнаружения проникновения работает в promiscous-режиме и исследует каждый проходящий пакет. Однако, если логика определения аномалий в пакетах не достаточно проработана, в результате ее работы соединения разрываются и межсетевой экран становится бесполезен.

Атаки отказа в обслуживании прикладного уровня

Помимо приведенных выше атак уровня сетевого стека, существуют несколько атак, работающих напрямую на прикладном уровне. Эти атаки сравнительно просты в идентификации и устранении, но в случае бездействия могут привести к длительному простою.

Атаки прикладного уровня эксплуатируют уязвимости в операционной системе и приложениях. Ниже приведены описания нескольких таких атак.

Это очень известная атака, приводящая к тому, что операционная система начинает чрезмерно потреблять ресурсы до тех пор, пока не начнутся утечки памяти, замедление работы или система просто перестанет отвечать на запросы. Информация о том, что переполнениям буфера подвержена только ОС Windows, является мифом — фактически, дистрибутивы Linux также подвержены этой атаке. Приложения, такие как базы данных, сервера электронной почты и веб-сервера часто оказываются подвержены уязвимостям переполнения буфера.

Атаки на Web- и DNS-сервера

Web-сервера, работающие по протоколу TCP на порту 80 являются частой целью для атак отказа в обслуживании. Атакующие обычно отправляют множество HTTP-запросов (никаким образом не измененных) с целью получения чрезмерно больших объемов данных из базы данных сервера.

Такие потоки запросов загружают базу данных, заставляя Web-сервер ожидать данные из нее. Это препятствует нормальной работе обоих серверов и они перестают отвечать на запросы. Это также может случиться и непроизвольно, особенно в те моменты, когда на сайте выкладываются последние новости и все хотят ознакомиться с ними одновременно. В случае DNS-серверов методика проведения атаки аналогична, но атака имеет более серьезные последствия. Если DNS-сервер перестает отвечать на запросы, может перестать функционировать вся сеть предприятия.

Распределенные атаки отказа в обслуживании

Говоря простым языком, распределенная атака отказа в обслуживании (DDoS) сочетает в себе множество узлов, являющихся источниками атаки, с различными техниками, обсужденными нами ранее и может привести к катастрофическим последствиям. Посмотрите рисунок 2 для того, чтобы понять, как планируется типичная распределенная атака на сайт.


Рисунок 2: Типичная распределенная атака

Летальная комбинация потока SYN-пакетов с подмененными адресами и классической атаки потоком модифицированных пинг-пакетов часто используется для нарушения работы сети с открытым доступом в Интернет.

Современной формой DDoS-атаки является вставка специального кода во вредоносное программное обеспечение и распространение его на миллионах компьютеров, превращая их в зомби-узлы. В заданный день и время все инфицированные узлы начинают выполнять вредоносный код, который обычно разработан таким образом, чтобы осуществлять запросы к определенным сайтам или проводить атаку уровня сетевого стека на узел с определенным адресом. Поскольку в данных условиях сложно определить источник распространения вредоносного программного обеспечения, сложно отследить того, кто стоит за атакой.

В другой безвредной форме распределенная атака используется для генерации нажатий на рекламные вставки на сайте атакующего, помогая ему зарабатывать на этом финансовые средства.

Защита систем, основанных на свободном программном обеспечении

Несмотря на то, что атака отказа в обслуживании является одной из наиболее старых и широко известных атак, к сожалению, не существует решения для нейтрализации этой атаки по той причине, что сложно определить, какое из соединений не имеет отношения к атаке, а какое имеет.

Хотя и существуют инструменты для нейтрализации определенных типов атак, все они сводятся к проектированию системы безопасности сети и мониторингу ее состояния для повышения безопасности.

В системе мониторинга состояния сети должно отображаться большое количество отброшенных TCP-пакетов, необычные сбросы TCP-соединений, принятые поврежденные SYN-пакеты TCP или отправленные дубликаты ACK-пакетов. Обычно первым компонентом сети, подверженным атаке является маршрутизатор, за ним следует межсетевой экран и все остальные компоненты сети, такие, как свитчи. Межсетевые экраны не могут защитить маршрутизатор, но прошивки новых моделей маршрутизаторов (например, Cisco 7600 или x443) содержат патчи для защиты от атак отказа в обслуживании. Хотя современные межсетевые экраны и имеют множество функций для противодействия таким атакам, они не всегда помогают.

Межсетевые экраны, без сомнения, защищают от атак уровня сетевого стека, но обычно они не могут защитить от атак прикладного уровня, таких, как атака на HHTP-сервер на порту 80. В этом случае необходим межсетевой экран, работающий на уровне приложений и проверяющий каждый запрос на незлонамеренность.

Для дистрибутивов Ubuntu и RHEL существует прекрасный инструмент APF (Advanced Policy Firewall), способный сдерживать DoS-атаки. Свободные системы на основе Linux славятся высоким качеством драйверов сетевых карт, а также функциями и инструментами, например, межсетевым экраном для фильтрации пакетов, инструментами для исследования пакетов, инструментами для исследования состояния сети, системами повышения безопасности на уровне ядра и другими полезными вещами.

Для небольших сетей на основе Linux может быть разработан небольшой скрипт для поиска открытых соединений при помощи SYN-пакетов и сброса неработающих соединений при помощи RST-пакетов, что будет первой линией защиты.

Для особо важных корпоративных сетей на основе Linux лучшим выбором является развертывание системы предотвращения проникновений (Intrusion Prevention System, IPS) в виде отдельного устройства. Эти устройства работают в promiscous-режиме и используют встроенные алгоритмы определения аномалий в пакетах для перехвата и декодирования каждого пакета. Поскольку возможности работы этих устройств включают в себя диапазон от 2 до 7 уровня OSI, они могут определить, является ли пакет относящимся к реальному соединению или нет. Эти устройства предоставляют замечательный механизм уведомления об атаках и их нейтрализации.

Хорошая комбинация систем предотвращения проникновений, межсетевых экранов и систем безопасности прикладного уровня может помочь в нейтрализации этих ужасных атак.

Как выявить атаку злоумышленников в сетевом трафике

Обнаруживаем действия киберпреступников в корпоративной сети и классифицируем их в соответствии с матрицей MITRE ATT&CK, которая показывает, какие тактики и техники применялись в ходе кибератаки.

Введение

Прежде чем начинать поиски кибератаки в инфраструктуре, следует разобраться, где именно остаются её следы и на какой стадии можно с большей вероятностью выявить нелегитимные действия.

Обнаружить и предотвратить атаку на стадии проникновения крайне сложно, а иногда и вовсе невозможно. Если целью злоумышленников является конкретная компания, то рано или поздно они преодолеют периметр. Почему так происходит?

Во-первых, большинство киберпреступников попадает в инфраструктуру компании с помощью фишинга и вредоносных программ. Фишинг — одна из самых эффективных техник проникновения: наше исследование показывает, что каждый третий сотрудник запускает на своем компьютере файл, приложенный к фишинговому письму.

Во-вторых, злоумышленники уже научились обходить традиционные средства защиты. Например, для обхода антивирусов они обфусцируют вредоносный код и подписывают его легитимным сертификатом. Все необходимые для этого инструменты преступник может приобрести в даркнете, причём их авторы даже дают гарантию того, что вредоносные программы не будут обнаруживаться антивирусами в течение определённого периода времени.

Наконец, если организация стала целью APT-группировки, то не исключено, что высококвалифицированные хакеры смогут эксплуатировать ранее неизвестные изъяны в ПО (уязвимости нулевого дня) или пробраться в целевую инфраструктуру через взлом сторонних компаний, которые менее надёжно защищены. Поэтому предпочтительнее выстраивать такой подход к обеспечению безопасности, который направлен на обнаружение инцидента прежде нанесения ущерба критически важным ресурсам.

Где искать следы атаки

Эффективным методом выявления атаки является мониторинг и анализ событий, происходящих в инфраструктуре уже после проникновения злоумышленников в локальную сеть, со своевременным реагированием на инциденты. Однако здесь есть свои особенности. Мониторинг событий на конечных узлах позволяет обнаружить факт компрометации, но для того чтобы восстановить цепочку атаки, потребуется отследить перемещения злоумышленников между узлами сети и выявить подключения ко внешним командным серверам.

Анализ сетевой активности дополняет картину происходящего в инфраструктуре. Если злоумышленники получили возможность выполнять команды в пределах одного компьютера, то перед ними стоят две задачи: установить связь с командным сервером и начать продвигаться по сети. Все эти действия оставляют следы в сетевом трафике, а скрыть их становится сложнее. Например, если на отдельном узле иногда достаточно воспользоваться упаковщиком для сокрытия вредоносной утилиты, то для того чтобы полностью скрыть идентифицирующие утилиту сетевые запросы к другим узлам или командному серверу, потребуется изменить логику её работы. Кроме того, в атаках часто применяются бесфайловые вредоносные программы (fileless malware), которые исполняются сразу в оперативной памяти. Тело такого объекта не сохраняется на жёстком диске, а в некоторых случаях не создаётся также никаких новых процессов — вредоносный код внедряется в один из уже работающих. При этом сохраняются все функции хакерской программы, в том числе — коммуникации с командным центром.

Мы рассмотрим несколько популярных техник, которые могут выдать присутствие злоумышленников, и покажем, как обнаружить их в сетевом трафике.

Изучаем перемещения внутри сети

Проводя целенаправленную атаку, нарушитель не может быть уверен в том, что после проникновения в локальную сеть организации он окажется в нужном ему сегменте. Для поиска ключевых серверов и рабочих станций потребуются разведка и ряд подключений между узлами. Такие подключения (или, как обычно говорят, «горизонтальное перемещение» хакера в инфраструктуре) непременно оставят следы в сетевом трафике. Их можно найти, тем самым своевременно обнаружив кибератаку. Если сохранять копию трафика, то анализ можно проводить и ретроспективно.

Распространённые способы передвижения по сети — удалённое выполнение команд на других компьютерах с использованием связки из техник Windows Admin Shares и Service Execution, а также применение технологии WMI (Windows Management Instrumentation). Эти же техники лежат в основе утилит для администрирования, которыми часто пользуются злоумышленники, в частности psexec и wmiexec из набора Impacket. С их помощью злоумышленники могут осуществлять различные действия, например передавать файлы между узлами (Remote File Copy), создавать задачи, выполняемые по расписанию (Scheduled Task), или собирать информацию о пользователях (Account Discovery). Техника Pass the Hash позволяет подключаться к удалённым узлам, зная только хеш пароля пользователя.

Windows Admin Shares

Для перемещения между компьютерами сети могут использоваться общие сетевые ресурсы, доступ к которым имеют только локальные администраторы узла (техника Windows Admin Shares). Среди них есть сетевой ресурс IPC$ (Inter-Process Communication). Он предоставляет интерфейс для удалённого вызова процедур (RPC), через который можно обратиться к менеджеру сервисов Service Control Manager (SCM). Менеджер позволяет запускать и останавливать службы, а также взаимодействовать с ними (техника Service Execution). Эти две техники работают вместе для копирования исполняемого файла на удалённый компьютер и последующего запуска либо для выполнения команд через RPC.

Копирование и запуск исполняемого файла происходят следующим образом. Вначале будет выполнено подключение к ресурсу ADMIN$ (C:\Windows), куда помещается файл. Затем необходимо соединиться с ресурсом IPC$ и обратиться с его помощью к интерфейсу SCM для создания и старта сервиса, который запустит скопированный файл. Всё это происходит поверх протокола SMB (Server Message Block).

Рисунок 1. Обращение к ресурсу ADMIN$

RPC может работать не только поверх SMB, но и поверх чистого TCP. В этом случае последовательность действий такова: злоумышленник подключается к IPC$, обращается к какому-либо сервису и отправляет ему команды.

Рисунок 2. Передача файла psexecsvc.exe

Запросы к SCM выявляются путём разбора вызовов DCE/RPC и поиска обращений к SVCCTL — интерфейсу менеджера сервисов SCM: OpenServiceW(), StartServiceW().

Рисунок 3. Создание нового сервиса с помощью SCM

С помощью RPC реализуются и другие техники, например Account Discovery. Отправка запросов сервису Security Accounts Manager по протоколу SAMR позволяет получить список учётных записей и групп в домене, а перебор идентификаторов SID с помощью службы Local Security Authority (LSARPC) позволяет узнать имена пользователей на удалённом узле.

Рисунок 4. Получение учётных записей с помощью lookupsids

Один из популярных методов закрепления в системе и продвижения по сети — создание задач, выполняемых по расписанию (Scheduled Task), путём отправки запросов сервису планировщика ATSVC.

Рисунок 5. Создание новой задачи в планировщике задач ATSVC

Описанные сценарии вполне легитимны и могут использоваться в повседневной деятельности администраторов, поэтому нужно создавать вспомогательные правила, которые автоматизировали бы обнаружение RPC-вызовов и обращений к сервисам. Эти действия необходимо анализировать в связи с другими событиями, учитывать общий контекст происходящего. Такой анализ может потребовать больших трудозатрат.

Более эффективны точечные правила, которые анализируют сетевой трафик с учётом порядка команд и значения объектов в запросах, характерных для конкретных инструментов. Например, зная последовательность действий и структуру данных, которые определены в коде утилиты psexec из набора Impacket, можно с большой точностью выявить следы её запуска в трафике.

Рисунок 6. Фрагмент кода psexec

Рисунок 7. SMB-пакет, который отправляется в результате выполнения представленного выше участка кода

Windows Management Instrumentation

Встроенная технология WMI позволяет злоумышленникам воспользоваться уже имеющимися в системе средствами для взаимодействия с удалёнными узлами. Когда WMI-команда передаётся по сети по незашифрованному протоколу DCERPC, в сетевом трафике можно увидеть текстовые строки, где указан класс, к которому происходит обращение, и метод, который вызывается у класса. Для того чтобы выявить передачу команды на исполнение, необходимо отслеживать вызов метода Create класса Win32_Process.

Рисунок 8. Вызов метода Create класса Win32_Process

Рисунок 9. Команда на исполнение

Модули для работы с WMI присутствуют во многих готовых инструментах, например в Impacket, Koadic и Cobalt Strike. В Cobalt Strike есть также модуль WMI Event Consumer, который создаёт подписку на WMI-события. Она позволяет выполнять определённое действие, когда происходит заданное событие — например, проходит установленное время с момента старта ОС или пользователь авторизуется в системе. Действием может быть запуск вредоносной программы или средства удалённого управления. Создание подписки также выявляется в сетевом трафике по специфическим строкам, в частности ROOT\Subscription и EventConsumer.

Pass the Hash

Злоумышленнику не обязательно знать пароль пользователя, чтобы получить доступ к какому-либо сервису. Техника Pass the Hash эксплуатирует особенности протокола аутентификации NTLM, которые позволяют подключаться к ресурсам даже при наличии хеша пароля. Если же в инфраструктуре используется механизм аутентификации Kerberos, злоумышленник может прибегнуть к атаке Overpass the Hash, которая является развитием этой техники.

Протокол Kerberos был разработан специально для того, чтобы пароли пользователей не передавались по сети. Для этого на своей машине пользователь хешем своего пароля шифрует запрос на аутентификацию. В ответ Key Distribution Center выдаёт ему билет на получение других билетов — так называемый Ticket-Granting Ticket (TGT). Теперь клиент считается аутентифицированным, и в течение десяти часов он может обращаться за билетами для доступа к другим сервисам.

Последовательность действий при атаке Overpass the Hash состоит в следующем. Злоумышленник получает хеш пароля пользователя (например, с помощью техники Credential Dumping), шифрует им запрос на аутентификацию и выпускает для себя билет TGT. Затем он запрашивает билет для доступа к интересующему сервису и успешно в нём авторизуется.

Атака Overpass the Hash может выявляться в сетевом трафике, например, на основе следующей аномалии. Microsoft рекомендует использовать и по умолчанию устанавливает для современных доменов алгоритм AES-128/256 для шифрования запросов на аутентификацию, а утилита mimikatz шифрует их с помощью устаревшего алгоритма RC4 — если, конечно, злоумышленник специально не поменял тип шифрования.

Рисунок 10. Использование RC4 в атаке

При таком способе выявления возможно большое количество ложных срабатываний. Для снижения количества ошибок потребуется дополнительный поведенческий анализ.

В то же время в трафике можно обнаружить и инструменты, с помощью которых осуществляются атаки Credential Dumping и Pass the Hash, например mimikatz. Многие киберпреступники используют в своих целях готовые фреймворки для тестирования на проникновение, которые подгружают дополнительные модули разными способами. В частности, Koadic, применяемый в атаках MuddyWater, передаёт mimikatz на заражённый узел по протоколу HTTP в виде закодированной в Base64 библиотеки, сериализованного .NET-класса, который будет её внедрять, и аргументов для запуска утилиты. Результат выполнения передаётся по сети в открытом виде также по протоколу HTTP.

Выявляем поиск учётных данных

Реквизиты для подключения к удалённым узлам (и в том числе — учётные данные администратора домена) взломщики, как правило, извлекают из оперативной памяти или реестра ОС. Такая техника называется Credential Dumping. Впрочем, некоторые злоумышленники прибегают и к подбору паролей. Хотя это — весьма грубая техника, существуют методы, которые позволяют проводить атаку более незаметно, а из-за того что в компаниях часто используются словарные или простые пароли даже для административных учётных записей, такие методы дают результат.

Credential Dumping

Существует несколько подходов к реализации Credential Dumping, которые можно отследить путём анализа трафика. Один из них — это атака DCSync, то есть копирование учётных записей пользователей на поддельный домен-контроллер. Атака выявляется с помощью разбора RPC-вызовов, которые передаются по сети, и поиска запросов DsGetNCChanges.

Рисунок 11. Обнаружение атаки DCSync

Кроме того, злоумышленники могут попытаться скопировать файл NTDS.dit, содержащий данные об учётных записях. Поэтому необходимо отслеживать передачу этого файла по сети. Ещё один способ реализовать Credential Dumping — это удалённый доступ к реестру по протоколу WINREG. Запросы на доступ к ключам SAM, SECURITY и LSA могут свидетельствовать о попытке получить учётные данные.

Брутфорс

Microsoft Exchange и Office 365 очень популярны как решения для корпоративной почты. Эти сервисы могут быть использованы злоумышленниками для получения доступа к учётным записям пользователей Active Directory. Техника такова: сначала взломщики получают список пользователей, а затем подбирают к ним пароли так, чтобы учётная запись не заблокировалась: по одному паролю на всех пользователей вместо словаря паролей для каждого. Такой подход получил название Password Spraying.

Если в инфраструктуре реализована аутентификация с помощью Kerberos, то для выявления атак на подбор паролей требуется разбирать протокол, находить сессии с ошибками, сообщающими, что запрашиваемый пользователь отсутствует, и разделять сессии с точностью до миллисекунд.

Если в трафике присутствует множество сессий с ошибкой KDC_ERR_C_PRINCIPAL_UNKNOWN с разными учётными записями, то это означает, что происходит перебор имён пользователей.

Рисунок 12. Сессии с ошибкой KDC_ERR_C_PRINCIPAL_UNKNOWN

Сессии с малым временем ответа сервера (десятки миллисекунд) — в сравнении с другими похожими (сотни миллисекунд) — показывают, что в этих сессиях пароли подобрали успешно. В трафике будут также отражены попытки входа с подобранными учётными записями и ошибки Kerberos. Сессии без ошибок с успешными ответами AS_REP и выданными билетами показывают, к каким учётным записям были подобраны пароли.

Рисунок 13. Попытки подбора паролей

Здесь также будет видна цикличность в именах пользователей, потому что атакующие подбирают по одному паролю на все учётные записи. Атаке может предшествовать запрос парольной политики домена: сколько установлено попыток неверного ввода пароля и на какое время блокируется учётная запись.

Ловим вредоносные скрипты

В последнее время в атаках всё чаще применяются скриптовые языки программирования. Перед тем как выполнить скрипт, его нужно передать на целевой узел. Это может быть не только файл сценария с понятными для интерпретаторов расширениями (.ps1, .vbs, .bat и др.) или макрос внутри офисного документа: преступники часто прибегают к другим методам, которые позволяют не оставлять лишних следов на узле. Тело скрипта может передаваться по сети, например, в виде ответа веб-сервера внутри HTML, TXT-записи в DNS-ответе, закодированной строчки с командами на исполнение, передаваемой по протоколу WMI.

Рисунок 14. Схема загрузки вредоносного скрипта с внешнего ресурса на скомпрометированный компьютер сети

Для обнаружения разных способов передачи вредоносных скриптов необходимо уметь определять используемые протоколы и кодировку. Следует в автоматизированном режиме извлекать передаваемые данные и файлы, а найденные объекты отправлять на анализ в песочницу. Известные вредоносные утилиты можно также выявить по хеш-суммам, которые содержатся в списках индикаторов компрометации.

Рисунок 15. Код JSRat, передаваемый в ответе веб-сервера

Анализируем подключения к командным серверам

Вредоносные программы должны связываться со своими управляющими серверами. Основная задача — передавать данные в виде, который усложняет их обнаружение в общем потоке трафика. Существует множество методов сокрытия факта связи с командным сервером или усложнения анализа передаваемых данных. Это может быть, например, маскировка под легитимный трафик, использование стеганографии или нестандартных алгоритмов кодирования.

Выявляем использование туннелей

Злоумышленники могут передавать вредоносный код внутри туннеля, установленного с использованием распространённого протокола, например DNS, SMTP, ICMP.

Есть несколько подходов к выявлению туннелей: поиск признаков самого туннеля или индикаторов использования конкретной утилиты для его создания. В первом случае нужно знать, какие особенности в сетевом трафике указывают на наличие туннеля для каждого протокола. К примеру, для протокола DNS аномалией являются большие размеры TXT-записей. Признаком ICMP-туннеля может служить размер пакетов Echo Request и Echo Response: их размер лишь незначительно изменяется в зависимости от ОС, так что если пакет оказался заметно больше обычного, то это говорит об аномалии. Косвенным признаком может стать увеличение ICMP-трафика: обычно в сети его мало, а при передаче большого количества данных через туннель будет наблюдаться заметный всплеск.

Рисунок 16. DNS-туннель

Второй подход — обнаружение отдельных утилит. Например, использование инструментов ICMPTX и ICMPSH видно по особенностям ICMP-пакетов.

Боремся с обфускацией

Перед злоумышленниками особенно остро стоит проблема обхода средств защиты, поскольку для успешного развития атаки внутри корпоративной сети необходимо оставаться незамеченным как можно дольше. Первым эшелоном выступают средства сигнатурного анализа трафика, потому что именно через них проходит сетевой поток данных начальной компрометации и загрузки модулей на дальнейших стадиях.

Средства сигнатурного обнаружения выявляют уже известные угрозы. Аналитики проводят исследования, определяют общие признаки и на этом основании составляют правила и сигнатуры. В противовес злоумышленники используют техники обфускации кода, кодирования и шифрования. Это либо разрушает искомый паттерн, либо скрывает его от средства защиты.

Как правило, вредоносные программы используют те или иные методы кодирования информации. Наиболее распространёнными являются Base-подобные кодировки, чаще всего это — Base64. К примеру, ответ от агента Cobalt Strike содержит данные внутри POST-запроса, закодированные стандартным Base64. При исследовании сетевого трафика надлежит определять использование как минимум стандартной Base64-кодировки и применять правила анализа уже к декодированному содержимому.

Рисунок 17. Передача данных в кодировке Base64

Рисунок 18. Декодирование исполняемого файла

Одним из самых действенных средств борьбы с обфускацией является поведенческий анализ, поэтому хорошим решением станет объединение анализа сетевого трафика с запуском кода в специальной виртуализированной среде — песочнице. Таким образом следует проверять все извлечённые из трафика объекты, например незашифрованные архивы или упакованные исполняемые файлы. Поведенческий анализ позволяет выявить подозрительные действия при выполнении кода и обнаружить новые, неизвестные ранее угрозы.

Нужно учитывать, что некоторые хакерские инструменты умеют определять выполнение в виртуализированной среде. В таком случае они не запускают вредоносные функции и ведут себя как легитимное ПО. Поэтому песочница должна принимать меры по сокрытию своего присутствия и распознавать техники обхода. Виртуальные машины в песочнице должны моделировать пользовательскую рабочую станцию. Для этого устанавливается прикладное ПО, образы виртуальных машин наполняются пользовательскими файлами так, чтобы они были похожи на рабочие компьютеры потенциальных жертв внутри организации. Вредоносная программа может проверить наличие характерных для виртуальных машин процессов, ключей реестра и файлов, размер жёсткого диска и оперативной памяти, наличие перемещений курсора мыши. Соответствующие запросы необходимо перехватывать на уровне ядра, чтобы сделать бесполезными проверки с уровня пользователя.

В случае сложных целенаправленных кампаний (APT-атак) соответствующие индикаторы компрометации могут быть ещё неизвестны на момент атаки. Поэтому важно проводить ретроспективный анализ файлов при появлении новых данных.

Исследуем хакерский инструментарий

В большинстве своём злоумышленники используют уже готовые фреймворки, поэтому в поиске подозрительного трафика важно знать особенности, характерные для различных инструментов. Так, популярный среди киберпреступников фреймворк Koadic передаёт полезную нагрузку в виде ответа веб-сервера внутри HTML. Сама полезная нагрузка зашифрована, а к расшифровщику применены техники обфускации кода: случайные имена пользовательских функций, их аргументов и переменных. Зашифрованный скрипт дополнительно закодирован. Для обхода средств обнаружения вторжений (IDS) авторы скрывают имя функции, используемой для выполнения расшифрованного скрипта.

Рисунок 19. Обфускация «полезной» нагрузки в Koadic

Ниже представлен ответ агента Koadic командному серверу. Часть служебной информации, например тип исполненного задания, создатели хранят в собственных HTTP-заголовках. Идентификаторы сессии и задачи устанавливаются случайным образом, а путь к библиотеке mshtml обфусцирован для обхода сигнатур IDS, но вид URI всё равно является одним из индикаторов, по которому можно узнать Koadic.

Рисунок 20. Запрос, свидетельствующий об использовании Koadic

Опишем несколько подходов, которые помогают выявить шифрованное соединение с использованием Meterpeter из состава фреймворка Metasploit.

Долгое время хорошо работало правило детектирования Meterpreter HTTPS Reverse Shell, которое анализировало SSL-сертификат защищённого соединения. Дело в том, что в сертификате, сгенерированном через Metasploit, поля Distinguished Name (DN) Issuer и DN Subject содержат идентичные наборы из 6 RDN, расположенных в фиксированном порядке.

Рисунок 21. Содержимое полей DN Issuer и DN Subject

Метод, основанный на выявлении сертификата, подходит для обнаружения простых вариантов шеллов с настройками по умолчанию. Однако в Metasploit есть возможность использовать сертификаты, созданные через другие утилиты, или имитировать сертификат легитимного ресурса. По результатам исследований специалисты PT Expert Security Center пришли к выводу, что на данный момент самый оптимальный подход — детектирование, основанное на длинах пакетов зашифрованного трафика.

Другим примером детектирования служит обнаружение Meterpreter Reverse TCP Shell. В начале соединения происходит отправка пакета определённой длины, внутри которого передаётся публичный ключ RSA-2048. Такой пакет дополнительно защищён шифром гаммирования (XOR), однако из-за малой длины гаммы в структуре пакета можно выявить повторяющиеся части. На рисунке ниже выделены такие фрагменты, а также сам зашифрованный ключ.

Рисунок 22. Обнаружение Meterpreter Reverse TCP Shell

Благодаря большому количеству нулей в начале шифруемых данных и малой длине гаммы можно без труда найти ключ и посмотреть, что находится за XOR.

Рисунок 23. Расшифровка публичного ключа

Для фреймворка Cobalt Strike также были выявлены неизменные паттерны, связанные с особенностями используемого SSL-сертификата, которые позволяют обнаружить такую коммуникацию.

Выводы

Рассмотренные техники атаки можно обнаружить и другими методами (например, с помощью SIEM и анализа журналов событий). Артефакты на конечных узлах будут свидетельствовать о компрометации ресурса, но для того чтобы «раскрутить» всю цепочку атаки и определить начальный вектор проникновения или просто проверить гипотезы в рамках Threat Hunting, может потребоваться проследить перемещения злоумышленника внутри сети, выявить подключения к командным серверам.

Типовые решения для защиты конечных узлов в инфраструктуре и межсетевые экраны могут не обеспечить должный уровень контроля, опытные хакеры адаптируют свои инструменты для их обхода. Анализ потоков данных может служить дополнением к уже существующим средствам обнаружения атак. Копия сетевого трафика позволяет восстановить последовательность действий злоумышленников и детально разобраться в инциденте. Вместе с проверкой передаваемых по сети файлов в песочнице подобный подход даёт возможность обнаружить даже сложную APT-атаку (рассмотренные техники применялись такими группировками, как APT27, TaskMasters, Silence и др.).

Развернутый текст аналитики на тему поиска злоумышленников в инфраструктуре вы можете прочитать на сайте Positive Technologies.


источники:

http://rus-linux.net/MyLDP/sec/cyber-attacks-dos-and-ddos.html

http://www.anti-malware.ru/practice/methods/How-to-detect-attackers-in-network-traffic