Packer-Fuzzer漏扫工具RCE 0day(当前已被官方修复)
0x00关于本文 今天朋友丢我一个授权测试的站,那个站用vue写的前端,因此前端js包含了所有的接口。 而另一方面整个前端就一个登录框堵在那儿,因此翻js几乎成了唯一的思路。 翻着翻着,我烦了,于是估摸着网上已经有前辈们写出了专门针对webpack的扫描工具,一搜就搜到了Packer-Fuzzer( https://github.com/rtcatc/Packer-Fuzzer ) 当我浏览这个工具的介绍的时候,我注意到了这句话 “本工具将会通过PyExecJS运行原生NodeJS代码,故我们推荐您安装NodeJS环境” 看到这句话我一下就警觉起来,毕竟nodejs是可以执行命令的,而相关的安全问题已经让蚁剑翻过车了( https://xz.aliyun.com/t/8167 ),于是一瞬改变目标开始研究这个工具,并且挖掘出了RCE 当前漏洞已经被官方修复,并且奖励800(由于我Twitter上提前公开了漏洞导致高危->中危) 本文将会从分析者的角度分析漏洞 0x01定位js执行点 简单搜索execjs就可以找到执行点,位置在Recoversplit.py的57行 0x02 防护绕过 作者在写这个代码的时候也意识到了被反打的可能性(“防止黑吃黑被命令执行”),所以当js出现了exec和spawn的时候就不会执行,但是这样的简单的防护几乎是没有用的。 且不说nodejs沙箱逃逸已经被师傅们玩出花来了,单是这里eval没有过滤掉就可以通过字符串拼接或者url编码的方式绕过这个限制 比如说这里就用了url编码了能弹出计算器的payload,解码并eval之后就能弹出计算器 0x03 调用分析 那么这个执行点是怎么被调用到的呢 看了下代码,发现执行点在RecoverSplit类的jsCodeCompile里,这个函数被同一个类的checkCodeSpilting调用,而checkCodeSpilting又被这个类的recoverStart调用,recoverStart被Project类的parseStart调用,而parseStart,而再往前追溯就是命令参数处理之类乱七八糟的地方了 知道了这些东西之后,我们就可以根据它的调用一步一步走,一点一点写出RCE的POC了 0x04 如何进入recoverStart函数?让程序相信这个网站使用了webpack 我们看到这