Node.js 反序列化漏洞远程执行代码(CVE-2017-5941)
实验目的 (转载自I春秋 )
了解Node.js 序列化漏洞原理
掌握利用Node.js 序列化漏洞进行任意代码执行
漏洞原理
现在我们使用0.0.4版本的node-serialize进行研究,成功利用的话,不可信输入传递到 unserialize()的时候可以执行任意代码。创建
Payload最好使用同一模块的serialize()函数。 我创建了以下 JavaScript 对象,将其传入 serialize() 函数。
运行后得到以下输出:
现在我们得到序列化的字符串,可以用 unserialize() 函数进行反序列化操作。那么问题来了,怎么代码执行呢?
只有触发对象的 rce 成员函数才可以。 后来我想到可以使用 JavaScript 的立即调用的函数表达式(IIFE)来调用该函数。
如果我们在函数后使用 IIFE 括号 () ,在对象被创建时,函数就会马上被调用。有点类似于 C 中的类构造函数。 现在修改过的
代码经 serialize() 函数马上会被调用。
运行后得到以下输出:
我们知道了,在之前序列化的字符串中函数体后面
加上括号 (),并将其传入 unserialize() 函数,很幸运,成功执行。那么就有了下面的 exploit:
将其传入unserialize() 函数,触发代码执行。
运行后得到以下输出:
实验环境
操作机:kali linux
目标机:Centos6.5
实验工具 exp.txt:
利用nodejs代码执行的代码文件。
实验步骤
首先访问目标机器http://172.16.12.2 可以看到一个存在node.js漏洞的登录界面。 我们使用nc监听本地端口,用于接收漏洞环境的反弹Shell. nc -lv -p 8080 即监听本机8080端口 Alt text 将实验工具提供的exp代码,下载后修改里面的 <ip> <port>,修改为本机IP和NC监听的端口号。修改后复制该代码,去尝试到登录界面利用。 Alt text 用户名任意输入,将修改好的exp代码复制到密码框点击登录即可。 小提示: 如果代码错误,出现报错导致环境崩溃请从新创建环境,并检测代码错误继续实验 点击登录后,如下图所示:利用成功,已经反弹回一个shell,并且权限为root。