当前位置: 首页 > article >正文

【代码审计】-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个 字节,导致缓冲区溢出。

故我们可以构造:

  1. http://<ip router>/goform/SetOnlineDevName+mac=a*2000,devName=1
  2. 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接口文档漏洞挖掘

路由器&#xff1a;Tenda AC 18 v15.03.05.05 固件下载地址&#xff1a;https://www.tenda.com.cn/material?keywordac18 1./goform/SetSpeedWan 接口文档&#xff1a; formSetSpeedWan函数中speed_di参数缓冲区溢出漏洞&#xff1a; 使用 binwalk -eM 解包固件&#xff0c…...

2025年02月21日Github流行趋势

项目名称&#xff1a;source-sdk-2013 项目地址url&#xff1a;https://github.com/ValveSoftware/source-sdk-2013项目语言&#xff1a;C历史star数&#xff1a;7343今日star数&#xff1a;929项目维护者&#xff1a;JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…...

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …...

统一的多摄像头3D感知框架!PETRv2论文精读

论文地址&#xff1a;PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 源代码&#xff1a;PETR 摘要 在本文中&#xff0c;我们提出了PETRv2&#xff0c;用于从多视角图像中进行3D感知的统一框架。基于PETR [24]&#xff0c;PETRv2探索了时间建模的…...

【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;周五又到了&#xff0c;明天应该就是牛马的休息日了吧&#xff01;&#xff01;&#x1f606; 前天我们详细介绍了 硬链接的特点&#xff0c;现在继续探讨 软链接的特点&#xff0c;并且后续将添加更多相关知识噢&#xff0c;谢谢…...

快速排序_912. 排序数组(10中排序算法)

快速排序_912. 排序数组&#xff08;10中排序算法&#xff09; 1 快速排序&#xff08;重点&#xff09;报错代码超时代码修改官方题解快速排序 1&#xff1a;基本快速排序快速排序 2&#xff1a;双指针&#xff08;指针对撞&#xff09;快速排序快速排序 3&#xff1a;三指针快…...

DEMF模型赋能多模态图像融合,助力肺癌高效分类

目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…...

Linux-CentOS 7安装

Centos 7镜像&#xff1a;https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation&#xff1a;https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…...

Android14(13)添加墨水屏手写API

软件平台&#xff1a;Android14 硬件平台&#xff1a;QCS6115 需求&#xff1a;特殊品类的产品墨水屏实现手写的功能&#xff0c;本来Android自带的Input这一套可以实现实时展示笔迹&#xff0c;但是由于墨水屏特性&#xff0c;达不到正常的彩屏刷新的帧率&#xff0c;因此使用…...

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 在忙碌的职场中&#xff0c;制作一份高质量的PPT往往需要投入大量时间和精力&#xff0c;尤其是在临近截止日期时。今天&#xff0c;我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR&#xff1a;彩色图像 cv2.IMREAD_GRAYSCCALE&#xff1a;灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…...

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…...

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异&#xff0c;以下是综合多个来源的常用方法及注意事项&#xff1a; 通过ADB命令注入GPS数据&#xff08;适用于技术用户&#xff09; 1.连接云手机 使用ADB工具连接云手机服务器&#xff0c;…...

VUE中的组件加载方式

加载方式有哪些&#xff0c;及如何进行选择 常规的静态引入是在组件初始化时就加载所有依赖的组件&#xff0c;而懒加载则是等到组件需要被渲染的时候才加载。 对于大型应用&#xff0c;可能会有很多组件&#xff0c;如果一开始都加载&#xff0c;可能会影响首屏加载时间。如…...

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制

天 锐 蓝盾终端安全管理系统以终端安全为基石&#xff0c;深度融合安全、管理与维护三大要素&#xff0c;通过对桌面终端系统的精准把控&#xff0c;助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化&#xff0c;有效破解终端安全管理难题&#xf…...

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

区块链中的递归长度前缀(RLP)序列化详解

文章目录 1. 什么是RLP序列化&#xff1f;2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化&#xff1f; 递归长度前缀&#xff08;RLP&…...

分布式简单理解

基本概念 应⽤(Application)/系统&#xff08;System&#xff09; 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐&#xff1a;为了完成⼀项任 务&#xff0c;⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块&#xff08;Module&#xff09;/组件…...

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录&#xff0c;而且它的命令行反馈内容很像 docker &#xff0c;而且它下载的模型也是放在 C 盘&#xff0c;那么如果我 C 盘空间不足&#xff0c;就装不了 deepseek-r1:70b &#xff0c;于是想起来之前安装 Docker 的时候也遇到过类似问…...

Leetcode 二叉树展开为链表

java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树&#xff0c;//递归需要先处理子问题&#xff08;子树的拉平&#xff09;&#xff0c;然后才能处理当前问题&#xff08;当前节点的指…...

IEEE官方期刊缩写查询pdf分享

可以直接保存...

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ&#xff1f;如何在 Node 项目中集成 RabbitMQ&#xff1f; 一、 不用 await 发送邮件 在实际开发之前&#xff0c;不妨先思考下&#xff0c;我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…...

【AI】常见的AI工具地址和学习资料链接

AI工具地址&#xff1a; DeepSeek&#xff1a;DeepSeekChatGPT-4o&#xff1a;https://openai.com/chatgpt/overview/Kimi&#xff1a;Kimi.ai - 会推理解析&#xff0c;能深度思考的AI助手豆包&#xff1a;豆包讯飞星火&#xff1a;讯飞星火大模型-AI大语言模型-星火大模型-科…...

NetLogon 权限提升漏洞

参考文章&#xff1a;CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户&#xff1a;WIN-0V0GAORDC17 域控 ip&#xff1a;192.168.72.163 域内攻击者机器 ip&#xff1a;192.168.72.158&#xff0c;host&#xff1a;WIN10-01 攻击者 kali…...

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉&#xff0c;李政伟&#xff0c;二零一三年九月版&#xff0c;学习笔记 文章目录 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 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是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 测试&#xff1a; python -c"import cv2"...

Spring Boot 中事务的用法详解

引言 在 Spring Boot 中&#xff0c;事务管理是一个非常重要的功能&#xff0c;尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持&#xff0c;能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法&#xff0c;包括事务的基本概…...

【react18】如何使用useReducer和useContext来实现一个todoList功能

重点知识点就是使用useReducer来攻坚小型的公共状态管理&#xff0c;useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…...