Area41 2024 - Ein Rückblick
Michael Schneider
Das kann unser KleptoKitty
KleptoKitty, die Zwillingsschwester von HardeningKitty, ist ein auf PowerShell basierendes Framework für Lateral-Movement-Angriffe (MITRE ATT&CK TA0008) in einer Windows-Infrastruktur. Die Entwicklung begann im Oktober 2019 nach Inspiration des Cypherpunks und Hackers Tinker und die erste Version war ein einfaches PowerShell-Skript. Die Funktionalität des Skripts wurde nach und nach ausgebaut. Mit KleptoKitty werden Payloads auf das Zielsystem kopiert, dort ausgeführt, danach Zugangsdaten extrahiert und die Payload wieder entfernt. Ein zusätzliches Ziel bei der Entwicklung des Frameworks war es neue Angriffstechniken einfach adaptieren und als zusätzliche Payload einbinden zu können.
Als Payloads werden unter anderem Invoke-Mimikatz aus Empire von BC Security, Mimikatz von Benjamin Delpy und PPLKiller von Red Cursor eingesetzt. Da wir von hervorragenden Arbeiten aus der IT-Security-Community profitieren, stellen wir KleptoKitty auf unserem GitHub Repository unter MIT-Lizenz frei zur Verfügung.
Für die Übertragung von Dateien sowie Remote-Ausführung von Befehlen werden Windows-Standardkomponenten verwendet. Die meisten Funktionen werden mittels PowerShell (MITRE ATT&CK T1059-001) gesteuert. Dabei werden Dateien standardmässig über SMB-/Admin-Freigaben (MITRE ATT&CK T1021-002) auf das Zielsystem kopiert. Für die Remote-Ausführung von Befehlen kann Windows Management Instrumentation (WMI) (MITRE ATT&CK T1047), PsExec (MITRE ATT&CK T1569-002) oder Windows Remote Management (WinRM) (MITRE ATT&CK T1021-006) genutzt werden. Das Ziel ist es an lokale Zugangsdaten (SAM) (MITRE ATT&CK T1003-002) und Zugangsdaten von aktiven Accounts im Windows LSA Speicher (MITRE ATT&CK T1003-001) zu gelangen.
Die Payload Demo
eignet sich gut, um die Funktionsweise von KleptoKitty zu erklären. Die Payload wird auf das Zielsystem kopiert und dort ausgeführt. Die Payload erstellt dabei eine Datei unter C:\Windows\kleptokitty.log
und hinterlässt einen Protokolleintrag:
$ProtocolPath = "C:\Windows\kleptokitty.log" $Time = Get-Date -Format G $Message = "$Time - KleptoKitty was here." Add-Content -Path $ProtocolPath -Value $Message
Für die Payload Demo
muss nur ein Kopiervorgang durchgeführt und ein Befehl ausgeführt werden. Es ist nicht nötig eine Logdatei vom Zielsystem zu extrahieren. Der Name der Payload wird für jedes Zielsystem zur Laufzeit zufällig festgelegt und soll einen harmlosen Eindruck vermitteln, indem Namen von Windows-Systemdateien verwendet werden. Im ersten Schritt wird die Payload kopiert, falls dies misslingt wird die weitere Ausführung abgebrochen. Danach wird die Payload gestartet und anschliessend auf dem System gelöscht:
# Copy Payload Write-ProtocolEntry -Text "Copy payload $TargetPayloadName to $Hostname" -LogLevel "Info" $ResultCopyPayload = Copy-Payload -Source $PayloadPathCredentialAccess -Destination $TargetPayloadPath If (-not($ResultCopyPayload)) { Continue } # Execute Payload Write-ProtocolEntry -Text "Execute payload on $Hostname" -LogLevel "Info" $PayloadCommandCredentialAccess = "$TargetPayloadLocalPath" $ResultExecutePayload = Execute-Payload -PayloadCommand $PayloadCommandCredentialAccess If ($ResultExecutePayload) { Write-ProtocolEntry -Text "Payload $PayloadCredentialAccess executed." -LogLevel "Success" } # House Cleaning Write-ProtocolEntry -Text "Delete payload on $Hostname" -LogLevel "Info" Delete-File -File $TargetPayloadPath
Die Remote-Befehl-Ausführung geschieht über WMI. Dabei wird ein neuer Prozess kreiert und powershell.exe
gestartet. Wahlweise kann der Aufruf der Payload mit Base64-kodiert und somit verschleiert werden. Falls PowerShell Script Block Logging aktiviert ist, wird der Aufruf des Skripts jedoch dekodiert im Event Log gespeichert. Zudem kann die Verwendung der Base64-Kodierung ein Indikator für eine bösartige Aktion darstellen. Die Verwendung dieser Verschleierungsmassnahme ist optional und kann beim Aufruf der Funktion gesteuert werden.
Code $PayloadCommandEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($PayloadCommand)) $ArgumentList = "powershell.exe -Exec Bypass -Enc $PayloadCommandEncoded" try { $WmiExec = Invoke-WmiMethod -Class "win32_process" -Name "create" -ArgumentList $ArgumentList -ComputerName $Hostname -Credential $AdminCredential -ErrorAction Stop } catch { $ErrorReason = $_.Exception.Message Write-ProtocolEntry -Text "WMI connection to $Hostname failed. Reason: $ErrorReason" -LogLevel "Error" Write-ProtocolEntry -Text "$Hostname done" -LogLevel "Error" $ReturnCode = $false }
Nachdem die Payload auf dem Zielsystem gestartet wurde, kann die Ausführung dieser nur indirekt überwacht werden. Wenn eine Logdatei geschrieben und zurückkopiert werden sollte, lohnt es sich eine Weile zu warten, bevor weitere Schritte, wie das Kopieren dieser Logdatei, durchgeführt werden.
Das folgende Beispiel basiert auf einer Payload mit Invoke-Mimikatz. Dabei wird die Funktion Invoke-Mimikatz
selbst in die Payload kopiert. Im Anschluss folgt die Definition einer Logdatei für Mimikatz. Der Name der Logdatei muss KleptoKitty bekannt sein, sonst kann die Logdatei nicht extrahiert werden. Danach werden die auszuführenden Mimikatz-Anweisungen definiert. Im folgenden Beispiel werden die Zugangsdaten von aktiven Benutzern auf dem System ausgelesen:
Function FormerlyKnownAsMimikatz { # <add the script here> } # Log $TargetBasePath = "Windows" $TargetLogName = "de-ch.log" $TargetLogLocalPath = "C:\$TargetBasePath\$TargetLogName" # Run Payload FormerlyKnownAsMimikatz -Command """log $TargetLogLocalPath"" privilege::debug sekurlsa::logonpasswords"
Die Payload kann mit Base64 kodiert oder mittels Rijndael verschlüsselt werden. Für die Verschlüsselung wird ein Skript auf der Basis von einer Beispielimplementation von Kae Travis eingesetzt. Durch die Kodierung oder Verschlüsselung wird die Payload verschleiert und kann so allenfalls die Erkennung durch einen Virenscanner entgehen. Die Dekodierung/Entschlüsselung erfolgt zur Laufzeit. Virenscanner mit Unterstützung für Microsoft AMSI können daher die ungeschützte Version der Payload untersuchen.
Um Lateral-Movement-Angriffe zu erkennen und zu verhindern, können verschiedene Kontrollen eingesetzt werden. Ein sehr effizientes Mittel ist das Verhindern von Client-zu-Client-Kommunikation durch den Einsatz der Windows-Firewall oder einer anderen Host-Firewall. Dabei sollten vor allem Dienste wie WMI, SMB sowie WinRM gar nicht oder nur für spezifisch definierte Systeme erreichbar sein. Chad Duffey hatte dazu einen Blog-Artikel zur Einschränkung von SMB-Lateral-Movement-Angriffen geschrieben.
Im Artikel PowerShell Monitoring haben wir Massnahmen zur Überwachung von Aktivitäten mit PowerShell vorgestellt. Durch die Aktivierung von PowerShell Script Block Logging können Base64-kodierte Payloads aufgeschlüsselt werden. Der Artikel enthält ebenso eine Liste mit Schlüsselwörtern, nach welchen die PowerShell-Logs untersucht werden können. Zudem ist der Einsatz einer Antiviren-Lösung mit Unterstützung des Microsoft Antimalware Scan Interfaces (AMSI) empfehlenswert, da damit sogenannte file less attacks auch mit einem Virenscanner untersucht werden können.
Mit der Implementation des Regelwerks Attack Surface Reduction (ASR) können Prozesse, die mit PsExec oder WMI gestartet werden, blockiert oder zumindest aufgezeichnet werden. Der Artikel Monitoring Mimikatz zeigt auf wie Mimikatz mit der Auswertung von Event Logs und dem Einsatz von Sysmon detektiert werden kann. Zudem sollten Hardenigmassnahmen für die Windows Local Security Authority (LSA) implementiert werden.
Die Entwicklung von KleptoKitty wird weitergeführt, noch sind nicht alle gewünschten Features implementiert. Es ist unter anderem geplant die Verteilung von Payloads über HTTP oder SMB-Shares anzubieten. Zudem versuchen wir auch neue Entwicklungen und Angriffstechniken möglichst zeitnah zu implementieren. Wir freuen uns über Feedback, Verbesserungsvorschläge, “Lagerfeuer-Geschichten” wie KleptoKitty erfolgreich eingesetzt wurde und auch Pull-Requests sind willkommen.
Unsere Spezialisten kontaktieren Sie gern!
Michael Schneider
Michael Schneider
Michael Schneider
Michael Schneider
Unsere Spezialisten kontaktieren Sie gern!