
C#-Tool zur Aufzählung und Ausnutzung von Fehlkonfigurationen in Active Directory Certificate Services (AD CS), das Missbrauch von Zertifikatsvorlagen, Privilegienausweitung und Domain-Persistenz ermöglicht.
Certify ist ein C#-Tool zur Aufzählung und Ausnutzung von Fehlkonfigurationen in Active Directory Certificate Services (AD CS).
@harmj0y und @tifkin_ sind die Hauptautoren von Certify und der zugehörigen AD-CS-Forschung (Blog und Whitepaper).
Eine Befehlsübersicht und umfassende Nutzungsdetails findest du auf dem Wiki.
Certify wurde auf der Black Hat 2021 zusammen mit unserem Vortrag „Certified Pre-Owned: Abusing Active Directory Certificate Services“ veröffentlicht.
Siehe unser Whitepaper für Hinweise zur Prävention und Erkennung.
Wir planen nicht, Binärdateien von Certify zu veröffentlichen, du musst es also selbst kompilieren :)
Certify wurde für .NET 4.7.2 erstellt und ist kompatibel mit Visual Studio 2022 Community Edition. Öffne einfach die Projektmappe .sln, wähle „Release“ und erstelle sie.
Wenn du Certify über einen PowerShell-Wrapper im Arbeitsspeicher ausführen möchtest, kompiliere zuerst Certify und kodiere die resultierende Assembly als Base64:
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\Temp\Certify.exe")) | Out-File -Encoding ASCII C:\Temp\Certify.txt
Certify kann dann in einem PowerShell-Skript mit folgendem Befehl geladen werden (ersetze „aa...“ durch die Base64-kodierte Certify-Assembly-Zeichenfolge):
$CertifyAssembly = [System.Reflection.Assembly]::Load([Convert]::FromBase64String("aa..."))
Die Main()-Methode und alle Argumente können dann wie folgt aufgerufen werden:
[Certify.Program]::Main("enum-templates --filter-enabled --filter-vulnerable".Split())
Aufgrund der Art und Weise, wie PSRemoting die Ausgabe behandelt, müssen wir stdout in eine Zeichenfolge umleiten und diese stattdessen zurückgeben. Glücklicherweise verfügt Certify über eine Funktion, die dabei hilft.
Wenn du den Anweisungen in Anmerkung: Certify über PowerShell ausführen folgst, um eine Certify.ps1 zu erstellen, füge etwa Folgendes an das Skript an:
[Certify.Program]::MainString("enum-templates --filter-enabled --filter-vulnerable")
Anschließend solltest du Certify über PSRemoting mit etwa folgendem Befehl ausführen können:
$s = New-PSSession dc.theshire.local
Invoke-Command -Session $s -FilePath C:\Temp\Certify.ps1
Alternativ leitet das Argument /outfile:C:\FILE.txt von Certify alle Ausgabeströme in die angegebene Datei um.
Zum Thema öffentliche Offenlegung: Wir haben die Veröffentlichung unserer offensiven Tools (Certify sowie ForgeCert) für ca. 45 Tage nach Veröffentlichung unseres Whitepapers selbst gesperrt, um Organisationen die Möglichkeit zu geben, die Probleme rund um Active Directory Certificate Services in den Griff zu bekommen. Wir haben außerdem vorab einige Yara-Regeln/IOCs für beide Projekte sowie das defensiv ausgerichtete PowerShell-Projekt PSPKIAudit zusammen mit dem Whitepaper veröffentlicht. Allerdings haben wir festgestellt, dass Organisationen und Hersteller in der Vergangenheit oft Fehler nicht behoben oder Erkennungsmethoden für „theoretische“ Angriffe erst entwickelt haben, wenn jemand etwas mit einem Proof of Concept als möglich demonstriert hat.
Certify verwendete einige online gefundene Ressourcen als Referenz und Inspiration:
Die AD-CS-Arbeit baut auf der Arbeit vieler anderer auf. Das Whitepaper enthält eine vollständige Behandlung, aber zusammenfassend: