В первой статье мы поговорили о том, как может действовать Внешний нарушитель при проведении пентеста, какими методами он может собирать и использовать информацию для последующего проникновения. В этой статье мы продолжим рассмотрение темы тестирования на проникновение и поговорим о том, как можно развить атаки на сеть при наличии физического доступа на контролируемую территорию.
Как уже упоминалось ранее, при тестировании на проникновение обычно используются несколько методов. В предыдущей статье рассматривались действия Внешнего нарушителя, то есть пользователя, не имеющего никаких прав доступа к ресурсам организации (по крайней мере легальных) и находящегося за пределами контролируемой территории.
Но при пентесте также всегда рассматривают модели нарушителей, имеющих доступ и на территорию организации и к корпоративным ресурсам. Это модели нарушителя Гость и Внутренний нарушитель. Модель Гость предполагает, что пентестеру предоставляется доступ в офис организации и возможность подключения к корпоративной сети, то есть розетка Ethernet. В случае Внутреннего нарушителя пентестеру предоставляется не только сетевая розетка, но и учетная запись доменного пользователя с типовым набором прав доступа.
Начнем c рассмотрения модели нарушителя Гость, так как здесь у пентестера по определению меньше возможностей по сравнению с Внутренним нарушителем. Сразу оговоримся, что “по условиям учений” предоставленный сетевой порт не должен быть отключен, хотя “вредный” пентестер потом обязательно напишет в своем отчете рекомендации по принудительному отключению не используемых портов на коммутаторе.
Дежурный дисклеймер: вся представленная в статье информация приводится исключительно в ознакомительных целях. Перед использованием приведенной информации настоятельно рекомендуется ознакомиться со статьей 272 УК РФ.
Сканирование
Прежде всего пентестеру необходимо изучить сеть исследуемой организации. Для этого можно воспользоваться такими инструментами из состава Kali Linux как Nmap и Masscan.
Вот так выглядит отчет о сканировании сети с помощью Nmap:
Дальше уже можно пытаться стучаться на открытые порты и выяснять что за ними стоит. Однако, тот же Nmap можно использовать и в качестве сканера уязвимостей. Конечно, до громоздких Nessus/MaxPatrol ему далеко, но выявить такие “прекрасные” уязвимости как EternalBlue ему вполне под силу. Для этого можно воспользоваться одним из скриптов для Nmap. Просканируем подсеть:
После нескольких неудачных попыток постучаться в открытые порты, сканер обнаружил MS17-010 – “старый добрый” EternalBlue.
На просторах сети можно найти множество примеров эксплуатации данной уязвимости, например с помощью Metasploit, так что мы не будем дальше рассматривать данный вектор и перейдем к теме анализа трафика.
Расчехляем сниффер
Итак, в качестве нашего инструментария неизменно будет выступать Kali Linux. Для начала можно попробовать послушать какой трафик ходит по сети. Для этого воспользуемся классическим инструментом Wireshark.
Естественно, сначала нам необходимо перевести сетевой интерфейс в смешанный режим с помощью простых команд:
Я не буду подробно рассматривать работу с Wireshark, так как на эту тему написано достаточно статей, в том числе и на Хабре. Кратко посмотрим, что из себя представляет интерфейс этого сниффера. При загрузке приложения нам предлагается выбрать какой интерфейс системы слушать.
Далее нажимаем Start. В строке ввода можно указать трафик для какого протокола отображать. В основном поле отображаются перехватываемые пакеты в реальном времени. Внизу для выбранного пакета отображается его содержимое на всех уровнях иерархической модели, начиная с канального. Нас интересует HTTP трафик, поэтому внизу выбран соответствующий пакет и можем видеть его содержимое.
Но вернемся к пентесту. В прежние времена, когда по просторам Интернет ходил незашифрованный трафик с помощью сниффера можно было узнать много чего интересного. Но сейчас в глобальной сети все сложнее найти сайт не использующий SSL шифрование. Конечно, такие ресурсы еще существуют, но скорее всего это либо ресурсы уже несуществующих организаций, чья аренда DNS имени еще не закончилась, либо плоские сайты визитки, где шифровать особенно нечего.
Иное дело локальные веб ресурсы внутри сети организации
Как прибили, так и держится
Плохо написанный сайт в Интернете долго не проживет. Его обязательно поломают, не ради денег так ради интереса, получения практики, хулиганства и т.д. Собственно некоторые методы поиска уязвимостей в веб мы рассмотрели в прошлой статье. Но внутри сети организаций кривые ресурсы могут жить годами и даже десятилетиями. Например, какой-то студент очень давно написал систему учета рабочего времени на PHP. Система исправно работает, юзера заходят в веб интерфейс, списывают свои трудозатраты, а руководители строят нужные им отчеты по загрузке. Зачем что-то менять, если все и так работает? Все бы ничего, но во-первых этот веб портал использует HTTP и пользовательские учетные данные идут по сети в открытом виде, а во-вторых сам код и используемые библиотеки содержат множество уязвимостей, которые легко можно найти с помощью того же сканера Nikto, который рассматривался в предыдущей статье.
В случае, если учетные данные передаются по HTTP в открытом виде, мы можем их перехватить с помощью Wireshark.
Выглядеть это может примерно вот так:
Со стороны это может показаться несколько странным, но во многих организациях для внутренних нужд может использоваться большое количество различного бесполезного очень нужного самописного софта, который никто особо не поддерживает и который содержит множество уязвимостей. При этом дорабатывать эти приложения никому не надо, потому что “и так работает” и, кроме того, это дополнительные трудозатраты для админов и программистов и организации не очень хочется тратить на это средства.
А если все-таки HTTPS или человек посередине
Допустим все сисадмины и безопасники (если они есть) сознательные и используют шифрование трафика, или просто в HTTP трафике ничего действительно полезного найти не удалось. Тогда можно попробовать прибегнуть к помощи различных утилит для реализации атаки “человек посередине” (Man In The Middle, MiTM). Данная атака предполагает, что злоумышленник встает посередине между участниками информационного обмена и осуществляет перехват модификацию проходящего трафика.
При реализации данного типа атак можно использовать различные техники. И выбор техники может определяться не только наличием/отсутствием средств защиты, но и безбашенностью пентестера условиями договора между заказчиком и организацией, проводящей тестирование.
Итак, наша основная цель - заставить трафик между получателем и приемником идти через контролируемый нами узел. Для этого надо сначала подготовить этот самый узел, а именно настроить перенаправление трафика и маршрутизацию.
Для форвардинга пакетов можно воспользоваться следующей командой:
Также необходимо просмотреть правила netfilter для того, чтобы они не мешали проходу трафика. Будет не очень здорово, если после начала атаки у пользователей просто пропадет соединение.
Ну и проверим настройки маршрутизации с помощью следующей команды:
Нам необходимо, чтобы пакеты пришедшие на один интерфейс могли в неизменном виде отправляться дальше с другого интерфейса. Вмешиваться в их содержимое мы будем чуть позже.
После того, как мы протестировали способность трафика беспрепятственно проходить через наш узел в тестовой среде, поговорим о том какими способами можно перенаправить реальный пользовательский трафик через этот узел при пентесте.
Далее приводятся несколько физически-логических способов встать посередине:
1. Старый добрый шнурок
В самом простейшем случае мы можем просто подключиться к сетевому кабелю, то есть встать в разрыв между пользовательской сетью и, к примеру, этажным коммутатором. Выглядит несколько странно, но при наличии физического доступа к сетевому оборудованию такое вполне возможно не только в теории.
Для практической реализации таких подключений можно воспользоваться микрокомьютерами типа Raspberry Pi. При этом в качестве второго сетевого интерфейса используется переходник USB-Ethernet. Конечно, на большом объеме трафика устройство начнет захлебываться, но если подключаемый сегмент содержит менее десятка узлов, то микрокомпьютер должен справиться.
2. Истощение и подделка DHCP
Dynamic Host Configuration Protocol, DHCP это прикладной протокол, позволяющий сетевым устройствам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. В число этих “других параметров” входит к шлюз по-умолчанию. Если мы сможем подсунуть юзерам свои настройки DHCP, в которых указан в качестве Default Gateway наш узел, то трафик пойдет через него, а это то, что нам нужно.
Далее нам необходимо поднять сервис DHCP. Конечно, если есть возможность, можно просто использовать тот же Raspberry или маленький роутер с OpenWRT прошивкой, который будет раздавать адреса с нужными нам настройками.
Но если в качестве поддельного DHCP сервера используется Kali Linux, то необходимо установить isc-dhcp-server выполнив
sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade
Далее необходимо внести правки в конфигурационный файл DHCP, который должен находиться в /etc/netplan/.
Структура файла должна быть примерно следующая:
network:
ethernets:
eth0:
addresses:
- Подсеть/маска
gateway4: наш_узел
nameservers:
addresses: [DNS сервер]
version: 2
Так или иначе, но мы создали свой поддельный DHCP сервер, но если мы его просто активируем в пользовательском сегменте, то вряд ли наши адреса и настройки получат много пользователей, так как легальные серверы по-прежнему в строю.
Поэтому, прежде чем запустить свой DHCP сервер необходимо вывести из строя легальные DHCP. Сделать это проще всего с помощью атаки на исчерпание IP адресов (DHCP Starvation). Для этого необходимо сначала узнать какие легальные DHCP серверы сейчас присутствуют в сети. Есть несколько способов как узнать IP адреса этих серверов, но пожалуй, самый надежный это использование утилиты dhclient.
Как видно на скриншоте мы запускаем утилиту для интерфейса eth0. Сначала происходит запрос gj по всей сети, кто может предоставить IP адрес (DHCPDICOVER). На моем стенде только один DHCP сервер, поэтому на шаге DHCPOFFER откликнулся только узел .254. Но если бы серверов было несколько (а в больших сетях обычно их не менее двух), то здесь мы бы получили полный список потенциальных целей. На шаге DHCPREQUEST клиент запрашивает уже конкретный адрес .149. DHCPACK – сервер выдал адрес .149. Итак, наша цель 192.169.222.254.
Далее нам потребуется утилита Yersinia. Если в вашем дистрибутиве Kali она не установлена выполните:
sudo apt install yersinia
Для запуска в графическом интерфейсе используем команду:
yersinia -G
В открывшемся окне выбираем DHCP -> Launch attack. Далее отмечаем sending DHCPDICOVER и жмем OK.
Атака началась. Утилита будет отправлять пакеты DHCPDISCOVER от разных MAC адресов и сервер будет послушно выдавать IP адреса каждому новому “клиенту” до тех, пока они не закончатся. Через пару минут жмем List Attacks -> Stop.
Теперь можно активировать наш поддельный DHCP сервер и выдавать свои адреса.
3. Атаки на канальном уровне
Утилиту Yersinia можно не закрывать, она нам еще пригодится. Для понимания реализации описываемых далее манипуляций необходимо знакомство с основами работы протокола Spanning Tree (STP). Основной задачей STP является устранение петель в топологии произвольной сети Ethernet, в которой есть один или более коммутаторов, связанных избыточными соединениями. STP решает эту задачу, автоматически блокируя соединения, которые в данный момент для полной связности коммутаторов являются избыточными. В качестве иллюстраций работы STP воспользуюсь картинками из мануалов уже покинувшего Россию вендора.
Для работы STP необходимо выбрать корневой коммутатор (root). Выбор происходит на основе приоритетов каждого из коммутаторов, а если приоритеты одинаковые, сравниваются MAC адреса. Побеждает наименьший. Все остальные коммутаторы (кроме root), выбирают единственный порт направленный на root. Все остальные “лишние” (или запасных) порты блокируются. После включения коммутаторов в сеть по умолчанию каждый коммутатор считает себя корневым (root). Затем каждый коммутатор начинает посылать по всем портам конфигурационные Hello BPDU (Bridge Protocol Data Unit) фреймы раз в 2 секунды.
Вот здесь то в игру и вступает наш злоумышленник. Мы можем: во-первых, с помощью Wireshark узнать MAC адрес текущего корневого коммутатора. Затем с помощью специальных утилит отправить фрейм BPDU со значением меньшим настоящего root и тем самым стать корнем. В результате весь трафик пойдет через наш узел.
В качестве примера атаки снова воспользуемся утилитой Yersinia. В интерфейсе программы выбираем STP -> Launch attack. Далее Claiming Root Role. Жмем OK.
4. ARP Spoofing
И завершим мы наш “хит парад” MiTM атак еще одной классической атакой - ARP Spoofing, также известной как ARP poisoning. ARP (Address Resolution Protocol) — протокол в компьютерных сетях, предназначенный для определения MAC-адреса по IP-адресу другого компьютера. Суть атаки заключается в следующем: злоумышленник посылает ложные ARP-пакеты, для того чтобы убедить компьютер жертвы в том, что прослушивающий компьютер и есть конечный адресат. Далее пакеты с компьютера жертвы перехватываются и пересылаются реальному получателю, МАС-адрес отправителя в них подменяется, чтобы ответные пакеты тоже шли через прослушивающий компьютер. Прослушивающий компьютер становится «шлюзом» для трафика жертвы, и злоумышленники получают возможность прослушивать трафик, осуществляя атаку «человек посередине».
В реализации этой атаки нам поможет утилита arpspoof. Если узел пентестера это С, узел А это машина жертвы, а B это шлюз или целевой сервер, информационный обмен с которым нас интересует, то вызов команды будет иметь следующий вид:
arpspoof -i интерфейс -c both -t узел_А -r узел_B
Помимо рассмотренных способов реализации MiTM существует также множество других методов, например внедрение ложных маршрутов в протоколы динамической маршрутизации, отравление DNS, модификация файла hosts и другие. Для беспроводных сетей также можно использовать поднятие поддельной точки доступа с последующим перенаправлением всего трафика на узел злоумышленника.
Ищем интересное в трафике
Теперь, когда мы знаем, как перенаправить трафик через свой узел немного поговорим о том, как это можно использовать. Начнем с уже упомянутого HTTPS. Для реализации атаки нам потребуется утилита Sslsplit, входящая в состав Kali Linux.
Далее нам необходимо сформировать самоподписанный сертификат. Для начала обновим необходимые библиотеки:
И сгенерируем свой сертификат:
Теперь SSLsplit сможет подписывать формируемые сертификаты запрашиваемых доменов.
Далее воспользуемся Sslsplit для запуска прослушивания SSL трафика:
Здесь присутствуют уже сгенерированные ранее сертификаты, файл журнала коннектов, и каталог в котором будут храниться логи всех подключений. Далее, после “ssl” мы указываем, что идет перехват именно SSL трафика и будет производиться подмена сертификата. Далее указываются интерфейс и порт на которых слушается трафик, интерфейс и порт, к которым будет осуществляться подключение.
Здесь постановка узла злоумышленника в общем случае необязательна, можно, конечно получать просто копии трафика, но при установке в разрыв мы гарантированно будем видеть весь проходящий трафик.
Воспользуемся утилитой Responder, также входящей в состав Kali Linux.
Далее утилита отобразит свои опции и их статусы. Нас будет интересовать LLMNR, NBT-NS и MDNS. Они должны быть включены.
Результаты работы утилиты выводятся на экран, как и перехваченные хэши, например вот такие:
Перебор хэшей мы уже рассматривали в предыдущей статье, поэтому сейчас на данной теме останавливаться не будем. Но здесь важно понимать, что если наш пентестер работает по модели Гость и ему удалось перехватить и расшифровать учетные данные доменного пользователя, то он превращается во Внутреннего нарушителя.
Не только MitM
Все, что описывалось в статье до этого было в той или иной степени посвящено сканированию сетевых ресурсов или просмотру и перехвату трафика. Однако это не единственное направление развития атак, которое могут использовать Внутренний нарушитель. При наличии прав в домене можно пытаться заходить в найденные сетевые папки, в которых как правило есть много всего интересного. Например, в исходных кодах скриптов и приложений могут обнаружится захаржкоженные учетные данные. Так, в приведенном ниже примере мы с помощью утилиты fgrep ищем вхождения символов pass в скриптах на Python.
И нашли закомментированное присвоение переменной passw некоторого значения. Вроде как строка была в комментарии и пароль скорее всего не был захардкожен, но тем не менее пентестеру неплохо бы внимательно изучить код файла test.py как на предмет возможных полезных учетных данных, так и на изучение общей логики.
Аналогично, можно использовать fgrep для поиска интересных слов в различных документах, исходных кодах и журналах событий.
Заключение
В этой обзорной статье мы поговорили об основных направлениях развития атак при тестировании на проникновение по моделям Гость и Внутренний нарушитель. Так получилось, что основной упор был сделан на те действия, которые может выполнить Гость (сканирование, перехват) так как у данного нарушителя собственно никаких прав в сети нет и ему нужно каким-то образом себе добыть учетные данные для последующего развития атаки. Однако, Внутренний нарушитель тоже может использовать эти методы работы с трафиком и возможно он добьется даже большего успеха, так как ему скорее всего будет доступно больше сетевых сегментов. Он же все-таки легальный пользователь.
Тем не менее, в следующей статье мы продолжим рассматривать пентест от имени Внутреннего нарушителя. Рассмотрим различные методы поднятия привилегий, вспомним работу с mimikatz. А затем поговорим о том, как можно использовать методы социальной инженерии совместно с техническими методами пентеста.
А прямо сейчас приглашаю всех на бесплатный урок, где рассмотрим один из базовых инструментов для обеспечения безопасности Kubernetes-кластеров - сервисная сетка (service mesh) на базе opensource инструмента Istio. Рассмотрим, из каких компонентов состоит сервисная сетка, как устроен инструмент Istio (control и data plane, sidecar, envoy), как осуществляется и внедряется термин наблюдаемости (observability). Во время технического демо мы продемонстрируем как развернуть k3d-кластер, проинсталировать Istio и добавить в сервисную сетку свое первое приложение, развернутое в Kubernetes-кластере.