Enumerating Active Directory, part 1

Enumerating Active Directory, part 1

@cherepawwka

Всем привет!

Это вторая статья из цикла статей по атакам на домены Active Directory. В прошлый раз мы говорили о получении первоначального доступа к домену. Сегодня речь пойдет о втором шаге при атаках на домен — его перечислении (AD Enumeration).

Enumerating Active Directory

Эта статья является логическим продолжением статьи Breaching Active Directory (часть 1, часть 2). Здесь мы подробно коснемся понятия объектов в AD и посмотрим, какие способы существуют для сбора информации об этих объектах.

В первой части статьи будут продемонстрированы ручные способы перечисления Active Directory, такие как CMD, PowerShell, MMC. Во второй части мы поговорим про автоматические и полуавтоматические средства перечисления, такие как Bloodhound|SharpHound, PowerView и т.п.

Вторая часть доступна по ссылке ниже:

Приступим!


Введение

Теперь, когда у злоумышленника есть первоначальный набор действительных учетных данных Active Directory, можно приступать к методам перечисления AD.

Схема рассматриваемой сети приведена на рисунке ниже:

Схема рассматриваемой сети

AD Enumeration

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

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

Cyber KillChain
Cyber KillChain

Цели

В этой статье мы рассмотрим несколько методов, которые можно использовать для перечисления AD. Это ни в коем случае не полный список, так как доступные методы обычно очень ситуативны и зависят от характера полученного доступа. Однако мы рассмотрим следующие методы перечисления AD:

  • Оснастки AD консоли управления Microsoft;
  • Сетевые команды командной строки;
  • Командлеты AD-RSAT PowerShell;
  • Bloodhound.


Первоначальный доступ

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

Username: jenna.field
Password: Income1982

Эта пара учетных данных предоставляет доступ RDP и SSH к THMJMP1.za.tryhackme.com. THMJMP1 можно рассматривать как точку входа в сеть, имитирующий достигнутый футхолд. Подключиться к нему можно следующей командой:

ssh za.tryhackme.com\\jenna.field@thmjmp1.za.tryhackme.com

Аналогично проделаем с RDP (я использую клиент Remmina):

Подключение к хосту по RDP и SSH


Credential Injection

Прежде чем перейти к объектам AD и перечислению, давайте сначала поговорим о методах внедрения учетных данных (Credential Injection). В статье Breaching AD вы увидели, что учетные данные часто можно получить без компрометации машины, присоединенной к домену. А вот для работы конкретных методов перечисления может потребоваться определенная настройка.

Windows против Linux

При перечислении AD с атакующей машины можно продвинуться невероятно далеко. Тем не менее, если злоумышленник действительно хочет провести углубленное перечисление и даже эксплуатацию, ему нужно научиться подражать своему врагу. Таким образом, нужна машина с Windows. Это позволит ему использовать несколько встроенных методов для начала нашего перечисления. В этой статье мы рассмотрим один из таких встроенных инструментов, который называется runas.exe.

Runas

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

Если у атакующего есть учетные данные для доступа к AD, мы можно использовать runas.exe, легитимный двоичный файл Windows, для внедрения учетных данных в память. Обычная команда Runas будет выглядеть примерно так:

runas.exe /netonly /user:<domain>\<username> cmd.exe

Посмотрим на параметры:

  • /netonly — поскольку на текущем этапе злоумышленник не присоединен к домену, ему необходимо загрузить учетные данные для сетевой аутентификации, но не для аутентификации на контроллере домена. Таким образом, команды, выполняемые локально на компьютере, будут выполняться в контексте стандартной учетной записи Windows, но любые сетевые подключения будут выполняться с использованием указанной здесь учетной записи;
  • /user — здесь предоставляется информацию о домене и имени пользователя. Наиболее безопасно использовать полное доменное имя (FQDN) вместо только NetBIOS-имени домена из-за возможных проблем с разрешением имён;
  • cmd.exe — это программа, которую атакующий хочет выполнить после ввода учетных данных. Её можно изменить на что угодно, но самый безопасный вариант — cmd.exe, поскольку её можно использовать его для запуска всего с введенными учетными данными.

После запуска этой команды будет предложено ввести пароль. Поскольку мы добавляем параметр /netonly, учетные данные не будут проверяться непосредственно контроллером домена, поэтому он будет принимать любой пароль. Но при этом нам важно указывать именно действительный пароль для доступа к доменным службам.

It's Always DNS

Примечание. Следующие шаги необходимо выполнить только в том случае, если для атаки используется собственный компьютер с Windows. Тем не менее, полезно с ними ознакомиться.

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

SYSVOL — это папка, существующая на всех контроллерах домена. Это общая папка, в которой хранятся объекты групповых политик (GPO) и информация, а также любые другие сценарии, связанные с доменом. Это важный компонент Active Directory, поскольку он доставляет эти объекты групповых политик на все компьютеры в домене. Присоединенные к домену компьютеры затем могут читать эти объекты и применять их, внося изменения в конфигурацию.

Прежде чем мы сможем перечислить SYSVOL, нужно настроить наш DNS . Иногда может повезти: внутренний DNS будет настроен автоматически через DHCP или VPN-подключение, но так бывает не всегда. Изучим, как это сделать вручную. Самый безопасный выбор для DNS-сервера — обычно контроллер домена. Используя IP-адрес контроллера домена, мы можем выполнить следующие команды в окне PowerShell:

$dnsip = "<DC IP>"
$index = Get-NetAdapter -Name 'Ethernet' | Select-Object -ExpandProperty 'ifIndex'
Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses $dnsip

Убедиться, что DNS работает, можно следующей командой:

C:\> nslookup za.tryhackme.com

Результатом должен быть IP-адрес контроллера домена, поскольку именно здесь размещается полное доменное имя. Теперь, когда DNS работает, можно, наконец, проверить имеющиеся учетные данные. Мы можем использовать следующую команду в cmd для принудительного сетевого просмотра каталога SYSVOL:

C:\Tools>dir \\za.tryhackme.com\SYSVOL\
 Volume in drive \\za.tryhackme.com\SYSVOL is Windows
 Volume Serial Number is 1634-22A9

 Directory of \\za.tryhackme.com\SYSVOL

02/24/2022  09:57 PM    <DIR>          .
02/24/2022  09:57 PM    <DIR>          ..
02/24/2022  09:57 PM    <JUNCTION>     za.tryhackme.com [C:\Windows\SYSVOL\domain]
               0 File(s)              0 bytes
               3 Dir(s)  51,835,408,384 bytes free

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

IP против DNS-имен хостов

Есть ли разница между dir \\za.tryhackme.com\SYSVOL и dir \\<DC IP>\SYSVOL и почему такая шумиха вокруг DNS?

Разница велика, и она сводится к используемому методу аутентификации. Когда мы указываем имя хоста, сетевая аутентификация сначала попытается выполнить аутентификацию Kerberos (поскольку аутентификация Kerberos использует имена хостов, вложенные в билеты). Если вместо DNS-имени мы предоставим IP-адрес, то можем установить тип аутентификации NTLM. Хотя на первый взгляд это не имеет значения, полезно понимать эти небольшие различия, поскольку они могут позволить злоумышленнику оставаться более скрытным при проведении атаки. В некоторых случаях организации будут отслеживать атаки OverPass и Pass-The-Hash. Принудительная проверка подлинности NTLM — хороший способ избежать обнаружения в таких случаях.

Использование введенных учетных данных

Теперь, когда мы внедрили доменные учетные данные в память, начинается самое интересное. С параметром /netonly все сетевые соединения будут использовать эти введенные учетные данные для аутентификации. Сюда входят все сетевые подключения к приложениям, запускаемым из этого окна командной строки.

И это действительно мощный инструмент. Представим ситуацию, когда база данных MS SQL использует аутентификацию Windows, а атакующий не присоединен к домену. Злоумышленнику просто нужно запустить MS SQL Studio из этой командной строки. Даже если он показывает локальное имя пользователя, достаточно просто нажать «Enter», и приложение использует учетные данные AD в фоновом режиме для аутентификации. Мы даже можем использовать это для аутентификации в веб-приложениях, использующих аутентификацию NTLM.


Перечисление с помощью Microsoft Management Console

Microsoft Management Console

Сейчас мы рассмотрим первый метод перечисления, который является единственным методом, в котором используется графический интерфейс. Мы будем использовать консоль управления Microsoft (MMC) с оснасткой средств удаленного администрирования сервера (Remote Server Administration Tools', RSAT) AD. 

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

  1. Нажать Start;
  2. Найти «Apps & Features» и нажать Enter;
  3. Открыть «Manage Optional Features»;
  4. Нажать Add a feature;
  5. Найти "RSAT";
  6. Выбрать «RSAT: Active Directory Domain Services and Lightweight Directory Tools» и нажать «Install».
Установка RSAT

Теперь можно запустить MMC, нажав кнопку «Start», выполнив поиск и введя MMC. Если мы просто запустим MMC в обычном режиме, ничего не получится, поскольку наш компьютер не присоединен к домену, и наша локальная учетная запись не может использоваться для аутентификации в домене.

Не удалось запустить MMC из-за неверных учетных данных

Здесь в игру вступает Runas. Мы можем запустить MMC из командной строки, запущенной с доменной учетной записью, что гарантирует, что все сетевые подключения MMC будут использовать введенные нами учетные данные AD .

В MMC теперь необходимо подключить оснастку AD RSAT:

  1. Жмём File -> Add/Remove Snap-in;
  2. Выбираем и добавляем все три оснастки Active Directory Snap-ins;
  3. Пропускаем все ошибки и предупреждения;
  4. Щёлкаем правой кнопкой мыши на Active Directory Domains and Trusts и выбираем «Change Forest»;
  5. Вводим za.tryhackme.com в качестве корневого домена и нажимем OK;
  6. Щёлкаем правой кнопкой мыши на Active Directory Sites and Services и выбираем «Change Forest»;
  7. Вводим za.tryhackme.com в качестве корневого домена и нажимаем OK;
  8. Щёлкаем правой кнопкой мыши на Active Directory Users and Computers и выбираем «Change Domain»;
  9. Вводим za.tryhackme.com в качестве домена и нажимаем OK;
  10. Щелкните правой кнопкой мыши на Active Directory Users and Computers на левой панели;
  11. Нажимаем View -> Advanced Features.

Если все до этого момента сделано правильно, MMC теперь должна быть аутентифицирована в целевом домене:

Оснастка MMC AD

Теперь можно начать перечислять здесь информацию о структуре AD .

Пользователи и компьютеры

Давайте взглянем на структуру Active Directory. Для этого мы сосредоточимся на Active Directory Users and Computers. Развернём оснастку и развернём домен za, чтобы увидеть исходную структуру OU:

Структура домена

Давайте взглянем на каталог People. Здесь мы видим, что пользователи разделены по OU отделов. Нажав на каждое из этих подразделений, можно увидеть пользователей, принадлежащих к этой OU:

Пользователи в OU IT

Нажав на любого из этих пользователей, мы сможем просмотреть все их свойства и атрибуты. Мы также можем увидеть, в какие группы входит конкретный пользователь:

Группы пользователя adrian.chapman из OU IT

Мы также можем использовать MMC для поиска хостов в сети. Если мы нажмем «Servers» или «Workstations», отобразится список машин, присоединенных к домену:

Доменные серверы

Если бы у нас были соответствующие привилегии, мы могли бы использовать MMC для непосредственного внесения изменений в AD (изменить пароль пользователя, добавить учетную запись в определенную группу).

Преимущества этого метода

  • Графический интерфейс предоставляет отличный способ получить целостное представление о среде AD;
  • Возможен быстрый поиск различных объектов AD;
  • Он предоставляет прямой способ для просмотра конкретных обновлений объектов AD;
  • Если у используемой учетной записи есть достаточные привилегии, мы можем напрямую обновлять существующие объекты AD или добавлять новые.

Недостатки

  • Требуется RDP-доступ к машине (в случае использования доменной машины вместо своей).
  • Хотя поиск объекта выполняется быстро, сбор общих свойств или атрибутов AD невозможен.

Иногда такой способ перечисления может предоставить дополнительные плоды, например, возможность получить пароль административной или сервисной УЗ, который может располагаться в описании учетной записи (пример представлен на скриншоте ниже):

Полезная информация в описании УЗ


Перечисление с использованием командной строки

Командная строка

Бывают случаи, когда просто нужно выполнить быстрый поиск в AD, и в таком случае командная строка приходит на помощь. CMD удобна, когда у атакующего нет RDP-доступа к системе, синяя команда отслеживает использование PowerShell, и при этом существует возможность и необходимость выполнить перечисление AD через троян удаленного доступа (RAT). Атакующий даже может встроить пару простых команд перечисления AD в фишинговую полезную нагрузку, чтобы получить жизненно важную информацию, которая поможет организовать последнюю атаку.

CMD имеет встроенную команду, которую злоумышленник может использовать для перечисления информации об AD: net. Команда net является удобным инструментом для получения информации о локальной системе и AD. Мы рассмотрим пару интересных вещей, которые можно перечислить, используя эту команду в текущем положении в домене (это далеко не исчерпывающий список).

Пользователи

Мы можем использовать net, чтобы вывести список всех пользователей в домене AD, используя подопцию user:

C:\>net user /domain
The request will be processed at a domain controller for domain za.tryhackme.com

User accounts for \\THMDC

-----------------------------------------------------------------------
aaron.conway             aaron.hancock            aaron.harris
aaron.johnson            aaron.lewis              aaron.moore
aaron.patel              aaron.smith              abbie.joyce
abbie.robertson          abbie.taylor             abbie.walker
abdul.akhtar             abdul.bates              abdul.holt
abdul.jones              abdul.wall               abdul.west
abdul.wilson             abigail.cox              abigail.cox1
abigail.smith            abigail.ward             abigail.wheeler
[....]
The command completed successfully.
Результат использования команды для получения пользователей домена

Нам возвращен список всех пользователей AD. Этот список может помочь определить размер домена для проведения дальнейших атак. Мы также можем использовать подопцию с указанием имени пользователя для получения более подробной информации об отдельной учетной записи пользователя:

C:\>net user t0_tinus.green /domain
Получение информации о пользователе t0_tinus.green

Примечание. Если пользователь является частью небольшого числа групп AD , эта команда сможет показать нам его членство в группах. Однако, как правило, если пользователь состоит более чем в десяти группах команда, не может перечислить их все.

Группы

Мы можем использовать net для перечисления групп домена с помощью подопции group:

C:\>net group /domain
Перечисление групп домена

Эта информация может помочь найти интересные группы для достижения целей атаки. Мы также можем перечислить дополнительные сведения, такие как членство в группе, указав группу в той же команде:

C:\>net group "Tier 1 Admins" /domain
Результат запроса информации о группе Tier 1 Admins

Политика паролей

Мы можем использовать net и для перечисления политики паролей домена с помощью подопции accounts:

Политика паролей домена

Это даст нам полезную информацию, такую ​​как:

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

Эта информация может принести злоумышленнику пользу, давая возможность провести дополнительные атаки с распылением паролей против учетных записей пользователей, которые можно перечислить командой net user /domain. Знание политики паролей может помочь атакующей стороне понять, какие отдельные пароли нужно использовать в атаке и сколько атак можно провести, прежде чем получится заблокировать учетные записи. Однако следует отметить, что в случае выполнения атаки с распылением пароля вслепую, существует вероятность заблокировать учетные записи раньше времени, поскольку информация о количестве попыток авторизации до блокировки неизвестна.

Полный набор опций, связанных с командой net, можно найти здесь.

Преимущества

  • Не требуется никаких дополнительных или внешних инструментов;
  • Синяя команда часто не отслеживает эти подобные запросы;
  • Графический интерфейс для этого перечисления не требюуется;
  • VBScript и другие макроязыки, которые часто используются для фишинговых полезных нагрузок, изначально поддерживают эти команды, поэтому их можно использовать для перечисления исходной информации о домене AD перед созданием более таргетированных полезных нагрузок.

Недостатки

  • Команды net должны выполняться с компьютера, присоединенного к домену. Если машина не присоединена к домену, по умолчанию она будет принадлежать домену WORKGROUP;
  • Команды net могут не отобразить всю информацию об объектах. Например, если пользователь является членом более десяти групп, не все эти группы будут отображаться в выходных данных.


Перечисление с использованием PowerShell

PowerShell

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

С установкой AD-RSAT автоматически устанавливается более 50 соответствующих командлетов. Я рассмотрю некоторые из них, полный список командлетов можно найти здесь.

Используя наш терминал SSH , мы можем обновить его до терминала PowerShell, используя следующую команду: powershell

Пользователи

Командлет Get-ADUser может быть использован для перечисления пользователей в AD, например:

PS C:\> Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *
Информация о пользователе gordon.stevens

Используемые параметры:

  • -Identity — имя учетной записи, которую мы перечисляем;
  • -Properties — какие свойства, связанные с учетной записью, будут отображены (* покажет все свойства);
  • -Server — поскольку мы не присоединены к домену, мы должны использовать этот параметр, чтобы указать его на наш контроллер домена.

Для большинства этих командлетов мы также можем использовать параметр -Filter, который позволяет контролировать вывод. Также можно использовать командлет Format-Table для аккуратного отображения результатов:

PS C:\> Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A
Фильтрация вывода

Группы

Командлет Get-ADGroup поможет в перечислении групп в домене, например:

PS C:\> Get-ADGroup -Identity Administrators -Server za.tryhackme.com
Получение информации о группе Administrators

С помощью Get-ADGroupMember можно перечислить членов группы:

PS C:\> Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com
Перечисление членов группы Administrators

Объекты Active Directory

Общий поиск любых объектов AD можно выполнить с помощью командлета Get-ADObject. Например, если мы ищем все объекты AD, которые были изменены после определенной даты:

PS C:\> $ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00)
PS C:\> Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server za.tryhackme.com
Поиск объектов в AD

Если мы хотим, например, выполнить атаку с распылением пароля без блокировки учетных записей, можно перечислить учетные записеи, у которых badPwdCount больше 0, чтобы избегать этих УЗ при проведении атаки:

PS C:\> Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com
Результат исполнения команды

Этот запрос возвращает результаты только в том случае, если один из пользователей в сети несколько раз неправильно ввёл свой пароль.

Домены

Командлет Get-ADDomain позволит получить дополнительную информацию о конкретном домене:

PS C:\> Get-ADDomain -Server za.tryhackme.com
Получение информации о домене

Изменение объектов AD

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

Однако я покажу пример принудительного изменения пароля пользователя с помощью командлета Set-ADAccountPassword:

PS C:\> Set-ADAccountPassword -Identity jenna.field -Server za.tryhackme.com -OldPassword (ConvertTo-SecureString -AsPlaintext "Income1982" -force) -NewPassword (ConvertTo-SecureString -AsPlainText "P@ssw0rd" -Force)
Применение команды

Преимущества

  • Командлеты PowerShell могут извлечь значительно больше информации, чем net при использовании CMD;
  • Мы можем указать сервер и домен для выполнения перечисления, используя runas с машины, не присоединенной к домену;
  • Мы можем создавать собственные командлеты для перечисления конкретной информации;
  • Мы можем использовать командлеты AD-RSAT для прямого изменения объектов AD (сброс паролей, добавление пользователя в определенную группу).

Недостатки

  • Синие команды часто отслеживают активность PowerShell;
  • Для использования возможностей PowerShell необходимо установить инструментарий AD-RSAT или использовать другие потенциально обнаруживаемые сценарии для перечисления.


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

Вторая часть доступна по ссылке ниже:

До новых встреч!

Кот ищет информацию о других пользователях домена?


Report Page