欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

看我如何通过nodejs中的SSRF完全控制aws

来源:本站整理 作者:佚名 时间:2018-12-18 TAG: 我要投稿

这是我在hackerone上一个私人漏洞奖金计划中发现的一个漏洞,发现,利用和写报告足足花了我12个半小时,都不带休息的。通过这个漏洞,我可以获取到AWS的凭证,我可以完全入侵该公司的账号:现在我手里有20个buckets和80个EC2实例。另外,这是我挖洞生涯中最有意思的漏洞,学到了很多东西,所以想在此给大家分享一下。
介绍
刚才说过,这是一个私人奖金项目,所以公司名就不方便透露了,我们就叫它ArticMonkey吧。
为了实现他们的web应用程序,ArticMonkey公司开发了一套自定义的宏语言,就叫做Banana++吧。我不知道这个Banan++这个语言最初是基于什么语言开发的,但是从web应用中,我发现了一个JavaScript版本信息,所以我决定深入挖掘一下。
原始的banan++.js文件已经压缩过了,但文件还是有点大,压缩后2.1M,美化后2.5M,56441行,2546981个字符,崩溃。当然,我没有读完整个代码,只是搜索了一些Banan++特定的一些关键词,在3348行定位到了第一个函数,整个文件大概有135个函数,既然有这么多函数,那我就可以对这些函数进行分析,发挥我的专业技能了。
发现问题
我开始从头看代码,但是大部分函数都是进行数据操作或者是数学运算符,没有什么可疑的或危险的。找了一会儿,我终于发现了一个Union()函数,可能有戏,代码如下:

仔细看代码,注意到有一个奇怪的eval()函数,是不是很惊喜,我把代码复制到一个本地的HTML文件中以便进行多次测试。
这个函数可以接收无限个参数,不过第三个参数开始才是有用的参数。这个函数是借助第二个参数来比较第一个参数和第三个参数的,然后测试第4个,第5个等等。通常的用法是这样的,Union(1,’
然而,该函数却没有对参数的类型和值进行过滤和净化,于是我就利用alert()来进行测试,alert()是我最新换的调试器,我发现可以通过不同的方法来触发漏洞利用,如图所示:

注入点
现在我们有了一个危险的函数,这已经是一个很好的开始了,不过我们真正需要的是用户输入的地方来注入恶意代码。我记得在使用Banan++函数时看到过一些post参数,于是在Burp的历史记录中找了找,请求响应如下:


可以看到有一个operation参数,可以进行测试一下。
开始注入
由于我对Banan++一无所知,所以我得先进行一些测试来看看我可以注入何种类型的代码,下面是一些手工模糊测试,
{...REDACTED...,"operation":"'\">
通过这些测试,我总结了以下几点:
不能注入任意的JavaScript代码
可以注入Banan++函数
响应似乎只有真假两种,取决于参数operation的真假,这对于验证我注入的代码是否有效非常有帮助。
下面我们继续来对Union()函数进行模糊测试:
{...REDACTED...,"operation":"Union(1,2,3)"}{"status":400,"message":"Parse error on line 1...REDACTED..."}
{...REDACTED...,"operation":"Union(a,b,c)"}{"status":400,"message":"Parse error on line 1...REDACTED..."}
{...REDACTED...,"operation":"Union('a','b','c')"}{"status":400,"message":"Parse error on line 1...REDACTED..."}
{...REDACTED...,"operation":"Union('a';'b';'c')"}[{"name":"REDACTED",...REDACTED...}]
{...REDACTED...,"operation":"Union('1';'2';'3')"}[{"name":"REDACTED",...REDACTED...}]
{...REDACTED...,"operation":"Union('1';'';'3')"}[]]
测试效果非常完美,如果测试13,响应结果为空(false)。参数必须要用分号来分隔。下面我就要开始尝试一些真正的攻击了。
fetch是新的XMLHttpRequest异步请求
因为请求是对api的一种ajax调用,而且只返回json数据,显然不是一个客户端注入。而且通过前面的报告,我知道ArticMonkey倾向于在服务端使用大量的JavaScript。
不过,这些都不重要,因为我得尝试所有东西,可能无意中就能触发一个错误,暴露了运行着JavaScript代码的系统的一些敏感信息。因为我进行了本地测试,所以我知道如何准确的注入恶意代码。我测试了基础的xss payload和错误格式的JavaScript代码,不过得到的错误跟前面的一样。
然后我尝试发起HTTP请求。
首先进行ajax调用:
x = new XMLHttpRequest;
x.open( 'GET','https://poc.myserver.com' );
x.send();
但是没有什么收获,于是我尝试了HTML注入:
i = document.createElement( 'img' );
i.src = '';
document.body.appendChild( i );
还是没有任何收获,继续尝试:
document.body.innerHTML += '';
document.body.innerHTML += '';
结果还是一样,没有收获。
有时候,你要进行一些很脑残的测试,你才知道系统设计的有多愚蠢。显然,这里尝试着去渲染HTML代码是有问题的。回到ajax请求,我在这里卡了一段时间,花了很长时间才明白它是如何工作的。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载