Piratenleitfaden für DACL-basierte Erkennung (Teil 3)

Diese Blogserie wurde von der Sicherheitsberaterin Megan Nilsen und dem TAC-Praxismanager Andrew Schwartz verfasst.

1 Einführung

In diesem dritten und letzten Teil setzen wir unsere Untersuchung von objekt- und attributbasierten Angriffen und deren Erkennung fort. So wie sich der erste Teil auf die Untersuchung der Flussdiagramme konzentrierte, die im Dokument DACL der Hacker Recipes, und Teil 2 konzentrierte sich auf die veränderbaren Attribute mithilfe von PowerMadTeil 3 wird sich auf eine Sammlung zusätzlicher Attribute konzentrieren, die nicht in die Teile 1 und 2 fallen, die wir aber als interessant für die Konstruktion von Detektionen identifiziert haben.

Obwohl in diesem Beitrag verschiedene "Angriffs"-Tools verwendet werden, ist zu beachten, dass das Tool ein Mittel zur Durchführung des Angriffs ist, wir uns aber mehr auf die zugrunde liegenden Techniken für veränderbare Attribute und die Erkennung rund um diese konzentrieren.

Genau wie die ersten zwei (2) Nachrichten, hier einige Erinnerungen:

  • Wir gehen davon aus, dass der Gegner bereits einen Fuß in der Tür hat und sich den nötigen Zugang verschafft hat, um Änderungen an den Gegenständen vorzunehmen, die wir besprechen werden.
  • Die Nachnutzung ist keine Priorität.
  • Die auf die Zuweisung des Gegners angewandte Aufklärung wurde nicht kartografiert.
  • Es wurde eine Teilmenge der Windows-Ereignisprotokollierung verwendet und nicht alle möglichen Telemetriedatenpunkte in diesem Datensatz wurden analysiert.

2 Einrichten der Aufnahme

Wie in Teil 1 beschrieben, werden wir uns für Telemetriezwecke auf die Erstellung einer Systemzugriffskontrollliste (SACL) "Audit" für jedes dieser Attribute und die folgenden Windows-Ereignis-IDs stützen:

Die Einrichtung einer SACL ist ein zusätzlicher Schritt, der auch dann durchgeführt werden muss, wenn die oben aufgeführten Windows-Ereignisse gerade erfasst werden.

Bitte lesen Sie in Teil 1A, wie Sie die SACL-Protokollierungskonfiguration aktivieren und konfigurieren und wie Sie die oben genannten Windows-Ereignis-IDs aktivieren oder inhalieren können.

3 Format des Blogs

Aufgrund der Länge dieses Beitrags und der Anzahl der behandelten Attribute ist es wichtig, dass Sie sich im Verlauf dieses Beitrags an einige wichtige Formatierungsregeln aus Teil 1 erinnern.

  • Jeder Abschnitt wird die folgenden Titel enthalten:
  • Attributname (gemeinsamer Name (CN) des Attributs)
  • Hintergrund
    • Diese Seite bietet einen kurzen Überblick darüber, was das Attribut (LDAP-Display-Name) ist, sowie relevante Links zur Microsoft-Dokumentation.
  • Attribut ändern (Angriff)
    • Deckt die Art und Weise ab, wie der "Angriff" durchgeführt wurde, einschließlich der relevanten Konfiguration zur Änderung des betreffenden Attributs, Screenshots/Befehle und der verwendeten Werkzeuge.
    • Wenn für die Einrichtung der Erkennung eine zusätzliche Prüfung aktiviert wurde, wird diese wahrscheinlich auch hier behandelt - oder, wenn die zusätzliche Konfiguration komplexer war, wird sie auf ein vorheriges oder nächstes Thema verteilt.
  • Aufbau von Erfassungen
    • wird eine Vielzahl von Erkennungen abdecken, die eine Reihe von Komplexitätsstufen einschließen
    • Wie in der Einleitung erwähnt, wurden nicht alle möglichen Telemetrie-Datenpunkte in diesem Datensatz analysiert. Wir haben jedoch unser Bestes getan, um die am leichtesten zugänglichen und für die Entwicklung von Detektionen wichtigsten Ereignis-IDs abzudecken.
    • Bei Bedarf werden wir einen logischen Fluss für Erkennungen bereitstellen, die eine höhere Komplexität oder zusätzliche Informationen zur Interpretation dessen, was angezeigt wird, beinhalten. Die meisten Erkennungen werden jedoch einem ähnlichen Format folgen und nicht weiter erläutert werden.

4 Attribute

4.1 AdminSDHolder

4.1.1 Hintergrund

Die AdminSDHolder Das Objekt AdminSDHolder fungiert als Container, der mit Standardberechtigungen gefüllt wird. Dieser Container wird dann als Vorlage für die geschützten Konten verwendet, um unbeabsichtigte/nicht autorisierte Änderungen oder Modifikationen zu verhindern. Geschützte Benutzer können durch die Domänenrichtlinie festgelegt werden, umfassen aber auch normalerweise standardmäßig Benutzer, die zu Gruppen gehören, wie z. B. Domänen-Administratoren, Administratoren, Unternehmens-Administratoren und Schema-Administratoren.

Angreifer, die ausreichende Privilegien erlangt haben, können diesen Container verwenden, um die Persistenz der Zugriffskontrolllisten (ACLs) zum Datenspeicher aufrechtzuerhalten. AdminSDHolder werden standardmäßig alle 60 Minuten neu angewendet.

4.1.2 Gegenstand verändern (Angriff)

Add-DomainObjectAcl -TargetIdentity 'CN=AdminSDHolder,CN=System,DC=BREAKFASTLAND,DC=local' -PrincipalIdentity dacled.egg -Rights All -verbose 

Zahl 1 - Objekt bearbeiten

4.1.3 Aufbau der Erkennung

4.1.3.1 Erkennung mit den Ereignis-IDs 5136 und 4662
index=main ((EventCode=5136 Class=container DN="CN=AdminSDHolder,CN=System,DC=BREAKFASTLAND,DC=LOCAL" LDAP_Display_Name=nTSecurityDescriptor) OR (index=main Account_Name!=*$ Object_Type="%{19195a5b-6da0-11d0-afd3-00c04fd930c9}" Object_Name="%{754fb287-55d2-4d68-b7fc-0332e1746740}"  EventCode=4662 Access_Mask = 0x40000))
| eval Logon_ID=if(EventCode==4662,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval user=if(EventCode==4662,mvindex( Account_Name,-1), mvindex( Account_Name,-1))
| eval DACL=if(EventCode==5136,mvindex( Value,-1), mvindex( Value,-1))
| join type=outer Logon_ID
    [ search index=main Account_Name!=*$ Object_Type="%{19195a5b-6da0-11d0-afd3-00c04fd930c9}" Object_Name="%{754fb287-55d2-4d68-b7fc-0332e1746740}"  EventCode=4662 Access_Mask = 0x40000
    | eval Props=Properties
    | eval AccessMask=Access_Mask
    | eval ObjectType=Object_Type
    | eval ObjectName=Object_Name
    |table Account_Name,Logon_ID,Props,AccessMask,ObjectType, ObjectName]
| table _time, Logon_ID, Account_Name, Props, AccessMask, ObjectType, ObjectName, DN, GUID, DACL, Class, Type, LDAP_Display_Name.
|stats values by _time, Logon_ID, DACL

Image002 1

Zahl 2 - Erkennung mithilfe von Mehrfachereigniskennungen (1)

Image003 2

Zahl 3 - Erkennung mithilfe von Mehrfachereigniskennungen (2)

4.2 ms-DS-Supported-Encryption-Types

4.2.1 Hintergrund

Die msDS-SupportedEncryptionTypes legt die Verschlüsselungsalgorithmen fest, die Kerberos für die Verschlüsselung von Kerberos-Tickets verwenden darf.

4.2.2 Attribut ändern (Angriff)

Bevor Sie das Attribut msDS-SupportedEncryptionTypes müssen wir zunächst verstehen, wie hexagonale und/oder dezimale Werte mit den Verschlüsselungsarten verknüpft sind. um richtig das Attribut mit unserem Cmdlet PowerMad ändern.

Die verknüpfte Grafik hier gibt den Dezimalwert, den Hexadezimalwert und die unterstützten Verschlüsselungsarten des msDS-SupportedEncryptionTypes kann wie folgt definiert werden. Für unsere Zwecke werden wir den Dezimalwert 24 (Hex-Wert 0x18) verwenden, um das Attribut so zu ändern, dass die Funktion supp aktiviert wirdort für Verschlüsselungsarten AES 128 und AES 256. Dieser Wert wurde willkürlich gewählt.

Bild004

Zahl 4 - Ändern des Attributs

Image005

Zahl 5 - Validierung der Attributänderung

4.2.3 Aufbau der Erkennung

4.2.3.1 Erkennung mit den Ereignis-IDs 5136, 4624 und 4662
index=main ((EventCode=5136 AND LDAP_Display_Name=msDS-SupportedEncryptionTypes) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| eval Mod_Value=if(EventCode==5136,mvindex(Value,-1), mvindex(Value,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Source_Network_Address.
        | table Account_Name,Logon_ID, Source_Network_Address ]
| join type=outer Logon_ID
    [ search index=main Account_Name!=*$ EventCode=4662 Access_Mask = 0x20
    | eval Props=Properties
    | eval AccessMask=Access_Mask
    | eval ObjectType=Object_Type
    | eval ObjectName=Object_Name
    | rex field=Message "(?(?ms)(?0
| stats values by _time, Mod_Value

Image006 1

Zahl 6 - Erkennung mithilfe mehrerer Ereignis-IDs (1)

Image007 2

Zahl 7 - Erkennung mithilfe mehrerer Ereignis-IDs (2)

4.3 ms-DS-Reveal-On-Demand-Group (auf Englisch)

Für diesen Abschnitt beziehen wir uns auf den Blog An der Grenze zum Nullniveau: der kuriose Fall des RODC von Elad Shamir (@elad_shamir). Der oben genannte Blogartikel ist ein hervorragendes Hilfsmittel, um RODC und die Bedeutung der Verwaltungsschnittstelle zu verstehen. msds-RevealOnDemandGroup Attribut.

Um jedoch im Rahmen dieses Beitrags zusammenzufassen, wird das Attribut msds-RevealOnDemandGroup Das Attribut msds-RevealOnDemandGroup speichert die Objekte (d. h. Benutzer, Computer, Gruppen), deren Passwörter auf einem schreibgeschützten Domänencontroller (Read-Only Domain Controller, RODC) zwischengespeichert werden dürfen.

4.3.1 Attribute ändern (Angriff)

Set-ADObject -Identity 'CN=BREAKFAST-DC-03,ODER=Domain Controllers,DC=BREAKFASTLAND,DC=LOCAL' -Add @{'msDS-RevealOnDemandGroup'=@('CN=Allowed RDOC Password Replication Group,CN=Users,DC=BREAKFASTLAND,DN=LOCAL', 'CN=dacled.egg,CN=Users,DC=BREAKFASTLAND,DC=LOCAL')} -Server 10.0.2.4

Bild008

Abbildung 8 - Ändern des Attributs

Image009

Abbildung 9 - Validierung der Attributänderung

4.3.2 Aufbau der Erkennung

4.3.2.1 Erkennung mithilfe der Ereignis-IDs 5136, 4624 und 4662
index=main ((EventCode=5136 AND LDAP_Display_Name=msDS-RevealOnDemandGroup) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20 AND {303d9f4a-1dd6-4b38-8fc5-33afe8c988ad})))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Source_Network_Address.
        | table Account_Name,Logon_ID, Source_Network_Address ]
| join type=outer Logon_ID
    [ search index=main Account_Name!=*$ EventCode=4662 Access_Mask = 0x20
    | eval Props=Properties
    | eval AccessMask=Access_Mask
    | eval ObjectType=Object_Type
    | eval ObjectName=Object_Name
    | rex field=Message "(?(?ms)(?0
| stats values by _time, Value, Logon_ID

Bild010 1

Abbildung 10 - Erkennung mit den Ereignis-IDs 5136, 4662 und 4624 (1)

Bild011 2

Abbildung 11 - Erkennung mit den Ereignis-IDs 5136, 4662 und 4624 (2)

4.4 GPC-Machine-Extension-Names

4.4.1 Hintergrund

Die gPCMachineExtensionName pflegt eine Liste globaler eindeutiger Identifikatoren (GUIDs), für die clientseitige Erweiterungen von Gruppenrichtlinienobjekten (GPOs) und Snap-Ins der Microsoft Management Console (MMC) von den Einstellungen der Maschinenrichtlinie benötigt werden.

Durch die Änderung der im Attribut gespeicherten GUIDS könnte ein Angreifer potenziell GPO verwenden, um eine Datei von einem ferngesteuerten Host zu extrahieren und auf einen Domänencontroller hochzuladen.

4.4.2 Attribut ändern (Angriff)

Bei dieser speziellen Angriffssequenz werden wir den Angriffspfad, wie er in diesem TrustedSec-Blogbeitrag beschrieben wird, genau verfolgen.

Zunächst führen wir eine Erkundung durch, um den Namen des GPO zu identifizieren, das wir ändern werden.

Bild012

Abbildung 12 - Eine Erkundung durchführen

Wie Sie sehen können, ist der "DisplayName" der GPO AttackGPO, aber ihr Name und der Wert, den wir benötigen, um unsere Änderungen vorzunehmen, ist "{7ECE4273-CEEB-44BA-B777-C5FE3DBES 257}".

$objs= Get-ADObject -SearchBase "CN=Policies,CN=System,DC=BREAKFASTLAND,DC=LOCAL" -LDAPFilter "(objectclass=*)". -Credential $creds -Server 10.0.2.4 -Properties displayName,gPCMachineExtensionNames

$dcgpos =$objs | ?{$_.displayName -like "Attack"}

$dcgpos

Bild013

Abbildung 13 - Eine Erkundung durchführen

Mit einem GPO-Namen und einer GUID in der Hand können wir nun unseren Angriff starten.

Anmerkung: Um diesen Angriff korrekt auszuführen, müssen Sie das Element gPCMachineExtensionNames mit der Zeichenfolge [{GUID}{GUID}] wird natürlich nicht richtig funktionieren. Da wir uns jedoch nur für die Erkennung von Änderungen am Objekt interessieren und nicht unbedingt für den Entwurf eines funktionalen Angriffs, reicht dies aus, um die Protokolldaten zu generieren, die wir für die Erkennung innerhalb unseres SIEM benötigen. Um diesen Angriff korrekt auszuführen, empfehlen wir Ihnen, die in diesem Abschnitt verlinkten Referenzen (oder die Kurzlinks oben) zu lesen, da sie eine fantastische Arbeit leisten, indem sie Sie durch die bezeichnete Angriffssequenz führen. Außerdem ist es wichtig, Folgendes zu beachtene GPO mit dem Ziel erstellt wurde, diese Änderungen vorzunehmen, seien Sie vorsichtig, wenn Sie den folgenden Angriff in einer Produktionsumgebung durchführen.

$dcgomain = $dcgpos | ?{$_.Name -eq "{7ECE4273-CEEB-44BA-B777-C5FE3DBE5257}"}

$gpcme = "[{GUID}{GUID}]" + $dcgpomain.gPCMachineExtensionNames

Set-ADObject -Replace @{gPCMachineExtensionNames=$gpcme} -Server 10.0.2.4 -Credential $creds -Identity $dcgpomain.DistinguishedName

Get-ADObject -Credential $creds -Server 10.0.2.4 -Identity $dcgpomain.DistinguishedName -Properties displayName, gPCMachineExtensionNames

Bild014

Abbildung 14 - GPO bearbeiten

Und wir können durch Active Directory Servi bestätigence Interface Editor (ADSI), dass die Änderung am richtigen GPO vorgenommen wurde:

Bild015

Abbildung 15 - Änderungen freigeben

4.4.3 Aufbau der Erkennung

4.4.3.1 Erkennung mit den Ereignis-IDs 5136 und 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=gPCMachineExtensionNames) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM")))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Workstation_Name.
        | table Account_Name,Logon_ID, Workstation_Name ]
| table _time, EventCode, Mod_Account, Workstation_Name , Class, DN, Logon_ID, Type, LDAP_Display_Name, Value.
| where len(Class)>0 

Bild016 1

Abbildung 16 - Endgültige Abfrage zur Änderung von gPCMachineExtensionName (1)

Bild017 2

Zahl 17Endgültige Anfrage für die Änderung von gPCMachineExtensionName (2)

4.5 GPC-File-Sys-Path

4.5.1 Hintergrund

gpC-File-Sys-Path ist ein weiteres GPO-basiertes Attribut, das wie das Attribut gPCMachineExtensionNamekann Zugriff auf "geklonte Rechte in dem GPO-spezifischen Ordner auf dem Dateisystem, in dem sich das zugehörige SYSVOL befindet" geben (Ein Trumpf im Ärmel, S. 30) wenn einem Benutzer Schreibzugriff für ein GPO gewährt wird.

Sie können in der folgenden Abbildung sehen, dass das Element gPCFileSysPath verweist auf den Speicherort des Sysvol.

Bild018

Abbildung 18 - gPCFileSysPath vor der Änderung

4.5.2 Attribut ändern (Angriff)

Durch die Verwendung genau desselben Angriffspfades, den wir für den Angriff verwendet haben gPCMachineExtension können wir die bereits durchgeführte Erkennung verwenden und einfach eine neue Variable erstellen, mit der wir unsere Änderung speichern. Anschließend führen wir die Änderung mit demselben PowerShell-Befehl durch und bestätigen sie, wobei wir den Befehl anpassen, um unsere neue Variable hinzuzufügen.

$gpfsp = \\imposter.LOCAL\SysVol\imposter.LOCAL\Policies{7ECE4273-CEEB-44BA-B777-C5FE3DBE5257} + $dcgpomain.gPCCMachineExtensionNames
 
Set-ADObject -Replace @{gPCFileSysPath=$gpfsp} -Server 10.0.2.4
-Credential $creds -Identity $dcgpomain.DistinguishedName
 
Get-ADObject -Credential $creds -Server 10.0.2.4 -Identity $dcgpomain. DistinguishedName -Properties displayName, gPCFileSysPath

Bild019

Abbildung 19 - Bearbeiten des Attributs gPCFileSysPath

4.5.3 Aufbau der Erkennung

4.5.3.1 Erkennung mit den Ereignis-IDs 5136 und 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=gpcFileSysPath) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM")))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Workstation_Name.
        | table Account_Name,Logon_ID, Workstation_Name ]
| table _time, EventCode, Mod_Account, Workstation_Name , Class, DN, Logon_ID, Type, LDAP_Display_Name, Value.
| where len(Class)>0

Bild020 1

Abbildung 20 - Endgültige Erkennung von gPCFileSysPath (1)

Bild021 2

Abbildung 21 - Endgültige Erkennung von gPCFileSysPath (2)

4.6 NT-Security-Deskriptor

4.6.1 Hintergrund

Die NTSecurityDescriptor speichert Daten zu einem Objekt, wie Eigentum und Berechtigungen, in einem ""-Attribut. Format der Zeichenfolge des Sicherheitsdeskriptors. "

4.6.2 Aktivierung der Prüfung

Für diese besonderen Erkennungen müssen wir die Prüfung an zwei (2) Stellen aktivieren. Zunächst müssen Sie die Prüfung aktivieren von certsrvder über den Servermanager auf Ihrem Domänencontroller geöffnet werden kann.

Bild022

Zahl 22 - Aktivierung der Prüfung von certsrv

Für die Prüfung des Zugriffs auf Objekte müssen wir ebenfalls zu unseren Vorlagen in ADSI edit navigieren und die Prüfung für die Zertifikatsvorlage aktivieren, deren Ereignisse wir verfolgen wollen - in diesem Fall die Zertifikatsvorlage Benutzer Modell.

Bild023

Zahl 23 - Aktivierung der Objektprüfung

4.6.3 Attribut ändern (Angriff)

Für diesen Angriff werden wir eine Zertifikatsvorlage verwenden, die anfällig für einen ESC4-Angriff ist, indem wir das Werkzeug Certipy um alle in der Domäne verfügbaren Zertifikatvorlagen zu finden und zu lokalisieren. Weitere Informationen zu Schwachstellen und Exploits im Zusammenhang mit Zertifikatvorlagen finden Sie im Dokument Certipy GitHub.

certipy find -u [email protected] -p  -scheme ldap -dc-ip 10.0.2.4

Bild024

Zahl 24 - Suche nach AD CS-Vorlagen

In diesem Fall können wir schnell erkennen, dass der Benutzer ist anfällig für ESC4.

Hinweis: In der Regel suchen wir in der Natur nach der Gruppe, die über die "gefährlichen Berechtigungen" verfügt, d. h. Domänenbenutzer, authentifizierte Benutzer oder Domänencomputer. In diesem Fall ist die einzige Gruppe, die über die erforderlichen Berechtigungen verfügt, um das anfällige Modell auf ESC4 herabzustufen, die Gruppe Domain Admins, was ausreicht, um den Angriff zur Änderung des Attributs auszuführen.

Bild025

Zahl 25 - Anfälliges Modell ESC4

Anschließend stufen wir die Vorlage ESC4 herunter, sodass sie für ESC1 anfällig ist, und speichern die alte Konfiguration der Vorlage im Ordner User.json.

certipy template -username [email protected] -p  -template 'User' -scheme ldap -save-old -dc-ip 10.0.2.4

Bild026

Zahl 26 - Herabstufung von ESC4 zu ESC1

Als Nächstes beantragen wir ein Zertifikat mithilfe der Vorlage ESC1. In diesem Fall ist der antragstellende Benutzer Unter.Chefein nicht privilegierter Benutzer, der das Zertifikat im Namen eines Domänenadministratorkontos anfordert, head.chef. Dies wird mithilfe der Option UPN Fahne.

certipy req -username [email protected] -p  -upn head.chef.breakfastland.local -template 'User' -ca BREAKFASTLAND-BREAKFAST-DC-01-CA -target BREAKFAST-DC-01.BREAKFASTLAND.LOCAL -dc-ip 10.0.2.4

Bild027

Zahl 27 - Antrag auf ein Zertifikat

Und nun stellen wir das Zertifikat wieder her, wieder unter Verwendung von Zertifikat. Wie Sie in der Ausgabe sehen können, ändert er die Datei ntSecurityDescriptor . Nach dem Artikel aus Rapid7 der diesen Abschnitt inspiriert hat, ist es die UPN-Spezifikation, die das Ausschreibungsverfahren auslöst. ntSecurityDescriptor zu aktualisieren.

certipy template -username [email protected] -p  -template -User -configuration User.json -dc-ip 10.0.2.4

Bild028

Zahl 28 - Zertifikat wiederherstellen/das Attribut ntSecurityDescriptor ändern

4.6.4 Aufbau von Erfassungen

4.6.4.1 Erkennung mithilfe der Ereignis-ID 4898
index=main EventCode=4898
| table time, EventCode, host, DomainController, Security_Descriptor, Message

Bild029 1

Zahl 29 - Erkennung der Änderung von ntSecurityDescriptor über Ereignis-ID 4898 (1)

Bild030 2

Abbildung 30 - Erkennung der Änderung von ntSecurityDescriptor über Ereignis-ID 4898 (2)

4.6.4.2 Erkennung mithilfe der Ereignis-IDs 5136, 4662 und 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=ntSecurityDescriptor) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Source_Network_Address.
        | table Account_Name,Logon_ID, Source_Network_Address ]
| join type=outer Logon_ID
    [ search index=main Account_Name!=*$ EventCode=4662 Access_Mask = 0x20
    | eval Props=Properties
    | eval AccessMask=Access_Mask
    | eval ObjectType=Object_Type
    | eval ObjectName=Object_Name
    | rex field=Message "(?(?ms)(?0
| stats values by time, Value, LogonID

Bild031 1

Abbildung 31 - Erkennung mit den Ereignis-IDs 5136, 4624 und 4662 (1)

Bild032 2

Zahl 32 - Erkennung mit den Ereignis-IDs 5136, 4624 und 4662 (2)

4.6.4.3 Erkennung mithilfe der Ereignis-IDs 5136, 4662 und 4624 - PKI

In diesem Fall werden bei der Ausführung dieses Angriffs Änderungen an zusätzlichen Attributen initiiert. Um diese zu berücksichtigen, können Sie auch eine Erkennung erstellen, die die zusätzlichen Attribute der Public Key Infrastructure (PKI) zur Erkennung hinzufügt.

index=main ((EventCode=5136 AND (LDAP_Display_Name="*pki*" OR LDAP_Display_Name=ntSecurityDescriptor)) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20)))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Source_Network_Address.
        | table Account_Name,Logon_ID, Source_Network_Address ]
| join type=outer Logon_ID
    [ search index=main Account_Name!=*$ EventCode=4662 Access_Mask = 0x20
    | eval Props=Properties
    | eval AccessMask=Access_Mask
    | eval ObjectType=Object_Type
    | eval ObjectName=Object_Name
    | rex field=Message "(?(?ms)(?0
| stats values by time, LDAPDisplay_Name, Value, Logon_ID

Bild033 1

Zahl 33 - Erkennung von Änderungen an zusätzlichen Objekten (PKI-Objekte) (1)

Bild034 2

Zahl 34 - Erkennung von Änderungen an zusätzlichen Objekten (PKI-Objekte) (2)

4.7 CA-Zertifikat

4.7.1 Hintergrund

Die cACertificate Das Attribut cACertificate speichert Zertifikate, die bei vertrauenswürdigen Zertifizierungsstellen (CAs) registriert wurden.

4.7.2 Aktivierung der Prüfung/falsche Konfiguration der Domäne

Für den nächsten Angriff folgen wir dem Blogartikel, der von Decoder (@decoder_it).

Hinweis: Wir werden nicht die vollständige Abfolge des Angriffs verfolgen, da die Änderung des Attributs in den ersten Schritten des Posts vorgenommen wird. Um den vollständigen Patch des Angriffs zu simulieren, folgen Sie bitte dem vollständigen Ablauf hier.

Um unseren Angriff vorzubereiten, müssen wir zunächst einem Standardbenutzer "GenericAll" die Privilegien auf die Datei NTAuthCertificates . Dies kann über ADSI edit oder über PowerShell erfolgen.

In diesem Fall verwenden wir imposter.oatmeal wie unser falsch eingerichtetes Konto.

Bild035

Zahl 35 - Falsche Konfiguration des Objekts

Als Nächstes müssen wir den SACL-Eintrag für das Objekt konstruieren NTAuthCertificates um die Registrierungsdaten in Splunk zu empfangen.

Bild036

Zahl 36 - Einrichtung des SACL

Sobald dies geschehen ist, können wir unseren Angriff starten, um das Attribut zu ändern.

4.7.3 Attribut ändern (Angriff)

Zu Beginn erstellen wir eine gefälschte selbstsignierte Zertifizierungsstelle.

Bild037

Zahl 37 - CA Erstellung (1)

Wie im Decoder-Blog beschrieben, können Sie alle Felder mit Ausnahme von "Common Name" leer lassen.

Bild038

Zahl 38 -Gründung der CCA (2)

Nachdem wir die falsche Zertifizierungsstelle erstellt haben, können wir die Datei nun verschieben faux.crt auf einem mit einer Domäne verbundenen Windows-Host erstellt und die native Binärdatei verwenden certutil um den cACertificate mit dem Wert des zusätzlichen öffentlichen Schlüssels.

Hier ist es wichtig zu beachten, dass wir auf dem Windows-Host als Konto angemeldet sind imposter.oatmeal, der das Konto ist, das wir "falsch konfiguriert" haben, um besondere Berechtigungen für das Objekt zu haben, das wir bearbeiten.

Bild039

Zahl 39 - Die falsche Zertifizierungsstelle in die Domäne schieben

Und wenn wir nun einen Blick auf unsere cACertificate können wir sehen, dass er mit dem Wert des gefälschten Zertifikats geändert wurde.

Bild040

Zahl 40 - Attribut Post Änderung

4.7.4 Aufbau von Erfassungen

4.7.4.1 Erkennung mit den Ereignis-IDs 5136, 4662 und 4624
index=main ((EventCode=5136 AND LDAP_Display_Name=cACertificate) OR (EventCode=4624 AND Account_Name!="*$" AND Account_Name!="ANONYMOUS LOGON" AND Account_Name!="SYSTEM") OR (EventCode=4662 AND Access_Mask=0x20)))
| eval Logon_ID=if(EventCode==4624,mvindex(Logon_ID,-1), mvindex(Logon_ID,-1))
| eval Mod_Account=if(EventCode==4624,mvindex(Account_Name,-1), mvindex(Account_Name,-1))
| eval Changed_Value=if(EventCode==5136,mvindex(Value,-1), mvindex(Value,-1))
| join type=outer Logon_ID
        [ search (EventCode=5136) OR (EventCode=4624)].
        | stats count by Logon_ID, Account_Name, Source_Network_Address.
        | table Account_Name,Logon_ID, Source_Network_Address ]
| join type=outer Logon_ID
    [ search index=main Account_Name!=*$ EventCode=4662 Access_Mask = 0x20
    | eval Props=Properties
    | eval AccessMask=Access_Mask
    | eval ObjectType=Object_Type
    | eval ObjectName=Object_Name
    | rex field=Message "(?(?ms)(?0
| stats values by _time, Changed_Value

Bild041 1

Abbildung 41 - Erkennung mit den Ereignis-IDs 5136, 4662 und 4624 (1)

Bild042 2

Zahl 42 - Erkennung mit den Ereignis-IDs 5136, 4662 und 4624 (2)

4.8 Primary-Group-ID

4.8.1 Hintergrund

Die primaryGroupID enthält die Kennung der Primärgruppe (RID), der der Benutzer oder das Computerobjekt angehört.

4.8.2 Attribut ändern (Angriff)

Die primaryGroupID ist über die grafische Benutzeroberfläche von ADUC leicht zu ändern.

  • Navigieren Sie zuerst nach ADUC
  • Öffnen Sie das Eigenschaftsfenster des Computer-/Benutzerobjekts, das Sie bearbeiten
  • Navigieren Sie zur Registerkarte "Mitglied von
  • Klicken Sie auf "Hinzufügen".
    • Wählen Sie den Namen der Gruppe, die Sie zur Hauptgruppe machen möchten.
    • Klicken Sie auf ok und dann auf Anwenden.
  • Wählen Sie die neu hinzugefügte Gruppe im Feld "Mitglied von" aus.
    • Klicken Sie auf die Schaltfläche unter dem Feld "Hauptgruppe festlegen".
    • Klicken Sie auf Anwenden

Bild043

Zahl 43 - Änderung der primaryGroupID von COFFEEPOT-PC

4.8.3 Aufbau von Erfassungen

Bei den folgenden Ermittlungen stützen wir uns auf die Ereignis-IDs 4738 und 4742 für die Objekte Benutzer bzw. Computer. Achten Sie darauf, dass Sie Ihre SACL auf das Objekt einstellen, das Sie zu prüfen versuchen, um sicherzustellen, dass Protokolle erstellt und an Ihr SIEM gesendet werden.

4.8.3.1 Erkennung mithilfe der Ereignis-ID 4738 und der Ereignis-ID 4624
index=main AND (EventCode=4738 AND Primary_Group_ID!="-") OR EventCode=4624
| eval logon_id=if(EventCode=4624,mvindex(Logon_ID,1),mvindex(Logon_ID,0))
| eventstats values(EventCode) values(Source_Network_Address) by logon_id.
| rename values(*) as *
| eval account_name=mvindex(Account_Name,1)
| sort _time
| where isnotnull(Primary_Group_ID)
| table _time, account_name, logon_id, Source_Network_Address, Primary_Group_ID.
| stats values by logon_id, account_name

Bild044

Zahl 44 - Erkennung mit Ereignis-ID 4738 und 4624

4.8.3.2 Erkennung mithilfe der Ereignis-ID 4742 und der Ereignis-ID 4624
index=main AND (EventCode=4742 AND Primary_Group_ID!="-") OR EventCode=4624
| eval logon_id=if(EventCode=4624,mvindex(Logon_ID,1),mvindex(Logon_ID,0))
| eventstats values(EventCode) values(Source_Network_Address) by logon_id.
| rename values(*) as *
| eval account_name=mvindex(Account_Name,1)
| sort _time
| where isnotnull(Primary_Group_ID)
| table _time, account_name, logon_id, Source_Network_Address, Primary_Group_ID.
| stats values by logon_id, account_name

Bild045

Zahl 45 - Erkennung mit Ereignis-ID 4742 und 4624

4.8.3.3 primaryGroupID-Erkennungen mit RID-Filterung

Es ist wichtig zu beachten, dass die vorherigen Abfragen nur Primary Group IDs filtern, die nicht gleich "-" (null) sind. Für Organisationen, die möglicherweise auf ein hohes Ereignisvolumen für diese EventIDs stoßen, können Sie Ihre Filterung jedoch anpassen, um nach bestimmten RID-Gruppen zu suchen oder diese auszuschließen.

Beispielsweise könnten Sie die Erkennung unten so ändern, dass nur Benutzerkonten mit ihrem primaryGroupID geändert in 512 (Domain Admins), übernommen von der Abfrage :

index=main AND (EventCode=4738 AND Primary_Group_ID="512") OR EventCode=4624
| eval logon_id=if(EventCode=4624,mvindex(Logon_ID,1),mvindex(Logon_ID,0))
| eventstats values(EventCode) values(Source_Network_Address) by logon_id.
| rename values(*) as *
| eval account_name=mvindex(Account_Name,1)
| sort _time
| where isnotnull(Primary_Group_ID)
| table _time, account_name, logon_id, Source_Network_Address, Primary_Group_ID.
| stats values by logon_id, account_name

5 Schlussfolgerung

Wir hoffen, dass diese Reihe von Blogartikeln Fachleuten und Organisationen nicht nur das Ausmaß der Angriffsfläche von Active Directory (AD) vor Augen führt, sondern ihnen auch zeigt, wie sie gängige Angriffe erkennen können, die von Penetrationstestern, Mitgliedern des Red Teams und Bedrohungsakteuren missbraucht werden.

Aus Sicht der Sicherheit hoffen wir außerdem, dass eine der wichtigsten Erkenntnisse aus diesen Artikeln ist, wie wichtig es ist, die Lese- oder Schreibberechtigung dieser Attribute häufig zu prüfen. Werkzeuge wie Bloodhound, PingCastleund PurpleKnight kann dabei helfen, viele dieser einfach zu lösenden Probleme zu erkennen und zu überprüfen.

Ein weiterer wesentlicher Punkt, den Sie beachten sollten, wenn Sie versuchen, die in diesen drei (3) Blogartikeln bereitgestellten Erkennungen in Ihrer eigenen SIEM-Umgebung zu implementieren, ist, dass alle Erkennungen in einer Laborumgebung entwickelt wurden. Eine reale Produktionsumgebung wird zusätzliche Einstellungen erfordern, um False Positives zu eliminieren.

Obwohl es die beste Praxis und Präferenz ist, alle Attribute zu prüfen, erkennen, verstehen und operieren wir mit den Beschränkungen der SIEM-Lizenzkosten. Wir wollten einige der wichtigsten Angriffe/Missbräuche hervorheben und priorisieren und haben daher nicht alle Attribute erfasst. Wir räumen ein, dass wir keine "Informationen" verwendet haben, um die Priorität der Attribute in den verschiedenen Artikeln zu bestimmen. Stattdessen haben wir mit den "häufigsten" Attributen begonnen (beginnend mit der DACL-Missbrauchstabelle von Hacker Recipes), die von Red Teams und Penetrationstestern missbraucht werden können, und mit den am wenigsten verbreiteten oder "vergessenen" Attributen geendet.

Da die Erkennungen nicht für alle möglichen Angriffe/Missbräuche konstruiert wurden, können die in diesen Artikeln enthaltenen Erkennungsmodelle verwendet werden, um die beschriebenen Anwendungsfälle zu erweitern, wenn neue Angriffe/Techniken veröffentlicht werden, oder um Gegenstände abzudecken, die wir nicht behandelt haben.

Abschließend ein herzliches Dankeschön an alle, die sich an der Analyse, der Überarbeitung und den Vorschlägen beteiligt haben, um diese Blogreihe so gut wie möglich zu machen :

Charlie Bromberg (@_nwodtuhs)

Jonathan Johnson (@jsecurity101)

Jim Sykora (@jimsycurity)

Kevin Clark (@GuhnooPlusLinux)

6 Referenzen :

https://www.thehacker.recipes/ad/movement/dacl

https://stackoverflow.com/questions/73107061/convert-datetime-in-a-command

https://www.youtube.com/watch?v=ExO535CITXs

https://specterops.io/wp-content/uploads/sites/3/2022/06/an_ace_up_the_sleeve.pdf

Windows-Ereignisse :

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4662

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4624

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-5145

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4742

https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4738

AdminSDHolder :

https://viperone.gitbook.io/pentest-everything/everything/everything-active-directory/persistence/adminsdholder

msDS-SupportedEncryptionTypes :

https://learn.microsoft.com/en-us/windows/win32/adschema/a-msds-supportedencryptiontypes

https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/decrypting-the-selection-of-supported-kerberos-encryption-types/ba-p/1628797

msds-RevealOnDemandGroup:

https://eladshamir.com/2023/01/25/RODCs.html

gPCMachineExtensionNames :

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-gpod/896f59a5-5b72-4fb5-b1d4-8d007fdd6cb3

https://www.trustedsec.com/blog/weaponizing-group-policy-objects-access/

https://community.spiceworks.com/topic/345202-tips-and-tricks-for-total-control-the-inner-workings-of-group-policy

https://labs.withsecure.com/tools/sharpgpoabuse

https://sdmsoftware.com/security-related/sending-gpos-down-the-wrong-track-redirecting-the-gpt/

gPC-File-Sys-Path :

https://specterops.io/wp-content/uploads/sites/3/2022/06/an_ace_up_the_sleeve.pdf

https://learn.microsoft.com/en-us/windows/win32/adschema/a-gpcfilesyspath

NTSecurityDescriptor :

https://learn.microsoft.com/en-us/windows/win32/adschema/a-ntsecuritydescriptor

https://github.com/ly4k/Certipy

https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-string-format?redirectedfrom=MSDN

https://www.rapid7.com/blog/post/2023/06/02/metasploit-weekly-wrap-up-12/

cACertificate :

https://decoder.cloud/2023/09/05/from-ntauthcertificates-to-silver-certificate/

https://learn.microsoft.com/en-us/windows/win32/adschema/a-cacertificate

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-wcce/f1004c63-8508-43b5-9b0b-ee7880183745

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/certutil

primaryGroupID :

https://learn.microsoft.com/en-us/windows/win32/adschema/a-primarygroupid

https://www.qomplx.com/blog/primary-group-id-attacks/

https://dovestones.com/changing-primary-group-primarygroupid/

https://www.semperis.com/blog/how-attackers-can-use-primary-group-membership-for-defense-evasion/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert