Источник: https://github.com/AnaktaCTF/CTF/blob/main — Misc/Pentest_Active_Directory_LDAP.md

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), которая включает в себя имя, должность, контактную информацию и другие данные. Например

Когда мы ищем информацию в этой "книге" - это и есть работа LDAP.

Пример в ИТ-среде:

  • Мы вводим свой логин и пароль для доступа к компьютеру компании.
  • Система проверяет ваши учетные данные по LDAP.
  • Если логин и пароль совпадают, мы получаем доступ.

Роль LDAP в Active Directory

Основными функциями LDAP являются поиск объектов, управление ими и аутентификация.

Поиск объектов: LDAP позволяет находить пользователей, устройства и группы, запрашивая информацию по заданным критериям. Например, администратор может найти список всех сотрудников, чья фамилия начинается с «Иванов».

Управление: создание, изменение или удаление объектов (пользователей, устройств) через LDAP.

Аутентификация: при входе в систему данные пользователя передаются через LDAP для проверки их соответствия учетной записи в AD.

2. Структура LDAP-запросов и использование ldapsearch

Каждый LDAP-запрос состоит из нескольких ключевых элементов:

  1. Базовый DN (Distinguished Name):
    Это точка входа в иерархию LDAP, с которой начинается поиск. Например:

    • DC=example,DC=com - корневой DN для домена example.com.
    • OU=Sales,DC=example,DC=com - узел подразделения "Продажи" внутри домена.
  2. Фильтр поиска:
    Фильтр определяет, какие объекты будут возвращены. Он включает условия в формате (атрибут=значение) или более сложные конструкции, такие как логические операторы:

    • (objectClass=user) - поиск всех объектов, относящихся к пользователям.
    • (&(objectClass=user)(sAMAccountName=ivanov)) - поиск пользователя с логином ivanov.
  3. Область поиска:
    Определяет глубину поиска:

    • Base: только указанный DN.
    • One: объекты в непосредственных дочерних узлах.
    • Sub: все узлы, включая дочерние.
  4. Атрибуты:
    Это информация, которую нужно вернуть. Например, имя, логин, адрес электронной почты. Если атрибуты не указаны, возвращаются все доступные.

Утилита 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=*)"

1

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

2. Поиск всех пользователей в домене

Для поиска всех учетных записей пользователей можно использовать фильтр (objectClass=user) и указать корневой DN:

ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=user)"

2

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

ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=user)" cn sAMAccountName

3

3. Поиск учетной записи по имени пользователя

Если известен логин пользователя (например, hathat), можно выполнить запрос:

ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(&(objectClass=user)(sAMAccountName=hathat))"

4

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

4. Поиск всех групп и их членов

Для извлечения списка групп и их участников можно использовать фильтр (objectClass=group):

ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=group)" cn member

5

Атрибут member покажет, какие учетные записи входят в каждую группу.

5. Поиск компьютеров в сети

Чтобы найти все учетные записи компьютеров, используем фильтр (objectClass=computer):

ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(objectClass=computer)" cn

6

Этот запрос полезен для понимания состава устройств в сети.

Использование расширенных фильтров

LDAP поддерживает логические операторы для создания сложных запросов. Например:

  • & (AND):

    ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(&(objectClass=user)(department=marketing))"
    

    7

    Возвращает всех пользователей, работающих в отделе Marketing.

  • | (OR):

    ldapsearch -x -H ldap://172.16.8.3 -b "DC=example,DC=com" "(|(sAMAccountName=ivanov)(sAMAccountName=petrov))"
    

    8

    Возвращает учетные записи 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 часто используется для хранения вспомогательной информации об учетной записи. Однако из-за отсутствия понимания безопасности администраторы могут оставлять в нем чувствительные данные, включая пароли. Это происходит по нескольким причинам:

  • Для "удобства" администратор может записать текущий пароль пользователя прямо в описание.
  • Временно выданные пароли часто указываются в описании, чтобы потом их можно было передать пользователю.
  • Личные или корпоративные привычки сотрудников вести "заметки" в таких полях.

9

Перехват данных и атаки "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

Автор: Дейникин Максим Юрьевич