HardeningKitty - Windows-Konfiguration auditieren und härten

HardeningKitty

Windows-Konfiguration auditieren und härten

Michael Schneider
von Michael Schneider
am 15. Oktober 2020
Lesezeit: 9 Minuten

Keypoints

Automatisiertes Auditieren und Härten von Windows

  • HardeningKitty ist ein PowerShell-Skript für Windows-Hardening
  • Mittels Finding-Listen können Hardening-Einstellungen ausgelesen und bewertet werden
  • Es werden verschiedene Module zum Auslesen von Informationen verwendet
  • Findingslisten basieren auf eigenen Erfahrungen und Microsoft Security Baselines
  • Finding-Listen können mit einfachen Mittel bearbeitet oder ergänzt werden

Der Beitrag zu KleptoKitty stellte ein Framework für Lateral-Movement-Angriffe vor, was Angriffe auf Systeme in einem Windows-Netzwerk erleichtern soll. Damit solche Angriffe erfolgreich sind, müssen Angreifer über lokale Administratorenrechte verfügen, um den LSA-Prozess auszulesen und mit anderen Systemen kommunizieren zu können. Mit einem gut gehärteten Betriebssystem lässt sich die Erfolgschance für Angreifer reduzieren. Zudem steigt die Wahrscheinlichkeit Angriffe frühzeitig zu erkennen. Mit unserem PowerShell-Skript HardeningKitty kann die Konfiguration eines Windows Systems (Client und Server) automatisiert überprüft und bewertet werden.

HardeningKitty, die Zwillingsschwester von KleptoKitty, ist ein auf PowerShell basierendes Skript zur Prüfung des Hardenings eines Windows-Systems oder von einzelnen Applikationen wie Microsoft Office und Microsoft Edge. Anhand von Finding-Listen werden Windows-Einstellungen ausgelesen und bewertet. Zur Informationsbeschaffung verwendet HardeningKitty verschiedene Module, wie beispielsweise Registry-Schlüssel, definierte Richtlinien für Rechte von Benutzergruppen sowie Audit-/Logging-Einstellungen. Die Bewertung erfolgt anhand hinterlegter Schweregrade in der Finding-Liste.

Das automatisierte Auslesen der Windows-Konfiguration ist das Resultat einer Weiterentwicklung, die mit einer Sammlung von Hardening-Empfehlungen aus dem Artikel Windows 10 Client Hardening im Dezember 2016 begann und mit Erstellung einer Hardening-Checkliste im Herbst 2017 fortgeführt wurde. Danach versuchten wir mit dem Microsoft Tool Policy Analyzer aus dem Microsoft Security Compliance Toolkit 1.0 die Konfiguration eines Systems anhand von Checklisten zu analysieren und auf Hardening-Einstellungen zu überprüfen, die wir im Rahmen von Configuration Reviews unseren Kunden empfehlen. Nach einigen Versuchen haben wir festgestellt, dass der Policy Analyzer nicht das richtige Werkzeug für unsere Anforderungen ist. Einerseits konnten wir nicht alle Prüfungen umsetzen und andererseits benötigen wir mehr Freiheiten bei der Verarbeitung der Resultate. Wir konnten beispielsweise den BitLocker-Status oder das Vorhandensein von Windows-Features wie SMBv1 oder PowerShellv2 nicht wie gewollt auslesen. Daher haben wir uns entschieden, ein eigenes Skript zu schreiben.

Das PowerShell-Skript HardeningKitty steht in unserem GitHub-Repository zur freien Nutzung und Weiterverwendung zur Verfügung.

Einsatz von Modulen

Mittels Abfragen der Registry kann der meiste Teil der Prüfpunkte abgearbeitet werden. HardeningKitty verfügt jedoch über weitere Module, die sowohl Tools wie auditpol.exe, bcdedit.exe und secedit.exe als auch PowerShell Cmdlets wie Get-ComputerInfo, Get-BitLockerVolume, Get-MpPreference, und Get-Processmitigation nutzen, um an Systeminformationen ausserhalb der Registry zu gelangen. Mit der Verwendung des Tools AccessChk besteht auch eine externe Abhängigkeit, alle anderen Module verwenden Standard-Systemkomponenten. Um alle Systemeinstellungen auszulesen sind lokale Administratorenrechte notwendig. Falls ein Wert nicht ausgelesen werden kann, da die erforderlichen Werte fehlen, haben wir zunächst einen Standardwert in der Finding-Liste gepflegt. In der Aktualisierung von HardeningKitty zur Version 0.4.2 haben wir eine zusätzliche Prüfung eingebaut, die einen Testpunkt nicht auswertet, falls lokale Administratorenrechte fehlen, um False-Positive-Resultate vermeiden zu können.

HardeningKitty starten

Die Ausführung ist mit Benutzer oder Administratorenrechten möglich. Falls nur Registry-Werte ausgelesen werden, kann dies ohne Administratorenrechte bewerkstelligt werden. Bei anderen Modulen sind jedoch erweiterte Privilegien notwendig. In der Finding-Liste ist bei jedem Testpunkt definiert, welches Modul verwendet wird. Wenn eine Bewertung von spezifischen Benutzereinstellungen durchgeführt werden soll, wie beispielsweise bei der Überprüfung von Microsoft Office oder Microsoft Edge, dann sollte das Skript mit dem jeweiligen Benutzer gestartet werden, dessen Einstellungen ausgewertet werden sollen.

HardeningKitty wird mittels den folgenden Befehlen geladen und ausgeführt:

PS C:\> Import-Module -Force Invoke-HardeningKitty.ps1
PS C:\> Invoke-HardeningKitty -FileFindingList .\lists\finding_list_0x6d69636b_machine.csv

         =^._.^=
        _(      )/  HardeningKitty

[*] 10/7/2020 9:23:49 AM - Starting HardeningKitty

[*] 10/7/2020 9:23:49 AM - Getting machine information
[*] Hostname: w10-client
[*] Domain: WORKGROUP
[*] Domain role: StandaloneWorkstation
...

[*] 10/7/2020 9:23:51 AM - Getting user information
[*] Username: w10-client\administrator
[*] Is Admin: True

[*] 10/7/2020 9:23:51 AM - Starting Category Features
[+] ID 1000, SMBv1 Support, Result=Disabled, Severity=Passed

[*] 10/7/2020 9:23:52 AM - Starting Category Account Policies
[+] ID 1100, Account lockout duration, Result=15, Severity=Passed
[+] ID 1101, Account lockout threshold, Result=5, Severity=Passed
[+] ID 1102, Reset account lockout counter, Result=15, Severity=Passed

...

Der Parameter FileFindingList spezifiziert welche Finding-Liste verwendet wird. Mit den Parametern Log und Report werden alle Ausgaben des Skripts mit Zeitstempeln in einer Textdatei sowie alle Resultate in einer CSV-Datei gespeichert. Die Parameter Log und Report können unabhängig voneinander genutzt werden. Es ist zudem möglich den jeweiligen Speicherort der Dateien zu definieren.

Finding-Listen

Zurzeit umfasst HardeningKitty die folgenden Finding-Listen:

Die Finding-Listen liegen als CSV-Dateien vor und können daher einfach bearbeitet und ergänzt werden. Um Prüfpunkte hinzuzufügen, muss die Methode zum Auslesen des Werts bekannt sein. Im Falle von Registry-Einträgen wird der Pfad und Name des Schlüssels benötigt. Ebenso kann der empfohlene Wert sowie der Schweregrad nach eigenen Bedürfnissen gesetzt werden. Im folgenden Beispiel stellt die ID 1300 eine Prüfung eines Registry-Eintrags dar, während für die ID 1000 ein Modul zur Prüfung von Windows Features entwickelt wurde.

"ID","Category","Name","Method","MethodArgument","RegistryPath","RegistryItem","ClassName","Namespace","Property","DefaultValue","RecommendedValue","Operator","Severity"
1000,"Features","SMBv1 Support","WindowsOptionalFeature","smb1protocol",,,,,,"Enabled","Disabled","=","High"
1300,"Security Options","Accounts: Block Microsoft accounts","Registry",,"HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System","NoConnectedUser",,,,0,3,"=","Low"

Für jeden Eintrag wird ein empfohlener Wert namens RecommendedValue, der Standardwert DefaultValue, falls die Einstellung nicht explizit konfiguriert wurde, sowie ein Schweregrad Severity, wenn der tatsächliche Wert vom empfohlenen Wert abweicht, definiert. Mit dem Feld Operator wird vorgegeben, ob der Wert exakt gleich wie die Empfehlung sein soll, oder ob mehrere Werte möglich sind. Für die Zeitdauer der Sperrung eines Accounts wird beispielsweise 15 Minuten oder mehr empfohlen.

Wenn für Checklisten wie Security Baselines von Microsoft, CIS Benchmarks oder unternehmenseigene Vorgaben in Form von Registry-Werten vorliegen, können diese einfach in eine Finding-Liste als CSV-Datei konvertiert und danach mit HardeningKitty verwendet werden.

Einstellungen auslesen

Das Auslesen von Systeminformationen birgt unterschiedliche Tücken. Idealerweise ist der gewünschte Wert in einer Microsoft Dokumentation aufgeführt. Die Microsoft Security Baseline für Windows 10 beinhaltet für die meisten der Vorgaben einen Registry-Pfad und den entsprechenden Namen des Schlüssels. Es ist aber nicht dokumentiert, welches der empfohlene Wert für den Schlüssel ist. Dies kann je nach Formulierung einer Richtlinie 0 oder 1 sein. Da die Struktur der Registry über die Jahre gewachsen ist und mit verschiedenen Konzepten und unterschiedlichen Entwicklungsteam gepflegt wurden, ist keine einheitliche Struktur ersichtlich.

Erschwerend kommt hinzu, dass je nach Einstellung verschiedene Registry-Pfade existieren. Die Windows Firewall kann über eine Policy-Richtline unter dem Pfad HKLM:\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile mit dem Schlüssel EnableFirewall aktiviert werden. Falls jedoch keine Policy-Richtlinie verwendet, sondern die Firewall über die Administrationsoberfläche gepflegt wird, dann gilt der Schlüssel EnableFirewall unter dem Registry-Pfad HKLM:\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile. Für die Microsoft Security Baseline für Microsoft Edge gibt Microsoft nur Policy-Pfade vor, die mittels eines GPO-Templates zuerst in die Gruppenrichtline-Verwaltung importiert werden müssen. Für die Entwicklung eines automatisierten Skripts ist die richtige Auswahl des Pfads insbesondere wichtig, damit keine Falschaussagen getroffen werden. Im Falle der Windows-Firewall-Einstellungen haben wir uns dafür entschieden, beide Pfade auszulesen und zu bewerten.

Windows-Richtlinien und die Ausgabe von Tools wie auditpol.exe sind abhängig von der Sprache des Betriebssystems. Im Moment unterstützen wir nur die englische Version von Windows. Wir haben die Betriebssysteme Windwos 10, Windows Server 2016 und 2019 getestet. Falls jemand das Skript auf anderen Versionen oder mit einer anderen Sprache ausführt, sind wir an einem Erfahrungsaustauch interessiert.

Ausblick

Die Finding-Listen von HardeningKitty werden mit neuen Erkenntnissen ergänzt und aktualisiert, wenn es von Microsoft eine neue Version der jeweiligen Security Baseline gibt. Die Entwicklung weiterer Funktionen ist geplant, dazu gehört der Vergleich von Resultaten. Dieses Feature eignet sich unter anderem um regelmässig automatisierte Prüfungen durchzuführen, die Differenz aufzulisten und Veränderungen in der Konfiguration zu detektieren. Ebenso geplant ist mit HardeningKitty ein Hardening des Systems durchführen zu können. Diese Funktion dürfte vorwiegend für Standalone-Systeme nützlich sein. Geplant ist auch die Ausgabe eines Indexwerts und einer Statistik über die Anzahl bestandener Testpunkte und wie viele Findings pro Schweregrad vorliegen. Für die Weiterentwicklung und die Qualität der Finding-Listen ist für uns Feedback zu den Resultaten sehr wertvoll, vor allem falls False-Positive-Resultate auftreten. Jedes System hat seine Eigenheiten und das kann in einer Testumgebung nicht vollständig simuliert werden. Ebenso freuen wir uns über neue oder erweiterte Finding-Listen.

Über den Autor

Michael Schneider

Michael Schneider arbeitet seit dem Jahr 2000 in der IT. Im Jahr 2010 hat er sich auf die Informationssicherheit spezialisiert. Zu seinen Aufgaben gehören das Penetration Testing, Hardening und das Aufspüren von Schwachstellen in Betriebssystemen. Er ist bekannt für eine Vielzahl in PowerShell geschrieber Tools zum Finden, Ausnutzen und Beheben von Schwachstellen. (ORCID 0000-0003-0772-9761)

Links

Sie wollen die Sicherheit Ihrer Firewall prüfen?

Unsere Spezialisten kontaktieren Sie gern!

×
KleptoKitty

KleptoKitty

Michael Schneider

Linux Hardening

Linux Hardening

Michael Schneider

Attack Surface Reduction Regeln

Attack Surface Reduction Regeln

Michael Schneider

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv