Exploiting __VIEWSTATE without knowing the secrets
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
バグバウンティのヒント:Intigritiにサインアップしてください。これはハッカーによって、ハッカーのために作られたプレミアムバグバウンティプラットフォームです!今日、https://go.intigriti.com/hacktricksに参加し、最大**$100,000**のバウンティを獲得し始めましょう!
ViewStateは、ASP.NETにおけるページとコントロールデータをウェブページ間で維持するためのデフォルトメカニズムです。ページのHTMLがレンダリングされる際、ページの現在の状態とポストバック中に保持される値がbase64エンコードされた文字列にシリアライズされます。これらの文字列は、隠しViewStateフィールドに配置されます。
ViewState情報は、以下のプロパティまたはその組み合わせによって特徴付けられます:
Base64:
EnableViewStateMac
とViewStateEncryptionMode
属性が両方ともfalseに設定されている場合に使用されます。
Base64 + MAC(メッセージ認証コード)有効:
MACの有効化は、EnableViewStateMac
属性をtrueに設定することで達成されます。これにより、ViewStateデータの整合性検証が提供されます。
Base64 + 暗号化:
ViewStateEncryptionMode
属性がtrueに設定されている場合に暗号化が適用され、ViewStateデータの機密性が確保されます。
画像は、.NETフレームワークのバージョンに基づくASP.NETのViewStateの異なる構成を詳細に示す表です。内容の要約は以下の通りです:
任意の.NETバージョンの場合、MACと暗号化の両方が無効な場合、MachineKeyは必要なく、したがってそれを特定する適用可能な方法はありません。
4.5未満のバージョンの場合、MACが有効で暗号化が無効な場合、MachineKeyが必要です。MachineKeyを特定する方法は「Blacklist3r」と呼ばれます。
4.5未満のバージョンの場合、MACが有効か無効かにかかわらず、暗号化が有効な場合、MachineKeyが必要です。MachineKeyを特定するのは「Blacklist3r - Future Development」のタスクです。
4.5以上のバージョンの場合、MACと暗号化のすべての組み合わせ(両方がtrue、または一方がtrueで他方がfalseの場合)はMachineKeyを必要とします。MachineKeyは「Blacklist3r」を使用して特定できます。
AspNetEnforceViewStateMac
レジストリキーをゼロに設定することで、ViewStateMACを完全に無効にすることも可能です:
ViewState属性の特定
BurpSuiteを使用して、このパラメータを含むリクエストをキャプチャすることで、ViewStateがMACで保護されているかどうかを特定しようとすることができます。パラメータを保護するためにMacが使用されていない場合、YSoSerial.Netを使用してこれを悪用することができます。
開発者はViewStateをHTTPリクエストの一部として送信しないように削除することができます(ユーザーはこのクッキーを受け取りません)。 ViewStateが存在しない場合、その実装はViewStateのデシリアライズに起因する潜在的な脆弱性から安全であると考えるかもしれません。 しかし、それは事実ではありません。リクエストボディにViewStateパラメータを追加し、ysoserialを使用して作成したシリアライズされたペイロードを送信すれば、ケース1に示されているようにコード実行を達成することができます。
特定のページに対してViewState MACを有効にするためには、特定のaspxファイルに以下の変更を加える必要があります:
全体のアプリケーションについても、以下に示すようにweb.configファイルに設定することで実行できます:
パラメータはMACで保護されているため、攻撃を成功させるにはまず使用されているキーが必要です。
使用されているキーを見つけるためにBlacklist3r(AspDotNetWrapper.exe) を試すことができます。
Badsecrets は、既知の machineKeys を特定できる別のツールです。Python で書かれているため、Blacklist3r とは異なり、Windows の依存関係はありません。.NET viewstates 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。
viewstate と generator を直接提供することもできます:
または、ターゲットURLに直接接続し、HTMLからviewstateを切り出そうとすることができます:
脆弱な viewstate を大規模に検索するために、サブドメイン列挙と組み合わせて、badsecrets
BBOT モジュールを使用できます:
運が良ければ、キーが見つかり、YSoSerial.Netを使用して攻撃を進めることができます:
サーバーによって_VIEWSTATEGENERATOR
パラメータが送信されない場合、--generator
パラメータを提供する必要はありませんが、これらのパラメータは必要です:
この場合、パラメータがMACで保護されているかどうかは不明です。したがって、値はおそらく暗号化されており、脆弱性を悪用するためにペイロードを暗号化するためのマシンキーが必要です。
この場合、 Blacklist3r モジュールは開発中です...
.NET 4.5以前では、 ASP.NETは**ViewStateEncryptionMode
が_常に_に設定されていても、ユーザーからの未暗号化**___VIEWSTATE
_パラメータを受け入れることができます。ASP.NETは**__VIEWSTATEENCRYPTED
パラメータの存在のみを確認します**。このパラメータを削除し、未暗号化のペイロードを送信すると、それでも処理されます。
したがって、攻撃者がファイルトラバーサルのような別の脆弱性を介してマシンキーを取得する方法を見つけた場合、ケース2で使用されたYSoSerial.Netコマンドを使用して、ViewStateのデシリアライズ脆弱性を利用してRCEを実行できます。
ViewStateのデシリアライズ脆弱性を悪用するために、リクエストから__VIEWSTATEENCRYPTED
パラメータを削除してください。そうしないと、Viewstate MAC検証エラーが返され、悪用は失敗します。
以下のパラメータをweb.configファイル内に指定することで、ASP.NETフレームワークの使用を強制できます。
代わりに、これはweb.configファイルのmachineKey
パラメータ内に以下のオプションを指定することで行うことができます。
前述のように、値は暗号化されています。 そのため、有効なペイロードを送信するには攻撃者がキーを必要とします。
Blacklist3r(AspDotNetWrapper.exe) を使用して、使用されているキーを見つけることができます:
IISDirPathとTargetPagePathの詳細な説明についてはこちらを参照してください
または、Badsecrets(ジェネレーター値付き)を使用して:
有効なMachine keyが特定されると、次のステップは YSoSerial.Net を使用してシリアライズされたペイロードを生成することです。
__VIEWSTATEGENERATOR
の値がある場合、その値を使って--generator
パラメータを使用し、--path
および--apppath
パラメータを省略することができます。
ViewStateのデシリアライズ脆弱性の成功した悪用は、ユーザー名を含む攻撃者制御のサーバーへのアウトオブバンドリクエストにつながります。この種のエクスプロイトは、「Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET」というリソースを通じて見つけることができる概念実証(PoC)で示されています。悪用プロセスの仕組みや、MachineKeyを特定するためにBlacklist3rのようなツールを利用する方法についての詳細は、提供された成功した悪用のPoCを確認してください。
ViewStateUserKeyプロパティは、CSRF攻撃に対して防御するために使用できます。そのようなキーがアプリケーションで定義されている場合、これまでに議論した方法でViewStateペイロードを生成しようとすると、ペイロードはアプリケーションによって処理されません。 ペイロードを正しく作成するためには、もう1つのパラメータを使用する必要があります:
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが成功した場合、サーバーは「500 Internal server error」で応答し、応答内容は「このページの状態情報は無効であり、破損している可能性があります」となり、OOB リクエストを受け取ります。
バグバウンティのヒント: Intigritiにサインアップしてください。これはハッカーによって、ハッカーのために作られたプレミアムバグバウンティプラットフォームです!今日、https://go.intigriti.com/hacktricksに参加し、最大**$100,000**のバウンティを獲得し始めましょう!
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する: HackTricks Training GCP Red Team Expert (GRTE)