Eine Einführung in PowerView/SharpView

Inhalt

PowerView/SharpView Übersicht
AD Benutzer enumerieren
AD Gruppen enumerieren
AD Computer enumerieren
Domain ACL enumerieren
Gruppenrichtlinien (GPOs) enumerieren
AD Trusts enumerieren

SharpView ist eine .NET-Portierung von PowerView, einem der vielen Tools, die im inzwischen veralteten PowerSploit-Offensive PowerShell-Toolkit enthalten sind. Auf dieser Read the Docs Seite wird das Funktionsbenennungsschema erläutert und es werden Informationen zu den verschiedenen Parametern bereitgestellt, die an jede Funktion übergeben werden können.

Beide Tools können Analyzen durchführen um die Situation zu verstehen und Angriffe innerhalb einer Windows-Domäne durchführen. PowerView nutzt PowerShell AD Hooks und Win32 API-Funktionen und ersetzt neben anderen Funktionen eine Vielzahl von net Befehlen, die von den integrierten Windows-Tools aufgerufen werden. SharpView ist ein .NET-Port, der alle PowerView-Funktionen und Argumente in einer .NET-Assembly bereitstellt. Ein wesentlicher Unterschied zwischen PowerView und SharpView ist die Möglichkeit, Befehle zu pipen. SharpView verwendet Strings anstelle von PowerShell-Objekten. Daher können wir keine Eigenschaften mit Select oder Select-Object angeben, um die Ausgabe zu analysieren oder bestimmte AD-Objekte so einfach auszuwählen.

Wir können PowerView wie folgt importieren:
powershell -ep bypass
Import-Module .\PowerView.ps1

Funktionen
Verschiedenen Funktionen bieten verschiedene nützliche Tools wie die Konvertierung von UAC-Werten, SID-Konvertierung, Benutzer-Impersonation, Kerberoasting und mehr. Zum Beispiel können wir SharpView oder PowerView dazu verwenden einen Benutzernamen in die entsprechenende SID umzuwandeln.

.\SharpView.exe ConvertTo-SID -Name Arno

Ebenso umgekehrt:

Convert-ADName -ObjectName S-1-5-21-1565417619-818568948-4152024298-1152

Wenn wir UAC-Werte mit dem Wert useraccountcontrol aufzählen, werden die Werte als numerische Werte angezeigt, nicht in einem für Menschen lesbaren Format. Wir können die Funktion ConvertFrom-UACValue verwenden. Wenn wir die Eigenschaft -showall hinzufügen, werden alle allgemeinen UAC-Werte angezeigt, und die für den Benutzer festgelegten Werte werden mit einem + markiert.

Get-DomainUser Arno | ConvertFrom-UACValue -showall

PowerView bietet LDAP-Funktionen mit nützlichen Befehlen. Die Funktion Get-Domain liefert uns Informationen über die Domäne, z. B. den Namen, alle Child Domänen, eine Liste der Domänencontroller, die Rollen der Domänencontroller und mehr.

Get-Domain

Mit der Funktion Get-DomainOU können wir beginnen, uns einen Überblick über die Domäne zu verschaffen, und die Namen aller Organisationseinheiten (OUs) zurückgeben, was uns helfen kann, die Domänenstruktur abzubilden.

Get-DomainOU | findstr /b „name

Wir können Informationen über Domänenbenutzer mit der Funktion Get-DomainUser sammeln und Eigenschaften wie PreauthNotRequired angeben, um Angriffe zu planen.

Get-DomainUser -KerberosPreauthNotRequired | findstr „name“

Wir können auch damit beginnen, Informationen über einzelne Hosts mit der Funktion Get-DomainComputer zu sammeln.

Get-DomainComputer | select dnshostname, useraccountcontrol

Wenn wir uns den GPO-Funktionen zuwenden, können wir Get-DomainGPO verwenden, um die Namen aller Gruppenrichtlinien-Objekte (GPOs) zu ermitteln.

Get-DomainGPO | findstr displayname

Wir können auch feststellen, welche GPOs auf welche Hosts zurückgeführt werden können.

Get-DomainGPO -ComputerIdentity WS01 | select displayname

Die Funktionen zur Aufzählung von Computern können Informationen über Benutzersitzungen sammeln, den lokalen Administratorzugriff testen, nach Dateifreigaben und interessanten Dateien suchen und vieles mehr. Mit der Funktion Test-AdminAccess kann geprüft werden, ob der aktuelle Benutzer lokale Administratorrechte auf einem anderen Host hat.

Test-AdminAccess -ComputerName SQL

Mit der Funktion Net-Share können wir die offenen Freigaben auf einem entfernten Computer aufzählen. Freigaben können sensible Informationen enthalten, und die Bedeutung der Analyze von Dateifreigaben sollte nicht übersehen werden.

Get-NetShare -ComputerName DC01

Die „Meta“-Funktionen können verwendet werden, um herauszufinden, wo Domänenbenutzer angemeldet sind, um nach bestimmten Prozessen auf entfernten Hosts zu suchen, um Domänenfreigaben zu finden, um Dateien auf Domänenfreigaben zu finden und um zu testen, wo unser aktueller Benutzer lokale Administratorrechte hat. Mit der Funktion Find-DomainUserLocation können wir Domänenrechner finden, bei denen Benutzer angemeldet sind.

PS C:\> Find-DomainUserLocation

UserDomain : MIRACLE
UserName : Administrator
ComputerName : DC01.MIRACLE.LOCAL
IPAddress : 192.168.10.101
SessionFrom :
SessionFromName :
LocalAdmin :

UserDomain : MIRACLE
UserName : sqladmin
ComputerName : SQL.MIRACLE.LOCAL
IPAddress : 192.168.10.30
SessionFrom :
SessionFromName :
LocalAdmin :

Die Domain Trust Funktion ermöglicht es informationen zu sammeln, die für Cross-Trust-Angriffe verwendet werden können. Der einfachste dieser Befehle, Get-DomainTrust, gibt alle Domain-Trusts für unsere aktuelle Domain zurück.

AD Benutzer enumerieren

Wichtige AD-Benutzerdaten
Wir können PowerView und SharpView verwenden, um eine Fülle von Informationen über AD-Benutzer aufzuzählen. Wir können damit beginnen, die Anzahl der Benutzer in der Zieldomäne zu ermitteln. Wir wechseln in diesem Kurs häufig zwischen den beiden Tools hin und her, weil es wichtig ist, beide zu kennen. Manchmal werden Sie nicht in der Lage sein, Powershell-Befehle auszuführen, und zu anderen Zeiten können Sie möglicherweise keine ausführbaren Dateien ausführen. Jedes Mal, wenn Sie die Verwendung von SharpView sehen, sollte es möglich sein, dies in PowerView zu tun, indem Sie einfach SharpView.exe entfernen. SharpView verfügt nicht über die neuesten PowerSploit-Funktionen, so dass es möglicherweise nicht möglich ist, PowerView-Befehle in SharpView auszuführen.

PS C:\> (Get-DomainUser).count

108

Als nächstes wollen wir uns die Funktion Get-DomainUser ansehen. Wenn wir das Flag -Help an eine beliebige SharpView-Funktion übergeben, können wir alle Parameter sehen, die die Funktion akzeptiert.

.\SharpView.exe Get-DomainUser -Help

Get_DomainUser -Identity <String[]> -DistinguishedName <String[]> -SamAccountName <String[]> -Name <String[]> -MemberDistinguishedName <String[]> -MemberName <String[]> -SPN <Boolean> -AdminCount <Boolean> -AllowDelegation <Boolean> -DisalowDelegation <Boolean> -TrustedToAuth <Boolean> -PreauthNotRequired <Boolean> -KerberosPreauthNotRequired <Boolean> -Noreauth <Boolean> -Domain <String> -LDAPFilter <String> -Filter <String> -Properties <String[]> -SearchBase <String> -ADPath <String> -Server <String> -DomainController <String> -SearchScope <SearchScope> -ResultPageSize <Int32> -ServerTimLimit <Nullable`1> -SecurityMasks <Nullable`1> -Tombstone <Boolean> -FindOne <Boolean> -ReturnOne <Boolean> -Credential <NetworkCredential> -Raw <Boolean> -UACFilter <UACEnum>

Im Folgenden finden Sie einige der wichtigsten Eigenschaften, die Sie über Domänenbenutzer erfassen können. Werfen wir einen Blick auf den Benutzer „jonas.borgartz“.

PS C:\> Get-DomainUser -Identity jonas.borgartz -Domain miracle.local | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accountexpires,admincount,userprincipalname,serviceprincipalname,mail,useraccountcontrol


name : Jonas Borgartz
samaccountname : jonas.borgartz
description :
memberof : {CN=Hacking Team,CN=Users,DC=MIRACLE,DC=LOCAL, CN=Security,OU=Microsoft Exchange
Security Groups,DC=MIRACLE,DC=LOCAL, CN=Security
Operations,CN=Users,DC=MIRACLE,DC=LOCAL, CN=LAPS
Admins,CN=Users,DC=MIRACLE,DC=LOCAL…}
whencreated : 11/27/2024 10:41:41 PM
pwdlastset : 11/30/2024 3:55:04 PM
lastlogontimestamp : 8/9/2020 10:31:30 PM
accountexpires : 10/31/1500 9:00:00 PM
admincount : 1
userprincipalname : jonas.borgartz@miracle
serviceprincipalname :
mail :
useraccountcontrol : PASSWD_NOTREQD, NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD

Es ist sinnvoll, diese Eigenschaften für ALLE Domänenbenutzer aufzuzählen und sie zur Offline-Verarbeitung in eine CSV-Datei zu exportieren.

PS C:\> Get-DomainUser * -Domain miracle.local | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accountexpires,admincount,userprincipalname,serviceprincipalname,mail,useraccountcontrol | Export-Csv .\miracle_users.csv -NoTypeInformation

Sobald wir Informationen über alle Benutzer gesammelt haben, können wir damit beginnen, eine spezifischere Benutzeraufzählung durchzuführen, indem wir eine Liste von Benutzern erhalten, die keine Kerberos-Vorauthentifizierung benötigen und einem ASREPRoast-Angriff unterzogen werden können.

.\SharpView.exe Get-DomainUser -KerberosPreauthNotRequired -Properties samaccountname,useraccountcontrol,memberof

Wir können auch Informationen über Benutzer mit eingeschränkter Kerberos-Delegation sammeln.

.\SharpView.exe Get-DomainUser -TrustedToAuth -Properties samaccountname,useraccountcontrol,memberof

Wenn wir schon dabei sind, können wir auch nach Benutzern suchen, die eine uneingeschränkte Delegation erlauben.

.\SharpView.exe Get-DomainUser -LDAPFilter „(userAccountControl:1.2.840.113556.1.4.803:=524288)“

Wir können auch nach Domänenbenutzern mit sensiblen Daten wie einem im Beschreibungsfeld gespeicherten Kennwort suchen.

Get-DomainUser -Properties samaccountname,description | Where {$_.description -ne $null}

Als Nächstes wollen wir alle Benutzer mit Service Principal Names (SPNs) aufzählen, die einem Kerberoasting-Angriff ausgesetzt sein könnten.

.\SharpView.exe Get-DomainUser -SPN -Properties samaccountname,memberof,serviceprincipalname

Schließlich können wir alle Benutzer aus anderen Domänen mit Gruppenzugehörigkeit in allen Gruppen unserer aktuellen Domäne auflisten.

Find-ForeignGroup

Ein weiterer nützlicher Befehl ist die Suche nach Benutzern mit Service Principal Names (SPNs) in anderen Domänen, bei denen wir uns über eingehende oder bidirektionale Vertrauensbeziehungen authentifizieren können, wobei die Forest-weite Authentifizierung allen Benutzern die Authentifizierung über eine Vertrauensstellung ermöglicht, oder die selektive Authentifizierung, die bestimmten Benutzern die Authentifizierung erlaubt.

Get-DomainUser -SPN -Domain miracle.local | select samaccountname,memberof,serviceprincipalname | fl

Passwörter
Die Analyse wann ein Passwort gesetzt wurde ist bei der Durchführung von Passwort-Spray von großer Bedeutung. Es ist viel wahrscheinlicher, dass Unternehmen ein automatisiertes Passwort-Spray über viele Konten hinweg entdecken, als wenn es nur gegen eine kleine Gruppe durchgeführt wird.

Wenn Sie sehen, dass mehrere Passwörter gleichzeitig festgelegt wurden, bedeutet dies, dass sie vom Helpdesk festgelegt wurden und möglicherweise identisch sind. Wenn Sie außerdem sehen, dass das Kennwort im Juli 2019 festgelegt wurde, können Sie „2020“ normalerweise ausschließen und sollten wahrscheinlich keine sinnlosen Varianten wie „Winter2019“ versuchen. Wenn Sie ein altes Kennwort sehen, das vor 2 Jahren festgelegt wurde, ist es wahrscheinlich, dass dieses Kennwort schwach ist und zu den ersten Konten gehört. In den meisten Unternehmen haben die Administratoren mehrere Konten. Wenn Sie sehen, dass der Administrator sein „Benutzerkonto“ etwa zur gleichen Zeit wie sein „Administratorkonto“ ändert, ist es sehr wahrscheinlich, dass er für beide Konten dasselbe Passwort verwendet.

Mit dem folgenden Befehl können Sie sich alle Passwortzeiten anzeigen lassen:

Get-DomainUser -Properties samaccountname,pwdlastset,lastlogon -Domain miracle.local | select samaccountname, pwdlastset, lastlogon | Sort-Object -Property pwdlastset

Wenn wir nur Kennwörter anzeigen möchten, die vor einem bestimmten Datum festgelegt wurden:

Get-DomainUser -Properties samaccountname,pwdlastset,lastlogon -Domain miracle.local | select samaccountname, pwdlastset, lastlogon | where { $_.pwdlastset -lt (Get-Date).addDays(-90) }

AD Gruppen enumerieren

Domänengruppen

PS C:\> Get-DomainGroup -Properties Name

name
—-
Benutzer
Gäste
Druck-Operatoren
Sicherungs-Operatoren
Replikations-Operator
Remotedesktopbenutzer
Netzwerkkonfigurations-Operatoren
Leistungsüberwachungsbenutzer
Leistungsprotokollbenutzer
Distributed COM-Benutzer

Exchange Servers
Exchange Trusted Subsystem
Managed Availability Servers
Exchange Windows Permissions
ExchangeLegacyInterop
Exchange Install Domain Servers

Das Vorhandensein einiger Gruppen zeigt uns, dass Microsoft Exchange in der Umgebung vorhanden ist. Eine Exchange-Installation fügt dem AD mehrere Gruppen hinzu, von denen einige wie Exchange Trusted Subsystem und Exchange Windows Permissions aufgrund der Berechtigungen, die die Mitgliedschaft in diesen Gruppen einem Benutzer oder Computer gewährt, als hochwertige Ziele gelten.

Mit -Identity können wir eine bestimmte Gruppe genauer untersuchen.

PS C:\> Get-DomainGroupMember -Identity ‚Administratoren‘

Wenn von einer Gruppe das Attribut AdminCount auf 1 gesetzt ist, bedeutet es, dass es sich um eine geschützte Gruppe handelt.

PS C:\> Get-DomainGroupMember -AdminCount

Eine weitere wichtige Prüfung ist die Suche nach verwalteten Sicherheitsgruppen. Diese Gruppen haben das Recht, Mitglieder zu AD-Sicherheitsgruppen und Verteilergruppen hinzuzufügen, und werden durch Änderung des Attributs managedBy festgelegt. Mit dieser Prüfung wird festgestellt, ob eine Gruppe einen Manager hat und ob der Benutzer Benutzer zu der Gruppe hinzufügen kann. Dies kann für lateral movement nützlich sein, indem wir Zugang zu zusätzlichen Ressourcen erhalten.

PS C:\> Find-ManagedSecurityGroups | select GroupName

Get-DomainManagedSecurityGroup gibt alle Sicherheitsgruppen in der aktuellen (oder Ziel-)Domäne zurück, für die ein Manager festgelegt wurde. Wir können sehen, dass der Benutzer jonas.borgartz als Gruppenmanager der Gruppe Developer festgelegt ist.

PS C:\Users\Administrator\Desktop\PowerSploit-master\Recon> Get-DomainManagedSecurityGroup

PS C:\> Get-DomainManagedSecurityGroup

GroupName : Developer
GroupDistinguishedName : CN=Developer Operations,CN=Users,DC=MIRACLE,DC=LOCAL
ManagerName : jonas.borgartz
ManagerDistinguishedName : CN=Jonas Borgartz,OU=Developer,OU=IT,OU=Employees,DC=MIRACLE,DC=LOCAL
ManagerType : User
ManagerCanWrite : UNKNOWN

Bei der Untersuchung der ACLs dieser Gruppe sehen wir, dass dieser Benutzer über GenericWrite-Rechte verfügt, was bedeutet, dass er die Gruppenmitgliedschaft ändern kann (Benutzer hinzufügen oder entfernen). Wenn wir die Kontrolle über dieses Benutzerkonto erlangen, können wir dieses Konto oder jedes andere Konto, das wir kontrollieren, der Gruppe hinzufügen und alle Berechtigungen erben, die es in der Domäne hat.

Lokale Gruppen
Es ist auch wichtig, die Mitgliedschaft in lokalen Gruppen zu überprüfen. Ist unser aktueller Benutzer lokaler Administrator oder Teil einer lokalen Gruppe auf einem der Hosts? Mit Get-NetLocalGroup können wir eine Liste der lokalen Gruppen auf einem Host abrufen.

PS C:\> Get-NetLocalGroup -ComputerName WS01 | select GroupName

Mit der Funktion Get-NetLocalGroupMember können wir auch die lokalen Gruppenmitglieder auf einem beliebigen Host aufzählen.

Get-NetLocalGroupMember -ComputerName WS01

Mit folgendem Skript können wir alle Hosts überprüfen, auf die der Benutzer jonas.borgartz lokalen Admin-Zugriff hat

PS C:\>$sid = Convert-NameToSid harry.jones
PS C:\>$computers = Get-DomainComputer -Properties dnshostname | select -ExpandProperty dnshostname
PS C:\> foreach ($line in $computers) {Get-NetLocalGroupMember -ComputerName $line | ? {$_.SID -eq $sid}}

Datum des Hinzufügens von Benutzern zur Gruppe
PowerView kann das Datum, an dem ein Benutzer zu einer Gruppe hinzugefügt wurde, nicht abrufen, es ist jedoch für Verteidiger nützlich zu wissen. Wenn wir einen seltsamen Benutzer als Teil einer Gruppe bemerken, können wir nach der Ereignis-ID 4728/4738 an diesem Datum suchen, um herauszufinden, wer den Benutzer hinzugefügt hat, oder nach der Ereignis-ID 4624 seit dem Datum des Hinzufügens, um zu sehen, ob sich der Benutzer angemeldet hat

Das Skript, das wir in der Regel zum Abrufen dieser Informationen verwenden, heißt Get-ADGroupMemberDate und kann hier heruntergeladen werden. Laden Sie dieses Modul auf die gleiche Weise wie PowerView und führen Sie Get-ADGroupMemberDate -Group „IT Developer“ -DomainController DC01.MIRACLE.LOCAL aus; wenn Wir einen bestimmten Benutzer abrufen möchten, empfehlen ich Get-ADGroupMemberDate -Group „IT Develper“ -DomainController DC01.MIRACLE.LOCAL | ? { ($_.Username -match ‚jonas.borgartz‘) -And ($_.State -NotMatch ‚ABSENT

AD Computer enumerieren

Mit der Funktion Get-DomainComputer können wir viele Details über Domänencomputer aufzählen.

PS C:\> Get-DomainComputer -Help

Get_DomainComputer -Identity <String[]> -SamAccountName <String[]> -Unconstrained <Boolean> -TrustedToAuth <Boolean> -Printers <Boolean> -SPN <String> -ServicePrincipalName <String> -OperatingSystem <String> -ServicePack <String> -SiteName <String> -Ping <Boolean> -Domain <String> -LDAPFilter <String> -Filter <String> -Properties <String[]> -SearchBase <String> -ADSPath <String> -Server <String> -DomainController <String> -SearchScope <SearchScope> -ResultPageSize <Int32> -ServerTimeLimit <Nullable`1> -SecurityMasks <Nullable`1> -Tombstone <Boolean> -FindOne <Boolean> -ReturnOne <Boolean> -Credential <NetworkCredential> -Raw <Boolean> -UACFilter <UACEnum>

Einige der nützlichsten Informationen, die wir überprüfen können, sind der Hostname, das Betriebssystem und die Attribute der User Account Control (UAC).

PS C:\> Get-DomainComputer -Properties dnshostname,operatingsystem,lastlogontimestamp,useraccountcontrol

Verwundbare Maschinen finden

Die folgenden Flaggen können kombiniert werden, um Angriffe zu erkennen:

LastLogonTimeStamp: Dieses Feld dient dazu um veraltete Rechner zu finden. Wenn dieses Feld für einen Computer 90 Tage alt ist, wurde er nicht eingeschaltet und es fehlen sowohl Betriebssystem- als auch Anwendungspatches. Aus diesem Grund sollten Administratoren Maschinen automatisch deaktivieren, wenn dieses Feld 90 Tage alt ist.
OperatingSystem: Hier wird das Betriebssystem aufgeführt. Der offensichtliche Angriffspfad besteht darin, ein Windows 7-System zu finden, das noch aktiv ist (LastLogonTimeStamp), und Angriffe wie Eternal Blue zu probieren. Es ist auch wichtig, die Unterschiede zwischen den verschiedenen Windows-Versionen zu kennen. Windows 11 ist zum Beispiel die einzige Version, bei der Credential Guard standardmäßig aktiviert ist.
WhenCreated: Dieses Feld wird erstellt, wenn ein Computer dem Active Directory beitritt. Je älter der Rechner ist, desto wahrscheinlicher ist es, dass er vom „Standard Build“ abweicht. Ältere Workstations können schwächere Passwörter für die lokale Verwaltung, mehr lokale Administratoren, anfällige Software, mehr Daten usw. aufweisen.

Computer Angriffe
Wir können sehen, ob irgendwelche Computer in der Domäne für unconstrained delegation konfiguriert sind.

Get-DomainComputer -Unconstrained -Properties dnshotname,useraccountcontrol

Und wir können schauen ob es Hosts gibt, die für eine eingeschränkte Delegation eingerichtet sind.

Domain ACL enumerieren

Die Einstellungen der Zugriffskontrollliste (Access Control List (ACL)) selbst werden als Zugriffskontrolleinträge (Access Control Entries (ACEs)) bezeichnet. Jeder ACE bezieht sich auf einen Benutzer, eine Gruppe oder einen Prozess (Sicherheitsprinzipal) und definiert die Rechte des Prinzipals. Es gibt zwei Arten von ACLs.

Discretionary Access Control List – Damit wird festgelegt, welchen Sicherheitsprinzipalen der Zugriff auf ein Objekt gewährt oder verweigert wird.

System Access Control Lists (SACL) – Diese ermöglichen es den Administratoren, Zugriffsversuche auf gesicherte Objekte zu protokollieren.

ACL-(Fehl)-Konfigurationen können eine verkettete Objekt-zu-Objekt-Kontrolle ermöglichen. Wir können uns die unkontrollierte Mitgliedschaft von Zielgruppen, so genannten derivativen Admins, vorstellen, die durch Ausnutzung einer AD-Angriffskette Admin-Rechte erhalten können.

AD-Angriffsketten können die folgenden Komponenten enthalten:

-„Unprivilegierte“ Benutzer (shadow admins), die administrativen Zugriff auf Mitgliedsserver oder Arbeitsstationen haben.
– Privilegierte Benutzer, die eine logon session auf diesen Workstations und Mitgliedsservern haben.
– Andere Formen der Objekt-zu-Objekt-Kontrolle umfassen die Erzwingung einer Kennwortänderung, das Hinzufügen eines Gruppenmitglieds, die Änderung des Besitzers, oder das Schreiben von ACE,

Gruppenrichtlinien (GPOs) enumerieren

Ein Gruppenrichtlinienobjekt ( Group Policy Object (GPO)) ist eine Sammlung von Richtlinien. Zu den GPOs gehören Richtlinien wie die Zeitüberschreitung für die Bildschirmsperre, das Deaktivieren von USB-Anschlüssen, die Richtlinie für Domänenkennwörter, das Verteilen von Software, die Verwaltung von Anwendungen und vieles mehr. GPOs können auf einzelne Benutzer und Hosts oder Gruppen angewendet werden, indem sie direkt auf eine Organisationseinheit (OU) angewendet werden. Die Erlangung von Rechten über ein GPO kann zu lateralen vertikalen Bewegungen bis hin zur vollständigen Kompromittierung der Domäne führen und kann auch als Persistenzmechanismus verwendet werden. Wie ACLs werden auch GPOs oft übersehen, und ein falsch konfiguriertes GPO kann katastrophale Folgen haben.

Wir können Powerview/Sharpview, BloodHound und Group3r verwenden, um die Fehlkonfigurationen der Gruppenrichtlinien aufzulisten.

GPO Verwundbarkeiten
GPOs können für Angriffe missbraucht werden, z. B. für das Hinzufügen zusätzlicher Rechte für einen Benutzer, das Hinzufügen eines lokalen Administrators oder das Erstellen einer sofortigen geplanten Aufgabe. Es gibt mehrere Möglichkeiten, sich über GPOs Persistenz zu verschaffen

– Konfigurieren einer GPO, um einen der oben genannten Angriffe auszuführen.
– Erstellen einer geplanten Aufgabe zum Ändern der Gruppenmitgliedschaft, Hinzufügen eines Kontos, Ausführen von DCSync oder Zurücksenden einer Reverse-Shell-Verbindung.
– Installation von Malware in der Domäne.

SharpGPOAbuse ist ein hervorragendes Tool, mit dem sich GPO-Fehlkonfigurationen ausnutzen lassen.

GPO Daten Sammeln

Get-DomainGPO | select displayname

Wir können auch prüfen, welche GPOs für einen bestimmten Computer gelten.

Get-DomainGPO -ComputerName WS01 | select displayname

Die Analyse der GPO-Namen kann uns eine Vorstellung von einigen der Sicherheitskonfigurationen in der Zieldomäne vermitteln, z. B. LAPS, AppLocker, PowerShell Logging, cmd.exe deaktiviert für Arbeitsstationen usw. Wir können nach Hosts/Benutzern suchen, auf die diese GPOs nicht angewendet werden, und unsere Angriffspfade zur Umgehung dieser Kontrollen planen.

Wenn uns keine Tools zur Verfügung stehen, können wir gpresult verwenden, ein integriertes Tool, das die auf einen bestimmten Benutzer oder Computer angewendeten GPOs und ihre Einstellungen ermittelt. Wir können bestimmte Befehle verwenden, um die auf einen bestimmten Benutzer bzw. Computer angewendeten GPOs zu sehen, wie z. B.:

C:\> gpresult /r /user:jonas.borgartz
C:\> gpresult /r /S WS01

GPO Berechtigungen
Nach der Überprüfung aller in der Domäne angewendeten GPOs ist es immer gut, die GPO-Berechtigungen zu überprüfen. Wir können Get-DomainGPO und Get-ObjectAcl unter Verwendung der SID für die Gruppe Domain Users verwenden, um zu sehen, ob dieser Gruppe irgendwelche Berechtigungen für GPOs zugewiesen sind.

Get-DomainGPO | Get-ObjectAcl | ? {$_.SecurityIdentifier -eq ‚S-1-5-21-1565417619-818568948-4152024298-513′}3‘}

Versteckte GPO-Code-Ausführungspfade
Gruppenrichtlinien sind die grundlegendste Methode, mit der Systemadministratoren mehreren Computern den gleichen Befehl erteilen können, eine Aufgabe auszuführen. Es gibt einige Beispiele wie Administratoren „Code Execution via GP“ legitimieren.

– Registry Autoruns hinzufügen
– Software-Installation
– Skripte im Startup/Shutdown für eine Maschine oder Benutzer
– Verknüpfungen auf Desktops erstellen, die auf Dateien verweisen
– Geplante Aufgaben

Wenn einer dieser Pfade auf eine Datei auf einem Share verweist, sollten wir die Berechtigungen untersuchen, um zu prüfen, ob Nicht-Administratoren die Datei bearbeiten können. Unsere Tools werden diese von Verwundbarkeit oft übersehen, da diese nur prüfen, ob die Gruppenrichtlinie selbst beschreibbar sind, nicht aber, ob die ausführbaren Dateien/Skripte, auf die die Gruppenrichtlinie verweist, beschreibbar sind.

AD Trusts enumerieren

Eine Vertrauensstellung wird verwendet, um eine Forest-Forest- oder Domänen-Domänen-Authentifizierung einzurichten, die es Benutzern ermöglicht, auf Ressourcen in einer anderen Domäne außerhalb der Domäne, in der sich ihr Konto befindet, zuzugreifen (oder sie zu verwalten).

Ein Trust schafft eine Verbindung zwischen den Authentifizierungssystemen zweier Domänen.

Trusts können transitiv oder nicht-transitiv sein:

– Ein transitives Vertrauen bedeutet, dass sich das Vertrauen auf Objekte erstreckt, denen die untergeordnete Domäne vertraut.
– Bei einer nicht-transitiven Vertrauensstellung wird nur der untergeordneten Domäne selbst vertraut.

Trusts können einseitig oder zweiseitig (bidirektional) eingerichtet werden.

– Bei bidirektionalen Trusts können Benutzer aus beiden vertrauenswürdigen Domänen auf Ressourcen zugreifen.
– Bei einem einseitigen Vertrauen können nur Benutzer in einer vertrauenswürdigen Domäne auf Ressourcen in einer vertrauenswürdigen Domäne zugreifen, nicht umgekehrt. Die Richtung des Vertrauens ist der Richtung des Zugriffs entgegengesetzt.

Es gibt verschiedene Arten von Trusts.

Trust TypeBeschreibung
Parent-childDomänen innerhalb der gleichen Gesamtstruktur. Die untergeordnete Domäne hat ein zweiseitiges transitives Vertrauen mit der übergeordneten Domäne.
Cross-linkEine Vertrauensstellung zwischen untergeordneten Domänen zur Beschleunigung der Authentifizierung
ExternalEine nichttransitive Vertrauensstellung zwischen zwei separaten Domänen in separaten Forests, die nicht bereits durch eine Vertrauensstellung in einem Forest verbunden sind. Bei dieser Art von Vertrauen wird die SID-Filterung verwendet.
Tree-rootEin wechselseitiges transitives Vertrauen zwischen einer forest root domäne und einer neuen tree root domäne. Sie werden standardmäßig erstellt, wenn Sie eine neue tree root domäne innerhalb einem tree einrichten.
ForestEin transitives Vertrauen zwischen zwei Forest Root Domains.

Analyse von Trust-Beziehungen
Mit der Funktion Get-DomainTrust können wir schnell überprüfen, welche Trusts es gibt, welchen Typ und welche Richtung sie haben.

PS C:\> Get-DomainTrust

Wir können die Funktion Get-DomainTrustMapping verwenden, um alle Trusts für unsere aktuelle Domäne und andere erreichbare Domänen aufzulisten.

PS C:\> Get-DomainTrustMapping