Как за одну неделю захватить контроллер домена, или Пивотинг за 300

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

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

Итак, начнем с истории о том, как за одну неделю удалось захватить контроллер домена ИТ-инфраструктуры промышленного предприятия.

Предыстория

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

В результате проведенных работ периметр был пробит с двух точек: Windows и Linux-серверов. После демонстрации результатов руководство предприятия обратилось с дополнительной просьбой — осуществить «захват» внутренней инфраструктуры, что мы и сделали в качестве бонуса.

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

Что мы сделали?

Пробитые машины в ДМЗ (DMZ, демилитаризованная зона, часть внутренней сети, изолированная от других сегментов) не имели выхода в сеть Интернет, и единственным транспортом для передачи данных был DNS.

f1bc2acf4a49cc40d42ed3c1a5ffb472.png

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

Оба сервера были скомпрометированы под непривилегированными учетными записями, поэтому для пивотинга не мог быть использован полноценный VPN (iodine), а только проксирование и пробросы портов.

Продвижение началось с попытки открытия туннеля через dnscat. Но вот незадача, как же передать его сначала на сервер, ведь Интернета там нет? Попытка запивотиться шла одновременно на Windows и Linux-серверах. Чтобы передать dnscat, используя только базовые команды операционной системы, мы написали vbs/bash-скрипты под Windows и Linux соответственно, использующие dns-запросы для скачивания/выкачивания произвольных файлов.

f7c3f13b70327f20fee60fd2c4d92162.jpg

Серверная часть, подставляющая в DNS-ответы hexastring (текстовое представление двоичных данных) требуемого содержимого, приведена тут.

Ход загрузки dnscat через DNS-загрузчик выглядел примерно так:

f2acb0eaeae94a19238f51b03e46ef32.png

В последствии эти скрипты выручали нас еще не раз. Кстати, более подробное их использование мы описывали в статье на Хакер.ru.

В результате на Linux-сервер успешно был загружен и запущен dnscat.

c4c7806b5f16a9d61660e4ed95939ecb.png

Dnscat умеет пробрасывать порт через DNS, но возможность динамического проброса портов там отсутствует. Поэтому далее был загружен socks-прокси (3proxy) и через dnscat проброшен порт на него.

54f879db01ee75c8b62c113f39725b18.png

Так как работа с DNS требует делегированную зону и, соответственно, белый IP-адрес, размещенный на выделенном сервере (VDS), а весь хакерский инструментарий расположен на ноутбуке пентестера, то с помощью SSH дополнительно был проброшен порт, ведущий на dnscat через опорный VDS.

727c63031529a63c94d7bf9442c35da7.png

Теперь, используя DNS-туннель, можно было использовать локальный socks-прокси на скомпрометированном Linux-сервере и получить сетевой доступ до любых узлов через него.

a74cd117a573d58b64bc917461d17f80.png021788d640eb10733521d9de2bde6486.png

К сожалению, выяснилось, что этот сервер не имел сетевого доступа никуда, кроме сегмента DMZ.

Параллельно шла попытка поднятия DNS-туннеля на втором скомпрометированном Windows-сервере. Однако антивирусное программное обеспечение удаляло известные хакерские инструменты по типу dnscat, а писать собственные решения не позволяло время. Так как DNS достаточно медленный, то на скачивание очередного хакерского инструмента и ещё одной попытки обойти антивирус уходило достаточно много времени. Поэтому, чтобы задействовать этот сервер для возможности передачи сетевого трафика, был использован локальный прокси-сервер (ncat.exe), достаточно безобидный для антивирусов.

16fa2936a24d94cccf43570865456661.png

Вход в указанный прокси производился уже через Linux-сервер с настроенным доступом по DNS.

17ddd754800bbdd978328ff88c96dcea.png

Задействовав таким образом прокси на Windows-сервере, было установлено, что через него возможен сетевой доступ в другие сетевые сегменты за пределами DMZ.

6b90d6dd405a71aad13186e45b00f5a6.png

В результате сканирования портов в новых доступных сетевых сегментах были быстро выявлены Linux-серверы со слабыми паролями.

c7d5f38f723051218d906051fa6b863b.png

Это позволило получить к ним root-доступ:

92ac231f83350918b80cddd0cdb27f8a.png

Обладание правами root открыло возможности создания VPN-туннеля. В нашем случае, используя базовые команды Linux, удалось открыть L3 VPN-туннель (victim и attacker, соответственно):

c05fdb023429b5447a2ac95a1a16b1ea.png8f86ea83e9ac6d0128c9c28ecec5c508.png

Теперь у нас был VPN-туннель внутри DNS-туннеля. Сетевой доступ через туннель давал возможность более быстрого сканирования портов и шанс задействовать UDP и ICMP. Таким образом мы получили полноценный сетевой доступ до узлов корпоративной сети.

4eeed726c1031f543c158b827631e69a.png

Возможность полноценно взаимодействовать с внутренними корпоративными узлами уже чего-то стоила.

5157b3ddf4c7313f02f9895d0a8bf4c4.png

Дальнейшее развитие во внутренней сети атак, направленных на захват контроллеров домена и компрометации всей внутренней инфраструктуры, было лишь делом времени. И времени весьма немалого… Низкая скорость соединения делала непригодными половину хакерских инструментов. Например, psexec падал с ошибкой, пока его серверный компонент успевал скачаться на целевой узел.

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

f35565e1edb5ee1ea58d2401f50cbc20.png

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

726ffdcc850af26d0147dd461ec729e0.png

Вывод

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

Автор:  Андрей Жуков, ведущий специалист по анализу защищенности

© Habrahabr.ru