
PowerShell zu Slack C2
Dieses PowerShell-Modul enthält verschiedene Funktionen, die die Slack-API nutzen, um einen Command-and-Control-Kanal zu erstellen. Die Hauptfunktion Start-Shell verbindet sich mit einem vom Benutzer angegebenen Slack-Kanal und authentifiziert sich mithilfe eines bereitgestellten API-Authentifizierungstokens für ein bestimmtes Slack-Team und einen bestimmten Benutzer. Jeder in den Kanal eingegebene Befehl wird dann auf dem Host in PowerShell ausgeführt.
Das SlackShell-Projekt erfordert PowerShell v3 und höher, da Invoke-RestMethod für API-Aufrufe verwendet wird. Die zukünftige Entwicklung wird weiterhin aktuelle PowerShell-Cmdlets und -Funktionen verwenden. Ein Port für PowerShell v2 wurde jedoch in SlackShell-Poshv2.psm1 erstellt.
Zusätzliche PS-Skripte können in die laufende Sitzung importiert werden, indem sie zuerst in den Slack-Kanal hochgeladen werden. Die Importfunktion lädt die Dateien herunter, die standardmäßig unter https://slack-files.com gehostet werden, und importiert sie in den Arbeitsspeicher. Die Dateien werden nicht auf der Festplatte gespeichert. Umgekehrt kann die Download-Funktion verwendet werden, um eine lokale Kopie einer beliebigen Datei auf der Festplatte zu speichern.
Lokale Dateien können über die API mithilfe der Upload-Funktion in den Slack-Kanal hochgeladen werden.
Bei Bedarf kann ein separater PS-Prozess gestartet werden, um einen Befehl auszuführen, der das integrierte Cmdlet Invoke-Command verwendet.
Startet die Überwachung eines Slack-Kanals auf Befehle, die in PowerShell ausgeführt werden sollen. Verbindet sich alle $sleep Sekunden mit dem Slack-Kanal und ruft alle neuen Befehle ab. Die Befehle werden auf dem Host in PowerShell ausgeführt.
Sendet eine Nachricht über die API an den angegebenen Slack-Kanal. Nachrichten werden mit einer Textkopfzeile gesendet, wobei der Nachrichtentext ein Slack-Anhang ist.
Startet einen neuen Prozess und führt einen Befehl in PowerShell auf dem Host aus. Nutzt die Start-Job-Methode in PowerShell, um einen neuen Prozess zu starten, auf das Ende des Auftrags zu warten und die Ausgabe zurückzugeben.
Führt einen Befehl in PowerShell auf dem Host im aktuellen Kontext des laufenden Prozesses aus und gibt die Ausgabe zurück.
Gibt alle Nachrichten in einem bestimmten Slack-Kanal vom ältesten Zeitraum bis zur Gegenwart zurück. Nachrichten werden gemäß den API-Spezifikationen im JSON-Format zurückgegeben.
Verwendet einen Slack-API-Aufruf, um zu testen, ob das bereitgestellte API-Token gültig ist.
Verwendet einen Slack-API-Aufruf, um eine Liste der aktuell im Slack-Kanal gehosteten Dateien zurückzugeben.
Aktualisiert die Dateiliste, lädt die angegebene Datei in den Arbeitsspeicher herunter, erstellt ein neues Modul und importiert dieses Modul anschließend. Für dieses Modul spezifische Befehle können dann direkt in den Slack-Kanal eingegeben werden. Die heruntergeladene Datei wird nicht auf der Festplatte gespeichert. Diese Funktion sollte als Beta betrachtet werden, während weitere Tests durchgeführt werden. Einige Module verhalten sich unregelmäßig
Aktualisiert die Dateiliste und lädt die angegebene Datei dann auf die Festplatte herunter. Ein zusätzlicher Speicherpfad kann angegeben werden; standardmäßig wird der aktuelle Speicherort verwendet.
Lädt eine lokale Datei in den Slack-Kanal hoch.
Das API-Token, das für die Authentifizierung verwendet wird. Dieses Token repräsentiert einen bestimmten Benutzer in einem bestimmten Slack-Team. Weitere Informationen finden Sie hier: https://api.slack.com/custom-integrations/legacy-tokens
Der Kanalbezeichner, der angibt, welcher Slack-Kanal im Team verwendet wird. Der gesamte Text in diesem Kanal wird dann als Befehle auf dem Host verarbeitet, wenn Start-Shell ausgeführt wird. Die Kanal-ID findet sich in der URL, wenn Sie die Kanalseite über die webbasierte Slack-Site aufrufen.
Beispiel: https://slackteam1.slack.com/messages/ABC123456. Die Kanal-ID ist "ABC123456".
Import-Module ./SlackShell.psm1
Start-Shell -Token "xoxp-175828824580-175707545555-176600001223-826315a84e533c482bb7e20e8312fh45k" -Channel "ABC123456" -Sleep 5
Treten Sie demselben Slack-Kanal mit einem anderen Benutzer bei als dem, der zum Erstellen des Tokens verwendet wurde. Alles, was als anderer Benutzer in den Kanal geschrieben wird, wird auf dem Host im selben lokalen Benutzerkontext ausgeführt, der zum Starten des Skripts verwendet wurde. Alternativ kann "runjob" verwendet werden, um Befehle in einem neu gestarteten PowerShell-Prozess auszuführen.
Schließt die Shell und die Verbindung.
Ändert das Verzeichnis im Kontext des Hauptprozesses. Relative Pfade können verwendet werden (z. B. cd ..)
Ändert die Sleep-Zeit.
Listet die verfügbaren Dateien im zugehörigen Slack-Kanal auf.
Importiert die angegebene Datei. Die Datei muss mit dem verwendeten Slack-Kanal geteilt werden.
Lädt die angegebene Datei auf die Festplatte herunter und speichert sie am optionalen Pfadparameterort. Die Datei muss mit dem verwendeten Slack-Kanal geteilt werden.
Lädt die lokale Datei zu Slack hoch und teilt sie mit dem verwendeten Kanal.
Führt den angegebenen Befehl in einem neuen PowerShell-Prozess aus.
Die Inspiration für die Arbeit mit der Slack-API in PowerShell wird Warren Frame zugeschrieben. Sein Repository war eine großartige Ressource für den Einstieg: https://github.com/RamblingCookieMonster/PSSlack
Besonderer Dank geht an @thesubtlety für die Portierung auf POSHv2 und die hinzugefügten Verbesserungen.