首页
社区
课程
招聘
[原创] CVE-2022-44201 命令注入漏洞 (含固件修复)
发表于: 2024-3-23 16:21 9373

[原创] CVE-2022-44201 命令注入漏洞 (含固件修复)

2024-3-23 16:21
9373

环境: qemu-system-mipsel

根据文件 rcS 可以知道使用了下述命令启动web服务

现在尝试运行

启动失败了

用用户模式运行程序然后到IDA里调试分析

main函数里调用了daemmon函数,然后就挂了,直接nop掉

关于 daemon()
这个函数是为了启动一个后台进程,内部调用了fork实现,子程序启动成功后父进程就会退出

所以daemon()不是真正导致错误的原因,继续单步最后找到函数apmib_init(),它才是真正导致崩溃的原因,直接过掉

这里有个检查pid然后退出程序的,过掉

再启动试试

调试发现是因为打开了个设备文件,没有检查是否打开成功就直接调用fseek导致

直接nop掉然后继续

上述错误是因为程序直接找了网络设备br0

但是我的网络是这样的

没有名为br0的网络设备,有两个方法解决这个问题,一个是直接添加一个br0,这应该是最方便的,另一个就是把所有的br0字符串引用改成eth0的引用,这个稍微麻烦亿点,所以我们用第二个(我不熟悉网络配置-v-)

因为我没有用Ghrida,IDA没办法patch这个文件,所以只能到010Editor里去找然后修改,没找到直接就能用的eth0字符串,所以在data段找了个空白自己加上去,然后把所有br0的引用计算便宜改到eth0身上去(真的很麻烦a)

改完之后再次运行

终于跑起来了,但是嘛

请求之后就挂掉了,我一遍又一遍的调试,也没找对错误发生在哪,突然我想起了我看的别人的固件修复的文章,同样是libapmib,人家还修了个apmib_get函数呢,我断到它的跳转去,单步一下,果然是因为这个,最方便(个人觉得)的解决还是直接patch,去lib下找到这个库文件让这个函数的开头直接跳转到返回

还有两个函数 apmib_set()apmib_update. 避免后续出问题,用同样的方法patch掉了

现在启动web服务然后请求

图片描述

根据阿里云漏洞库对这个漏洞的描述,可以知道是命令注入

既然是命令注入(执行).那我们就找system() 函数的引用.然后找到了一个明显有问题的调用在函数0x42383C

它将一个未经验证的参数格式化到原定命令中并将其执行

首先我们先直接在调试器里设置寄存器的值跳过那些判断,检查 一下a11是什么东西

把断点打在sprintf的调用处,然后用下面的命令请求路径

图片描述
和猜想的一样,是post的数据

直接使用上述的请求方式是没办法执行到system去执行命令的,看上面的伪代码就知道,还有俩判断需要绕过,但是不知道arg是什么东西,根据它的大小和现在的应用场景推断和我们的请求数据有关系,在调试器里找$ra寄存器往外分析

首先是0x40B740.这个函数对用户的请求路径做了匹配,然后分发到不同的处理函数

然后是 0x41C488...........
hum这样的方式有点复杂,既然知道可能是某个HTTP字段,那就找那个处理函数,找知道的大概率会存在的字段,像content-length

在IDA里搜索字符串content-length,然后找引用,果然找到了一个匹配提取字段内容的函数0x41D354.然后看到了这样一段代码

它把字段soapaction的内容写到了a1[329],应该就是我们要找的字段了,现在用下面的命令进行请求

-H "soapaction:" 绕过字段内容为空判断 if(arg[329])

soapaction:SetMultipleActions 绕过字符串内容判断 if(strstr(arg[329],"SetMultipleActions"))

图片描述

图片描述

这是第二次做IOT的复现,嘛说是第一次也行,感觉上一次好像没有学到太多东西,包括环境的配置了,固件修复了,各种。因为去看其它师傅的复现笔记的话,挺多还是用了firmadyne之类的工具的,我不太想上来就用因为感觉挺多东西不太理解,我也不知道那程序是怎么的就跑起来了,挺懵的就,所以还是先学习一下怎么自己解决

多有不足之处,欢迎指出:)

┌──(root㉿W1sh)-[~/leamov/CVE-2022-44201]
└─# binwalk -Me DIR823G_V1.0.2B05_20181207.bin  --run-as=root
...
┌──(root㉿W1sh)-[~/leamov/CVE-2022-44201]
└─# binwalk -Me DIR823G_V1.0.2B05_20181207.bin  --run-as=root
...
┌──(root㉿W1sh)-[/mnt/e/LeaMov/workspace/IOT/2.CVE-2022-44201]
└─# scp -r -O _DIR823G_V1.0.2B05_20181207.bin.extracted/squashfs-root/ root@192.168.2.2:/root/
...
┌──(root㉿W1sh)-[/mnt/e/LeaMov/workspace/IOT/2.CVE-2022-44201]
└─# scp -r -O _DIR823G_V1.0.2B05_20181207.bin.extracted/squashfs-root/ root@192.168.2.2:/root/
...
root@debian-mipsel:~/squashfs-root# ls
bin  dev  etc  home  init  lib  mnt  proc  sys  usr  var  web  web_mtn
root@debian-mipsel:~/squashfs-root# ls
bin  dev  etc  home  init  lib  mnt  proc  sys  usr  var  web  web_mtn
# ls /etc/init.d/
rcS     rcS_GW
# ls /etc/init.d/
rcS     rcS_GW
# cat /etc/init.d/rcS
#!/bin/sh
 
ifconfig lo 127.0.0.1
 
CINIT=1
 
hostname rlx-linux
 
mount -t proc proc /proc
mount -t ramfs ramfs /var
if [ -d "/hw_setting" ];then
    mount -t yaffs2 -o tags-ecc-off -o inband-tags /dev/mtdblock1 /hw_setting
fi
 
mkdir /var/tmp
mkdir /var/web
mkdir /var/log
mkdir /var/run
mkdir /var/lock
mkdir /var/system
mkdir /var/dnrd
mkdir /var/avahi
mkdir /var/dbus-1
mkdir /var/run/dbus
mkdir /var/lib
mkdir /var/lib/misc
mkdir /var/home
mkdir /var/root
mkdir /var/tmp/net
###for tr069
mkdir /var/cwmp_default
mkdir /var/cwmp_config
 
if [ ! -f /var/cwmp_default/DefaultCwmpNotify.txt ]; then
        cp -p /etc/DefaultCwmpNotify.txt /var/cwmp_default/DefaultCwmpNotify.txt 2>/dev/null
fi
##For miniigd
mkdir /var/linuxigd
cp /etc/tmp/pics* /var/linuxigd 2>/dev/null
 
##For pptp
mkdir /var/ppp
mkdir /var/ppp/peers
 
#smbd
mkdir /var/config
mkdir /var/private
mkdir /var/tmp/usb
 
#snmpd
mkdir /var/net-snmp
 
cp /bin/pppoe.sh /var/ppp/true
echo "#!/bin/sh" > /var/ppp/true
#echo "PASS"     >> /var/ppp/true
 
#for console login
cp /etc/shadow.sample /var/shadow
 
#for weave
cp /etc/avahi-daemon.conf /var/avahi
 
#extact web pages
cd /web
#flash extr /web
cd /
 
mkdir -p /var/udhcpc
mkdir -p /var/udhcpd
cp /bin/init.sh /var/udhcpc/eth0.deconfig
echo " " > /var/udhcpc/eth0.deconfig
cp /bin/init.sh /var/udhcpc/eth1.deconfig
echo " " > /var/udhcpc/eth1.deconfig
cp /bin/init.sh /var/udhcpc/br0.deconfig
echo " " > /var/udhcpc/br0.deconfig
cp /bin/init.sh /var/udhcpc/wlan0.deconfig
echo " " > /var/udhcpc/wlan0.deconfig
 
if [ "$CINIT" = 1 ]; then
startup.sh
fi
 
# for wapi certs related
mkdir /var/myca
# wapi cert(must done before init.sh)
cp -rf /usr/local/ssl/* /var/myca/ 2>/dev/null
# loadWapiFiles >/dev/null 2>&1
 
# for wireless client mode 802.1x
mkdir /var/1x
cp -rf /usr/1x/* /var/1x/ 2>/dev/null
mkdir /var/openvpn
cp -rf /usr/share/openvpn/* /var/openvpn 2>/dev/null
#---------------------------------------------------------------------------
SHARE_WIFI_DISABLE=`flash get WLAN1_VAP3_WLAN_DISABLED`
if [ "$SHARE_WIFI_DISABLE" = "WLAN1_VAP3_WLAN_DISABLED=0" ];then
        flash set WLAN1_VAP3_WLAN_DISABLED 1
fi
#---------------------------------------------------------------------------
# Start system script
init.sh gw all
 
# modify dst-cache setting
echo "24576" > /proc/sys/net/ipv4/route/max_size
echo "180" > /proc/sys/net/ipv4/route/gc_thresh
echo 20 > /proc/sys/net/ipv4/route/gc_elasticity
# echo 35 > /proc/sys/net/ipv4/route/gc_interval
# echo 60 > /proc/sys/net/ipv4/route/secret_interval
# echo 10 > /proc/sys/net/ipv4/route/gc_timeout
 
# echo "4096" > /proc/sys/net/nf_conntrack_max
echo "12288" > /proc/sys/net/netfilter/nf_conntrack_max
echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo "20" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
echo "20" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close
echo "90" > /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout
echo "120" > /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream
echo "90" > /proc/sys/net/ipv4/netfilter/ip_conntrack_generic_timeout
# echo "1048576" > /proc/sys/net/ipv4/rt_cache_rebuild_count
echo "32" > /proc/sys/net/netfilter/nf_conntrack_expect_max
 
# modify IRQ Affinity setting
echo "3" > /proc/irq/33/smp_affinity
 
#echo 1 > /proc/sys/net/ipv4/ip_forward #don't enable ip_forward before set MASQUERADE
#echo 2048 > /proc/sys/net/core/hot_list_length
 
# start web server
ls /bin/watchdog > /dev/null && watchdog 1000&
#boa
 
goahead &
 
#Turn off the power led of orange
echo "29" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio29/direction
echo "1" > /sys/class/gpio/gpio29/value
#Turn on the power led of green
echo "30" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio30/direction
echo "0" > /sys/class/gpio/gpio30/value
 
cp /etc/passwd_orig /var/passwd
cp /etc/group_orig /var/group
MODE=`flash get HW_FACTORY_MODE`
if [ "$MODE" = "HW_FACTORY_MODE=1" ];then
telnetd&
fi
#telnetd&
ifconfig wlan1-va3 down
speedcheck&
#wiair_client&
# cat /etc/init.d/rcS
#!/bin/sh
 
ifconfig lo 127.0.0.1
 
CINIT=1
 
hostname rlx-linux
 
mount -t proc proc /proc
mount -t ramfs ramfs /var
if [ -d "/hw_setting" ];then
    mount -t yaffs2 -o tags-ecc-off -o inband-tags /dev/mtdblock1 /hw_setting
fi
 
mkdir /var/tmp
mkdir /var/web
mkdir /var/log
mkdir /var/run
mkdir /var/lock
mkdir /var/system
mkdir /var/dnrd
mkdir /var/avahi
mkdir /var/dbus-1
mkdir /var/run/dbus
mkdir /var/lib
mkdir /var/lib/misc
mkdir /var/home
mkdir /var/root
mkdir /var/tmp/net
###for tr069
mkdir /var/cwmp_default
mkdir /var/cwmp_config
 
if [ ! -f /var/cwmp_default/DefaultCwmpNotify.txt ]; then
        cp -p /etc/DefaultCwmpNotify.txt /var/cwmp_default/DefaultCwmpNotify.txt 2>/dev/null
fi
##For miniigd
mkdir /var/linuxigd
cp /etc/tmp/pics* /var/linuxigd 2>/dev/null
 
##For pptp
mkdir /var/ppp
mkdir /var/ppp/peers
 
#smbd
mkdir /var/config
mkdir /var/private
mkdir /var/tmp/usb
 
#snmpd
mkdir /var/net-snmp
 
cp /bin/pppoe.sh /var/ppp/true
echo "#!/bin/sh" > /var/ppp/true
#echo "PASS"     >> /var/ppp/true
 
#for console login
cp /etc/shadow.sample /var/shadow
 
#for weave
cp /etc/avahi-daemon.conf /var/avahi
 
#extact web pages
cd /web
#flash extr /web
cd /
 
mkdir -p /var/udhcpc
mkdir -p /var/udhcpd
cp /bin/init.sh /var/udhcpc/eth0.deconfig
echo " " > /var/udhcpc/eth0.deconfig
cp /bin/init.sh /var/udhcpc/eth1.deconfig
echo " " > /var/udhcpc/eth1.deconfig
cp /bin/init.sh /var/udhcpc/br0.deconfig
echo " " > /var/udhcpc/br0.deconfig
cp /bin/init.sh /var/udhcpc/wlan0.deconfig
echo " " > /var/udhcpc/wlan0.deconfig
 
if [ "$CINIT" = 1 ]; then
startup.sh
fi
 
# for wapi certs related
mkdir /var/myca
# wapi cert(must done before init.sh)
cp -rf /usr/local/ssl/* /var/myca/ 2>/dev/null
# loadWapiFiles >/dev/null 2>&1
 
# for wireless client mode 802.1x
mkdir /var/1x
cp -rf /usr/1x/* /var/1x/ 2>/dev/null
mkdir /var/openvpn
cp -rf /usr/share/openvpn/* /var/openvpn 2>/dev/null
#---------------------------------------------------------------------------
SHARE_WIFI_DISABLE=`flash get WLAN1_VAP3_WLAN_DISABLED`
if [ "$SHARE_WIFI_DISABLE" = "WLAN1_VAP3_WLAN_DISABLED=0" ];then
        flash set WLAN1_VAP3_WLAN_DISABLED 1
fi
#---------------------------------------------------------------------------
# Start system script
init.sh gw all
 
# modify dst-cache setting
echo "24576" > /proc/sys/net/ipv4/route/max_size
echo "180" > /proc/sys/net/ipv4/route/gc_thresh
echo 20 > /proc/sys/net/ipv4/route/gc_elasticity
# echo 35 > /proc/sys/net/ipv4/route/gc_interval
# echo 60 > /proc/sys/net/ipv4/route/secret_interval
# echo 10 > /proc/sys/net/ipv4/route/gc_timeout
 
# echo "4096" > /proc/sys/net/nf_conntrack_max
echo "12288" > /proc/sys/net/netfilter/nf_conntrack_max
echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo "20" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
echo "20" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close
echo "90" > /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout
echo "120" > /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream
echo "90" > /proc/sys/net/ipv4/netfilter/ip_conntrack_generic_timeout

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-3-23 16:32 被LeaMov编辑 ,原因: 改错字
上传的附件:
收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 3352
活跃值: (30956)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2024-3-23 20:46
1
游客
登录 | 注册 方可回帖
返回
//