BloodHound AD
De meeste van “ons” zijn systeembeheerder, begonnen als systeembeheerder of werken dagelijks samen met systeembeheerders. Either way, Active Directory komen we nog steeds erg vaak tegen in ons werkgebied. Active Directory vormt immers de hoeksteen van menig organisatie. Het is daarom ook niet voor niets dat Active Directory een prachtige attack vector is voor hackers. En dit is waar de “Bloodhound” tool kan helpen. Zelf zag ik Bloodhound voor het eerst op BruCON maar de tool bestaat al sinds 2016. Of je nu in het red team of in het blue team zit, Bloodhound helpt je om Active Directory grafisch inzichtelijk te krijgen. Waar liggen de valkuilen zoals gebruikers met onbedoeld teveel rechten of teveel rechten door nested-groups. Ik ben enorm onder de indruk van Bloodhound dus lees met me mee en ga er zeker zelf mee aan de lag!
Bloodhound is een applicatie op basis van Javascript en Neo4j (database) en is ontwikkeld door @ _wald0, @CptJesus en @ harmj0y. Het doel van Bloodhound is om alle onbedoelde relaties binnen een AD database op een grafische manier weer te geven. Met Bloodhound worden snel onderlinge structuren duidelijk en worden ook onbedoelde elevated rights inzichtelijk gemaakt.
De installatie van Bloodhoud is echter (voor mijn gevoel) wat ingewikkelder dan noodzakelijk en dat komt omdat deze werkt met de Neo4j database en Java. Allereerst is het belangrijk dat je met dezelfde versie Java werkt dan je OS. Dus zorg ervoor dat je een x64 Java geïnstalleerd hebt als je een x64 systeem hebt.
Vervolgens ga je de Neo4j software downloaden (https://neo4j.com/download-center/#community) en hierbij kies je voor de community server versie. Na het downloaden pak je de bestanden uit en plaats je deze in de juiste folder. Vervolgens start je de administrative command prompt (Windows voorbeeld) en navigeer je naar de “bin” folder van de map die je net hebt aangemaakt (in mijn voorbeeld: “C:\software\neo4j-community\bin”). Let op. Gebruik een pad zonder spaties (dus geen “program files”). Hier voer je onderstaande commando uit om de neo4j service te installeren:
cd C:\software\neo4j-community\bin
neo4j.bat install-service |
Nu download je de Bloodhound repo en pak je deze uit. Deze repo bevat de volgende folder “BloodHoundExampleDB.graphdb”. Deze folder verplaats je naar de Neo4j database folder “C:\software\neo4j-community\data\databases”.
Nu moeten we de Neo4j configuratie aanpassen. Open de file “C:\software\neo4j-community\conf\neo4j.conf”. Hier gaan we de volgende 2 regels aanpassen:
#dbms.active_database=graph.db = dbms.active_database=BloodHoundExampleDB.graphdb #dbms.allow_upgrade=true = dbms.allow_upgrade=true |
Nu gaan we de Neo4j database starten door het commando:
net start neo4j |
Nu kunnen we controleren of de service draait door de webserver te openen op de volgende URL:
http://localhost:7474 |
l
Log hier in met de default credentials:
Username: neo4j
Password: neo4j
Nu wordt je gevraagd je wachtwoord te veranderen. Ik heb mijn wachtwoord veranderd in “BloodHound”.
Nu gaan we de Bloodhound compiled release downloaden via “https://github.com/BloodHoundAD/BloodHound/releases”. In ons geval kiezen we voor de “BloodHound-win32-x64.zip” release. De ZIP pakken we ook uit in de software folder “C:\software\Bloodhound” en vanuit deze folder starten we de “BloodHound.exe”. Het kan zijn dat het SmartScreen filter dit probeert te voorkomen maar in dat geval kies je voor “Toch uitvoeren”:
Tenslotte moeten we onszelf nog authentiseren tegenover de “bolt://localhost:7687” database met de gebruikersgegevens:
Username: neo4j
Password: BloodHound
Nu Bloodhound gestart is kunnen we beginnen.
Werken met Bloodhound
Nu is het zaak om de juiste data te verzamelen. Meestal zijn voor het verzamelen van de data geen verhoogde rechten nodig en ook is het niet nodig om remote code uit te voeren. Bloodhound moet beschikken over 3 soorten data om goed te kunnen functioneren, namelijk:
- Welke gebruikers zijn waar ingelogd
- Welke gebruikers hebben admin rechten en waar hebben ze toegang toe
- Tot welke groepen behoren gebruikers en andere groepen
Er zijn meerdere methodes waarop data verzameld kan worden. Data wordt verzameld met de SharpHound Ingestor (aanwezig in de Github Master Repo) en kent 3 soorten ingestors. Er bestaat een Powershell Ingestor, Python Ingestor en ook een C# Ingestor. Die laatste gaan we in dit voorbeeld gebruiken voor het verkrijgen van data.
Voor de C# Ingestor kunnen we een Powershell script gebruiken en een executable. Omdat ik een groot fan van Powershell ben gebruik ik uiteraard de Powershell “Invoke-BloodHound” ingestor.
De default “Invoke-Bloodhound” command verzamelt alle informatie over groepslidmaatschappen, alle domain trust informatie en verzamelt alle sessie / lokale admin-gegevens op alle computers die de ingestor het vanuit uw huidige domein kan bereiken. Alle gegevens worden geëxporteerd naar JSON-bestanden (in de huidige map). Deze map kan veranderd worden door het toevoegen van de parameter “* -JSONFolder C: \ Temp *”. Deze parameter veranderd de directory waar de JSON geplaatst worden naar “C:\Temp”.
De flag “-SkipGCDeconfliction” zorgt ervoor dat de informatie van gebruikerssessies wordt afgewogen op basis van bepaalde eigenschappen. Dit wordt gebruikt om conflicten te voorkomen in het geval er user session informatie gevonden wordt zonder duidelijk logon domain of als deze in meerdere domainen voorkomt. Hier wordt o.a. de global catalog informatie voor gebruikt. Er zijn vele “enumeration options” ofwel “flags” zoals:
- CollectionMethod RDP = Remote Desktop Users verzamelen
- CollectionMethod Session = Sessie Informatie verzamelen
- CollectionMethod LoggedOn = Privileged sessie informative verzamelen (admin toegang vereist)
- CollectionMethod ACL = ACL informative verzamelen
- CollectionMethod Default = Zoveel mogelijk informative verzamelen
- LdapFilter = Voor het toepassen van een custom LDAP filter
- OU = Specificeer een specifieke OU om informative over te verzamelen
- LDAPUser = Gebruikersnaam om te gebruiken voor LDAP verbinding
- LDAPPass = Wachtwoord om te gebruiken voor LDAP verbinding
- Threads = Aantal gelijktijdige verzamel threads (standard = 10)
- Verbose = Verbose output
Etc.
Om een default dataverzameling te draaien v.a. een domain computer tegen een AD gebruik je:
PowerShell -Exec Bypass .\SharpHound.ps1 invoke-Bloodhound -CollectionMethod All -Domain jbaselier.local -ZipFileName c:\temp\bloodhound.zip -JsonFolder c:\temp\ |
Uiteraard kun je voor dezelfde taak ook de SharpHound binary gebruiken. Deze zal echter op de meeste systemen worden tegengehouden door de virusscanner en dus is het beter om de binary in het geheugen te laden. Bovenstaande commando met de SharpHound compiled binary ziet er als volgt uit:
Sharphound.exe --ZipFileName c:\temp\bloodhound.zip --JsonFolder c:\temp\ --CollectionMethod All --Domain jbaselier.local |
Mocht je echt de binary willen gebruiken dan zal de debug variant, aanwezig in “BloodHound-master\BloodHound-master\Ingestors\DebugBuilds\SharpHound” minder snel door de virusscanner opgepikt worden.
Nadat de inventory klaar is zie je een aantal statistieken en wordt er een ZIP bestand gemaakt welke weer verschillende JSON files bevat.
Nadat de ZIP file is gemaakt kun je deze importeren in de huidige demo database of een nieuwe database aanmaken. In het geval van de demo database is het raadzaam om de demo data te verwijderen alvorens de nieuwe data te importen:
Vervolgens kun je de nieuwe data importeren door de ZIP file in Bloodhound te slepen of via de “Upload Data” button aan de rechterzijde:
Misschien is het opgevallen dat ik ondertussen mijn layout heb veranderd naar een “dark” layout. Deze kleurweergave vind ik persoonlijk fijner en duidelijker. Dit kun je instellen door “Dark Mode” in te schakelen onder de settings:
Nu de nieuwe data is ingeladen kan het zijn dat deze niet meteen zichtbaar is. Reboot hiervoor de BloodHound services of je computer. Als de services gereboot zijn is de data zichtbaar en kun je gebruik maken van alle pre-built queries om je eerste zwakke punten te vinden binnen het AD netwerk:
De default query’s zijn:
- Find all Domain Admins = Vindt alle domein admins.
- Find Shortest Paths to Domain Admins = Laat de korste route zien om bij de domein admins te komen. Met andere woorden, welke zaken moeten overgenomen worden en in welke volgorde om domein admin te worden.
- Find Principals with DCSync Rights = Vind de gebruikers/nodes die het recht hebben om een DC sync uit te voeren.
- Users with Foreign Domain Group Membership – Laat gebruikers zien met admin rechten in andere domeinen.
- Groups with Foreign Domain Group Membership – Laat groepen zien met admin rechten in andere domeinen.
- Map Domain Trusts – Maakt Domain Trusts inzichtelijk.
- Shortest Paths to Unconstrained Delegation Systems – Maakt inzichtelijk wat de kortste route is naar systemen of services welke “Unconstrained Delegation” rechten hebben en dus iemand kunnen “impersonaten”.
- Shortests Paths from Kerberostable Users – Maakt inzichtelijk wat de korste route voor een specifieke gebruiker is om toegang te krijgen tot systemen of groepen.
- Shortests Paths to Domain Admins from Kerberos Users – Maakt inzichtelijk wat het kortste pad is voor een specifieke domein gebruiker om domain admin rechten te verkrijgen
- Shortests Path from Owned Principals – Laat de systemen zien die momenteel het makkelijkste over te nemen zijn voor systemen die momenteel gemarkeerd zijn als “owned”.
- Shortests Paths to Domain Admins from Owned Principals – Laat de kortste route zien tot de domain admins van systemen die momenteel gemarkeerd zijn als “owned”.
- Shortests Paths to High Value Targets – de korste route zien naar systemen die momenteel gemarkeerd zijn als “High Value”.
Mocht je zin hebben om andere query’s te schrijven dan kan dat. De opmaak is voor de meeste van ons wellicht wat onbekend. Waar SQL de programmeertaal is voor MySQL daar is Cypher de programmeertaal van Neo4j en dus voor de BloodHoud query’s. De Cypher wordt door de Neo4j ontwikkelaars omschreven als “ASCII Art” en waarom wordt duidelijk als je de volgende query ziet:
MATCH (n:User), (m:Group {name: "DOMAIN ADMINS@INTERNAL.LOCAL"}), p=shortestPath((n)-[*1..]->(m)) RETURN p |
Bovenstaande query representeert de belangrijkste default query binnen BloodHound, namelijk het berekenen van het kortste pad naar de Domain Admins.
Laten we bovenstaandede query ontcijferen:
- MATCH – Elke query begint met het specificeren van een partroon. In dit geval is het een match (overeenkomst).
- (n:User) – Dit is de eerste variabele. De variabele “n” geven we een label om deze te verduidelijken, namelijk “User”.
- (m:Group {name: “DOMAIN ADMINS@INTERNAL.LOCAL”}) – De volgende variabele is “m” welke we “Group” noemen. We specificeren ook de groepnaam tussen de brackets. We zijn hier alleen op zoek naar de Admins van het domein “Internal.local”.
- p=shortestPath ((n)-[*1..]->(m))– De “shortestPath” functie vraagt aan de database om het kortste pad te retourneren tussen “n”, de User en “m” de Admins groep. Het pijltje -> geeft de richting aan (met alleen een streepje zou de query 2 richtingen opgaan) en de [*1..] geeft aan dat er geen limiet is in het aantal hops. Wanneer we een maximaal limiet van 5 hops zouden willen dan zou deze er als volgt uitgezien hebben [*1..5].
- RETURN p – Vervolgens vragen we om de variabele “p” te retourneren waardoor we de uitkomst te zien krijgen.
Query’s kunnen zeer complex zijn en zelfs gebouwd worden zodat ze user input accepteren. De opbouw en de structuur van Cypher is even wennen maar niet al te moeilijk als je er even mee aan het stoeien bent.
Mocht je extra informatie willen weten over een specifieke node of user dan laat de “Node Info” tab alle wenselijke informatie zien. Welk OS er op de node draait, of het systeem compromised is, of LAPS enabled is, hoeveel actieve sessies er zijn, hoe het met de local admins staat, welke memberships er zijn etc.
Conclusie
Ik hoop dat jullie net zoveel van dit hondje zijn gaan houden als ik en dat ik jullie een tool heb laten zien die op een waardevolle manier ingezet kan worden binnen je eigen organisatie. Bloodhound gaat ontzettend diep en laat je verborgen gangen vinden in je domein en AD omgeving die je met het blote ooit nooit gevonden had. Dit hondje heeft een hele waardevolle speurneus!
Vond je deze post interessant laat het me dan zeker even weten middels een berichtje, like of beter nog … share the knowledge en deel mijn posts verder op je sociale kanalen of op je website. Thanks!