
Live-Überwachungstool für Remote-PowerShell-Sitzungen, das ETW nutzt, um das WinRM/PSRP-Protokoll zu erfassen und zu dekodieren und so Befehlsausführungs-Traces und Protokollierung für die Sicherheitsanalyse bereitstellt.
RemotePSpy ermöglicht die Live-Überwachung von Remote-PowerShell-Sitzungen, was besonders für ältere (vor 5.0) PowerShell-Versionen nützlich ist, die keine umfassenden integrierten Protokollierungsfunktionen besitzen.
Es verwendet Event Tracing for Windows (ETW), um Nachrichtendaten aus dem WinRM-Protokoll zu erhalten, das als Transport für Remote-PowerShell dient, und dekodiert die verschiedenen Protokollebenen, um eine Ablaufverfolgung der ausgeführten Skriptbefehle sowie deren Ein-/Ausgabe bereitzustellen.
Dies ist derzeit ein früher Forschungsprototyp und unterstützt daher nicht jeden Aspekt des PowerShell Remote Protocol (PSRP). Es kann dennoch nützliche Einblicke darüber liefern, was in einer Remote-PowerShell-Sitzung geschieht.
Der einfachste Weg zur Installation ist die Verwendung von pip:
pip install remotepspy
Die Abhängigkeiten sollten bei der Installation über pip automatisch installiert werden. Falls Sie jedoch aus dem Quellcode installieren möchten, sind sie hier aufgelistet:
Die libwim-15.dll wird nur benötigt, wenn der (empfohlene und standardmäßige) Microsoft-Windows-WinRM-ETW-Anbieter als Datenquelle verwendet wird. Sie wird verwendet, um bestimmte Stream-Objekte im WinRM/WSMan-Protokoll zu dekomprimieren, die PSRP-Nachrichtenfragmente enthalten. Legen Sie sie einfach in dasselbe Verzeichnis wie das Haupt-Python-Skript.
Führen Sie einfach RemotePSpy aus, um die Überwachung und Protokollierung zu starten, und drücken Sie die Eingabetaste,
wenn Sie fertig sind. Das Protokoll wird in das aktuelle Arbeitsverzeichnis geschrieben und heißt RemotePSpy.log.
Das Tool gibt außerdem eine ungefähre Nachbildung dessen, was der Benutzer von Remote-PowerShell auf seinem Bildschirm sehen würde, auf stdout aus, zusammen mit den ausführlicheren Informationen in der Protokolldatei. Eine komplexere Protokollierung ist verfügbar – siehe „Logging“ unten.
Wenn Sie Python so installiert haben, dass es sich in Ihrem PATH befindet, befinden sich die ausführbaren RemotePSpy-Skripte ebenfalls in Ihrem PATH. Andernfalls müssen Sie möglicherweise in Ihrem Python-site-packages-Verzeichnis danach suchen.
Das standardmäßige RemotePSpy verwendet den (empfohlenen) WinRM-ETW-Anbieter als Datenquelle. Wenn Sie stattdessen den
PowerShell-ETW-Anbieter verwenden möchten, können Sie RemotePSpy_powershell_prov ausführen.
Diese Version kann aufgrund der zusätzlichen Komplexität der Verfolgung bestimmter Zustände, die darauf basiert, wie die Daten in diesem speziellen ETW-Anbieter bereitgestellt werden, einige unnötige Warnungen erzeugen.
Der Code besteht aus einer Reihe recht modularer Klassen, die Eingaben auf verschiedenen Ebenen des Protokollstapels akzeptieren können. Dies ermöglicht es, sie je nachdem, woher die Daten stammen und in welcher Form, auf leicht unterschiedliche Weise miteinander zu verbinden. Die meisten Klassen akzeptieren eine Callback-Funktion, mit der sie das von ihnen erzeugte Ergebnis an die nächste Ebene im Stapel weitergeben.
Eine Beschreibung der wichtigsten verwendeten Klassen finden Sie unten, gefolgt von einigen Verarbeitungsabläufen, die zeigen, welche Klasse in welchen Szenarien in welche andere einspeist.
ETWWinRM – Ruft ETW-Ereignisse vom WinRM-Anbieter ab.
ETWPowerShell – Ruft ETW-Ereignisse vom PowerShell-Anbieter ab.
PowerShellETWParser – Identifiziert den Shell-Kontext für PowerShell-ETW-Ereignisse und leitet die Fragmentdaten an PSRPDefragmenter weiter. Bietet außerdem Thread-Synchronisierung.
SoapDefragmenter – Setzt vollständige WSMan-SOAP-Nachrichten aus WinRM-ETW-Ereignissen wieder zusammen und leitet das vollständige SOAP an WSManPS weiter.
WSManPS – Filtert nicht PowerShell-bezogene WinRM-Nachrichten heraus, verfolgt den Shell-Kontext, extrahiert PSRP-Fragmentdaten aus dem WSMan-SOAP und leitet die Fragmentdaten an PSRPDefragmenter weiter.
PSRPDefragmenter – Setzt PSRP-Fragmente zu vollständigen PSRP-Nachrichten wieder zusammen. Fragmente werden nach ObjectID zusammengesetzt, und die Eindeutigkeit der ObjectID wird durch Berücksichtigung des Shell-Kontexts sichergestellt. Leitet endgültige PSRP-Nachrichten an PSRPParser weiter.
PSRPParser – Dekodiert die rohe binäre PSRP-Nachricht und extrahiert Header-Details wie RPID, Pipeline-ID und MessageType. Leitet dekodierte Nachrichten an SimpleCommandTracer weiter.
SimpleCommandTracer – Interpretiert PSRP-Nachrichten mithilfe von MessageType und extrahiert und protokolliert/druckt Befehle, Argumente und deren Ausgabe. Enthält eine partielle Dekodierung serialisierter PowerShell-Objekte. Keine vollständige Implementierung jedes möglichen Features, versucht jedoch, die meisten gängigen Fälle abzudecken, um eine Ausführungsablaufverfolgung zu ermöglichen.
Verarbeitungsablauf bei Verwendung des Microsoft-Windows-WinRM-ETW-Anbieters:
ETWWinRM -> SoapDefragmenter -> WSManPS -> PSRPDefragmenter -> PSRPParser -> SimpleCommandTracer
Verarbeitungsablauf bei Verwendung des Microsoft-Windows-PowerShell-ETW-Anbieters:
ETWPowerShell -> PowerShellETWParser -> PSRPDefragmenter -> PSRPParser -> SimpleCommandTracer
Auf jeder Ebene des Protokollstapels gibt es eine umfassende Protokollierung. Dies ermöglicht das Debuggen auf verschiedenen Ebenen und war während der Entwicklung besonders hilfreich. Hoffentlich kann es auch für alle nützlich sein, die Remote-PowerShell in Aktion untersuchen möchten, da es möglich ist, eine vollständige Ablaufverfolgung des Protokolls auf allen wichtigen Ebenen zu erhalten.
Derzeit muss der Quellcode am Ende des Skripts, wo die Logger konfiguriert sind, bearbeitet werden, um die Protokollierung zu ändern. Zukünftige Versionen sollten hoffentlich eine bessere Methode für eine solche Konfiguration bereitstellen.
Jeder Loggername wird durch eine Konstante, LOGGER_NAME, in der Klasse definiert, die ihn verwendet. Jeder Logger ist als Kind von „RemotePSpy“ definiert (z. B. RemotePSpy.etw). Programmatisch können Logger mit logging.getLogger() und dem entsprechenden Protokollnamen konfiguriert werden.
Als schnelle Referenz liefern Ihnen die folgenden Logger und Ebenen Protokollablaufverfolgungen auf verschiedenen Ebenen des Protokolls:
| Wichtige Protokolldaten | Logger-Name-Konstante | Ebene |
|---|---|---|
| Befehlsablaufverfolgung | SimpleCommandTracer.LOGGER_NAME | INFO |
| Vollständige ETW-Ereignisablaufverfolgung | ETWWinRM.LOGGER_NAME | DEBUG |
| Vollständige WSMan-SOAP-Nachrichtenablaufverfolgung | SoapDefragmenter.LOGGER_NAME | INFO |
| Vollständige Ablaufverfolgung jedes PSRP-Fragments | PSRPDefragmenter.LOGGER_NAME | DEBUG |
| Vollständige PSRP-Nachrichtenablaufverfolgung | PSRPParser.LOGGER_NAME | DEBUG |
Beachten Sie, dass SimpleCommandTracer zusätzlich eine Ablaufverfolgung auf stdout ausgibt, die versucht, die Anzeige etwas zu replizieren, wie sie der Remote-PowerShell-Benutzer sehen würde. Dies unterscheidet sich vom Befehlsablaufverfolgungsprotokoll, das jeden Befehl, jeden Pipeline-Methodenaufruf und jede Pipeline-Ausgabe auf eine präzisere Weise protokolliert, einschließlich zusätzlichem Kontext wie RPID und Pipeline-ID.
Eine ausführlichere Zusammenfassung dessen, was in jedem Protokoll auf welcher Ebene erscheint, finden Sie unten:
ERROR:
WARNING:
INFO:
DEBUG:
DEBUG:
ERROR:
WARNING:
INFO:
DEBUG:
ERROR:
WARNING:
INFO:
DEBUG:
INFO:
DEBUG:
DEBUG:
ERROR:
DEBUG:
INFO: