-
-
[原创] 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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!