Источник: https://github.com/AnaktaCTF/CTF/blob/main — Misc/Pentest_Active_Directory_LDAP.md
- 1. Введение
- 2. Структура LDAP-запросов и использование ldapsearch
- 3. Исследование и эксплуатация уязвимостей LDAP
1. Введение
Что такое Active Directory?
Active Directory (AD) - это технология, разработанная компанией Microsoft, которая используется для управления пользователями, компьютерами и другими ресурсами в корпоративной сети. Это центральная система, которая позволяет администраторам управлять доступом к информации, защищать данные и обеспечивать эффективную работу сети.
Представим офис с сотнями сотрудников и компьютеров. Нам нужна система контроля доступа, чтобы гарантировать, что каждый сотрудник может безопасно использовать ресурсы компании, такие как файлы, принтеры или приложения. Active Directory выполняет эту функцию, выступая в качестве базы данных, в которой хранится информация обо всех объектах (пользователях, компьютерах, серверах и других устройствах) в сети.
AD также помогает организовать пользователей и ресурсы, автоматизировать задачи и обеспечить безопасность.
Что за протокол LDAP?
Active Directory использует различные протоколы для выполнения своих функций, одним из которых является Lightweight Directory Access Protocol (LDAP). LDAP - это протокол, который позволяет приложениям и пользователям взаимодействовать с базой данных Active Directory.
Проще говоря, LDAP - это язык, с помощью которого можно «делать запросы» к Active Directory:
- Кто имеет доступ к определенному ресурсу?
- Как зовут владельца учетной записи?
- Какие компьютеры принадлежат этой сети?
LDAP организует данные в дерево, корнем которого является домен, а ветвями - организационные единицы (OU).
DC=example, DC=com (корень)
|
+-- OU=Sales (подразделение "Продажи")
| +-- CN=Ivan Ivanov (учетная запись пользователя)
|
+-- OU=IT (подразделение "IT")
+-- CN=Server1 (учетная запись компьютера)
Здесь, DC (Domain Component) указывает домен, OU (Organizational Unit) организационную единицу, а CN (Common Name) - объекты, такие как пользователи или устройства.
Как выглядит LDAP в реальной жизни?
Мы можем представить LDAP как адресную книгу, в которой хранятся записи о сотрудниках вашей компании. Каждый сотрудник - это «запись» (entry), которая включает в себя имя, должность, контактную информацию и другие данные. Например
- Имя: Иван Иванов
- Логин: ivan.ivanov
- Электронная почта: ivan.ivanov@example.com
Когда мы ищем информацию в этой "книге" - это и есть работа LDAP.
Пример в ИТ-среде:
- Мы вводим свой логин и пароль для доступа к компьютеру компании.
- Система проверяет ваши учетные данные по LDAP.
- Если логин и пароль совпадают, мы получаем доступ.
Роль LDAP в Active Directory
Основными функциями LDAP являются поиск объектов, управление ими и аутентификация.
Поиск объектов: LDAP позволяет находить пользователей, устройства и группы, запрашивая информацию по заданным критериям. Например, администратор может найти список всех сотрудников, чья фамилия начинается с «Иванов».
Управление: создание, изменение или удаление объектов (пользователей, устройств) через LDAP.
Аутентификация: при входе в систему данные пользователя передаются через LDAP для проверки их соответствия учетной записи в AD.
2. Структура LDAP-запросов и использование ldapsearch
Каждый LDAP-запрос состоит из нескольких ключевых элементов:
-
Базовый DN (Distinguished Name):
Это точка входа в иерархию LDAP, с которой начинается поиск. Например:DC=example,DC=com- корневой DN для домена example.com.OU=Sales,DC=example,DC=com- узел подразделения "Продажи" внутри домена.
-
Фильтр поиска:
Фильтр определяет, какие объекты будут возвращены. Он включает условия в формате(атрибут=значение)или более сложные конструкции, такие как логические операторы:(objectClass=user)- поиск всех объектов, относящихся к пользователям.(&(objectClass=user)(sAMAccountName=ivanov))- поиск пользователя с логиномivanov.
-
Область поиска:
Определяет глубину поиска:- Base: только указанный DN.
- One: объекты в непосредственных дочерних узлах.
- Sub: все узлы, включая дочерние.
-
Атрибуты:
Это информация, которую нужно вернуть. Например, имя, логин, адрес электронной почты. Если атрибуты не указаны, возвращаются все доступные.
Утилита ldapsearch
Утилита ldapsearch входит в состав пакета OpenLDAP и позволяет выполнять запросы к LDAP-серверам из командной строки. Она поддерживает гибкую настройку фильтров, выбор атрибутов и аутентификацию.
Основной синтаксис
Пример базовой команды:
ldapsearch -x -H ldap://<server> -b "<BaseDN>" "<Filter>"
-x- указывает, что используется простая аутентификация (без SASL).-H- адрес LDAP-сервера, например,ldap://172.16.8.3.-b- базовый DN, с которого начинается поиск.<Filter>- фильтр поиска, например,(objectClass=user).
Примеры LDAP-запросов с ldapsearch
1. Получение базовой информации о домене
Для начала можно запросить информацию о корне домена:
ldapsearch -x -H ldap://172.16.8.3 -s base -b "" "(objectClass=*)"

Этот запрос возвращает список основных конфигурационных данных домена, включая информацию о корневом DN.
2. Поиск всех пользователей в домене
Для поиска всех учетных записей пользователей можно использовать фильтр (objectClass=user) и указать корневой DN:
ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=user)"

Чтобы отобразить только нужные атрибуты, например имя и логин, добавим их в запрос:
ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=user)" cn sAMAccountName

3. Поиск учетной записи по имени пользователя
Если известен логин пользователя (например, hathat), можно выполнить запрос:
ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(&(objectClass=user)(sAMAccountName=hathat))"

И получить все атрибуты, связанные с конкретным пользователем, например имя, принадлежность к группам и почтовый адрес.
4. Поиск всех групп и их членов
Для извлечения списка групп и их участников можно использовать фильтр (objectClass=group):
ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=group)" cn member

Атрибут member покажет, какие учетные записи входят в каждую группу.
5. Поиск компьютеров в сети
Чтобы найти все учетные записи компьютеров, используем фильтр (objectClass=computer):
ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=computer)" cn

Этот запрос полезен для понимания состава устройств в сети.
Использование расширенных фильтров
LDAP поддерживает логические операторы для создания сложных запросов. Например:
-
&(AND):ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(&(objectClass=user)(department=marketing))"
Возвращает всех пользователей, работающих в отделе
Marketing. -
|(OR):ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(|(sAMAccountName=ivanov)(sAMAccountName=petrov))"
Возвращает учетные записи
tralleseиhathat. -
!(NOT):ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(!(objectClass=computer))"Исключает все объекты компьютеров из результата.
3. Исследование и эксплуатация уязвимостей LDAP
Обнаружив открытые порты с LDAP (389 для ldap и 636 для ldaps), мы можем перейти к проверке правильной настройки протокола.
Анонимный доступ
Одной из первых проверок является тест на возможность анонимного подключения. В случае, если LDAP-сервер позволяет подключение без аутентификации, это открывает злоумышленнику доступ к определенным данным.
С помощью ldapsearch можно попробовать выполнить запрос без ввода учетных данных:
ldapsearch -x -H ldap://<server_ip> -s base
Если сервер отвечает, мы можем узнать базовую информацию, например:
- Имя домена (например,
DC=example,DC=com). - Список объектов верхнего уровня (OU, CN и другие).
Слабые учетные записи
После проверки анонимного доступа важно протестировать учетные записи, которые могут быть настроены с минимальными правами. Часто в больших организациях есть служебные или тестовые учетные записи с простыми логинами и паролями, например, test/test или guest/guest.
Для автоматизации брутфорса учетных записей можно использовать такие инструменты, как Hydra или Medusa. Пример команды для брутфорса через Hydra:
hydra -L usernames.txt -P passwords.txt ldap://<server_ip>
Если удастся подобрать учетные данные, даже минимальный доступ можно использовать для выполнения расширенных запросов к LDAP.
Поиск данных через LDAP-запросы
После получения доступа, анонимного или авторизованного, начинается этап сбора данных. LDAP-запросы позволяют извлекать большое количество информации. С помощью ldapsearch или PowerShell-команд можно искать:
-
Список всех пользователей в домене:
ldapsearch -x -b "DC=example,DC=com" "(objectClass=user)" -
Список компьютеров в сети:
ldapsearch -x -b "DC=example,DC=com" "(objectClass=computer)" -
Информацию о группах. Например, группы
Administrators:ldapsearch -x -b "CN=Administrators,CN=Builtin,DC=example,DC=com"
LDAP Injection
LDAP Injection - это одна из самых опасных уязвимостей. Она возникает, когда сервер принимает пользовательский ввод без должной проверки и включает его в LDAP-запрос. Это позволяет нам модифицировать запросы и извлекать или изменять данные, к которым у него обычно нет доступа.
Пример эксплуатации:
Если веб-приложение принимает имя пользователя для поиска в LDAP и не фильтрует специальные символы, мы можем вставить что-то вроде:
*)(|(objectClass=*))
И в результате сервер вернет список всех объектов, а не только тех, которые соответствуют изначальному запросу.
Пример кода уязвимого запроса на стороне сервера:
(&(uid={input})(objectClass=person))
Если ввести admin*)(|(objectClass=*, результатом будет обход фильтрации.
Защита от LDAP Injection заключается в строгой проверке пользовательского ввода и использовании параметризованных запросов.
Пароли в открытом виде
Поле description часто используется для хранения вспомогательной информации об учетной записи. Однако из-за отсутствия понимания безопасности администраторы могут оставлять в нем чувствительные данные, включая пароли. Это происходит по нескольким причинам:
- Для "удобства" администратор может записать текущий пароль пользователя прямо в описание.
- Временно выданные пароли часто указываются в описании, чтобы потом их можно было передать пользователю.
- Личные или корпоративные привычки сотрудников вести "заметки" в таких полях.

Перехват данных и атаки "man-in-the-middle"
LDAP по умолчанию передает данные в открытом виде (порт 389), что делает возможным перехват запросов и ответов. Это особенно опасно, если через протокол передаются учетные данные.
Для проверки на этот тип уязвимости можно использовать инструменты анализа трафика, такие как Wireshark или mitmproxy. После настройки MITM-атаки и захвата трафика можно обнаружить:
- Логины и пароли, передающиеся в запросах.
- Конфиденциальные данные о структуре сети.
Если сервер использует LDAPS (шифрованный LDAP на порту 636), MITM-атака становится сложнее, но возможна подмена сертификатов. Например, с помощью инструмента Responder можно перехватить попытки подключения к серверу, чтобы отправить жертве поддельный сертификат.
Атака на Kerberos через LDAP
LDAP тесно связан с Kerberos в Active Directory. Получив доступ к LDAP, можно найти учетные записи с привилегиями, такие как krbtgt, и попытаться получить их хэши. Атака "Kerberoasting" часто начинается с LDAP-запросов, чтобы найти учетные записи, у которых есть Service Principal Name (SPN).
Пример запроса ldapsearch:
ldapsearch -x -b "DC=example,DC=com" "servicePrincipalName=*" sAMAccountName servicePrincipalName
Найденные учетные записи можно использовать для последующей атаки с помощью таких инструментов, как Impacket или Rubeus.
Эксплуатация чрезмерных прав
В некоторых случаях учетные записи или группы имеют чрезмерные права на выполнение запросов к LDAP. Например, если учетная запись имеет доступ к конфиденциальным атрибутам, таким как пароли, это можно использовать для атаки.
Через LDAP можно запросить атрибут ms-MCS-AdmPwd, в котором хранятся локальные пароли для администраторов. Если учетная запись имеет доступ к этому атрибуту, мы можем получить локальный администраторский доступ к компьютерам в сети.
Пример команды для поиска уязвимости с помощью ldapsearch:
ldapsearch -x -b "DC=example,DC=com" "(objectClass=computer)" ms-MCS-AdmPwd
Автор: Дейникин Максим Юрьевич