【代码审计】-Tenda AC 18 v15.03.05.05 /goform接口文档漏洞挖掘

news2025/2/23 1:37:07

路由器: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 requests

ip = "192.168.124.154"
url = "http://" + ip + "/goform/SetSpeedWan"
payload = b"a"*1000

data = {"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 requests

ip = "192.168.124.154"
url = "http://" + ip + "/goform/QuickIndex"
payload = b"a"*1000

data = {"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"*2000

data = {"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 requests

ip = "192.168.124.154"
url = "http://" + ip + "/goform/SetPptpServerCfg"
payload = 'a'*1000

data = {
"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"*2000

data = {"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 requests

ip = "192.168.124.154"
url = "http://" + ip + "/goform/openSchedWifi"
payload = b"a"*1000

data = {"schedWifiEnable":0,"schedEndTime": payload}
response = requests.post(url, data=data)
print(response.text)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2303695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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;谢谢…

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、选择主界面的"创建新的虚拟机"或者点击左上…

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;…

天 锐 蓝盾终端安全管理系统:办公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;当前节点的指…

RabbitMQ 消息队列 优化发送邮件

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

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、循环嵌套…