Содержание статьи
Внутри большинства скриптов разведки работает LDAP. Например, когда ты запускаешь скрипт GetUserSPNs. из Impacket, он отправляет LDAP-запрос в службу каталогов со следующим фильтром:
(&(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(servicePrincipalName=*))
Этот фильтр запрашивает все включенные учетные записи пользователей с непустым SPN — то есть учетные записи, для которых можно запросить билет TGS.
Сборщики BloodHound получают список всех объектов в Directory Service с помощью разных запросов. Например, RustHound использует запрос такого вида:
(objectClass=*)
Аналогично запрашивается информация по LDAP при разведке сервисов AD CS, SCCM и других.
Однако у команд защиты постепенно появляется все больше способов отлавливать разведку инфраструктуры через LDAP. В сегодняшней статье разберем эти методы, а также посмотрим, какие есть возможности для обфускации запросов от средств защиты.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Краткая теория LDAP и служб каталогов
Перед тем как перейти к обнаружению атак и способам защиты, давай сначала разберемся, что такое LDAP и как он работает. Если по‑простому, LDAP — это база данных AD. Данные хранятся в службе каталогов (Directory Service) в виде древовидной структуры. Объект домена — корень, от которого отходят ветви с категориями данных.

Классический LDAP-запрос Search состоит из следующих полей:
-
BaseObject(StartingNode) — точка, откуда начнется поиск. Например, это может быть весь домен или отдельная ветка с пользователями, если тебе интересны только объекты пользователей; -
Scope — параметр LDAP-запроса Search, который определяет глубину поиска. Значение
subtreeподойдет, если нужен поиск во вложенных ветках,onelevel— если нужен поиск на одном уровне, без углубления в ветки. Еще естьbase— поиск только по одному объекту, базе; - фильтр запроса — условие, которому должны соответствовать искомые объекты;
- запрашиваемые атрибуты — атрибуты, которые будут запрошены у найденных объектов.
Сам фильтр запроса состоит из следующих частей:
- искомый атрибут;
- значение;
- оператор сравнения;
- отрицание — если нужно исключить определенные объекты.
Пример фильтра запроса:
(name=Bob)
В результате применения фильтра сервер вернет нам все объекты, у которых в атрибуте name есть значение Bob.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
