本文为作者第一个分析的IOT设备命令注入漏洞,架构为MIPS(路由器设备印象中只有tenda和netgear为arm架构)。网上已经有一系列的复现文章,但在环境搭建、漏洞分析等方面存在不够深入,本文进一步深入分析漏洞函数的调用链旨在了解命令注入漏洞的一般原理,同时为新手入门调试IOT设备漏洞作参考。
2017.11.27 Check Point团队报告华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215),Mirai的升级版变种中已经使用该漏洞。该漏洞payload由蜜罐所捕获发现,利用原理是利用upnp服务中的注入漏洞实现任意命令执行。漏洞与/bin/mic下的37215端口有关系,该文件通过37215端口启动upnp协议(通用即插即用),之后调用了system()函数。因此可以向目标路由器通过此端口发送POST数据借此调用到system()函数,导致攻击者可以通过此数据包远程命令注入且执行,进而控制路由器。
可以看到固件和exp

qemu虚拟机无法正常启动,卡在这个界面

解决:更换实验主机为ubuntu 16.04(高版本的ubuntu无法正常启动qemu虚拟机,原因是制作 qemu 镜像的过程中,firmadyne 硬编码 loop 设备造成的,导致 loop 设备没有成功挂载到固件的根文件系统ae9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6D9K9i4W2S2L8Y4y4G2L8X3M7J5x3o6p5^5i4K6u0r3k6X3W2J5L8i4N6S2M7X3g2Q4x3X3c8S2L8X3q4D9P5i4y4A6M7#2)9J5k6s2m8D9N6i4y4Q4x3V1k6A6M7%4y4#2k6i4y4Q4x3V1j5@1x3l9`.`.
查看下载的exp,根据我们的配置修改目标主机的ip地址为192.168.10.2,
<NewStatusURL>;/bin/busybox ls;</NewStatusURL>标签为我们实现注入的地方,远程控制执行ls命令。
在主机中执行exp,可以看到成功实现利用,返回200响应代码,成功执行ls命令。

按照给定的环境和exp,我们可以成功实现利用,进一步通过分析报文了解漏洞的原理。首先,使用tcpdump进行抓包,抓取所有的经过tap0网卡的网络包,并存到result.cap 文件中。这里存在一个问题,qemu的网卡设备为tap0,是否可以按照普通网卡进行抓包?我们通过查阅资料,搞清了两者之间的区别和联系。
一言以蔽之,tap0网卡和eth0等物理网卡从底层实现看存在一定区别,但从上层看没有任何区别,直接使用tcpdump命令进行抓包。
使用wireshark打开抓到的cap包

可以看到exp发送的http请求和upnp服务返回的响应。

追踪http流,可以看到与我们构造的exp和得到的响应一致。除此之外,可以看出漏洞利用不需要进行用户登录之类的操作,利用过程极为简单。
漏洞利用的流程已经清楚,接下来我们进一步分析漏洞的原理,首先放出来Check Point Researchers的漏洞描述。

可以看到,ControlURL为/ctrlt/DeciveUpgrade_1,通信端口为37215,通过grep -r [keywords]指令查看有哪些文件包含这两个词语和端口

由此可知,实现漏洞利用的前提条件为运行upnp和mic二进制文件
下一步我们分析,发送的url如何处理并最终我们的命令。
由于IDA pro反汇编出来不是很清晰,有些符号表和函数是没有的,所以这里使用Ghidra来看伪代码更加清晰。
首先,通过字符串搜索,查找ctrlt的引用


UpnpGetServiceByUrl应该就是处理URL的函数
查找‘NewStatusURL’字符串

右键跳转到调用字符串的地方,找到关键的伪代码

可以看到,一个snprintf函数后面跟一个system函数即可以成功实现命令注入。
参考链接:
4b4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8W2A6J5K9i4m8W2L8W2W2W2i4K6u0r3j5i4u0@1K9h3y4D9k6g2)9J5c8X3c8W2N6r3q4A6L8s2y4Q4x3V1j5I4x3U0t1I4x3e0x3J5x3o6g2Q4x3@1k6K6M7r3#2Q4x3@1b7I4x3o6l9I4i4K6u0W2x3U0p5H3x3g2)9J5k6e0x3H3x3o6q4Q4x3X3f1$3y4U0f1H3i4K6u0W2x3g2)9J5y4X3q4E0M7q4)9K6b7Y4g2@1L8g2)9#2k6X3#2W2k6r3W2#2L8g2)9K6c8r3c8A6M7%4c8J5K9h3u0#2N6r3g2Q4x3X3g2H3j5#2)9#2k6Y4u0W2L8r3g2$3j5h3&6@1i4K6u0W2L8X3!0F1k6g2)9J5k6s2c8S2M7$3E0Q4x3X3c8T1L8r3!0Y4i4K6u0V1x3W2)9J5y4e0N6q4k6r3g2X3j5i4g2D9N6q4)9J5y4e0N6q4b7#2c8d9e0p5W2e0g2q4)9J5y4e0N6q4f1X3q4@1k6g2)9J5k6o6q4Q4x3X3b7I4x3U0t1I4x3e0x3J5x3o6g2Q4x3X3c8T1L8r3!0Y4i4K6u0V1x3e0p5%4x3K6t1I4y4K6j5#2i4K6u0W2M7r3y4Q4y4h3k6J5k6h3I4W2N6X3q4F1N6q4)9#2k6X3#2#2L8s2c8A6i4K6g2X3M7r3I4S2N6r3k6G2M7X3#2Q4y4h3k6%4K9r3W2@1k6h3I4A6M7%4c8$3x3#2)9J5y4X3q4E0M7q4)9K6b7X3c8W2M7s2c8Z5i4K6g2X3x3g2)9J5k6s2g2@1L8g2)9#2k6Y4y4G2N6i4u0U0k6g2)9K6c8r3c8A6M7%4c8J5K9h3u0#2N6r3g2Q4x3X3g2H3j5#2)9#2k6Y4u0W2L8r3g2$3j5h3&6@1i4K6u0W2L8X3!0F1k6g2)9J5k6s2c8S2M7$3E0Q4x3X3c8T1L8r3!0Y4i4K6u0V1x3W2)9J5y4e0N6q4k6r3g2X3j5i4g2D9N6q4)9J5y4e0N6q4b7#2c8d9e0p5W2e0g2q4)9J5y4e0N6q4f1X3q4@1k6g2)9J5k6o6q4Q4x3X3b7I4x3U0t1I4x3e0x3J5x3o6g2Q4x3X3c8T1L8r3!0Y4i4K6u0V1x3e0p5%4x3K6t1I4y4K6j5#2i4K6u0W2M7r3y4Q4y4h3k6J5k6h3I4W2N6X3q4F1N6q4)9#2k6X3#2#2L8s2c8A6i4K6g2X3M7r3I4S2N6r3k6G2M7X3#2Q4y4h3k6%4K9r3W2@1k6h3I4A6M7%4c8$3x3#2)9J5y4X3q4E0M7q4)9K6b7Y4g2@1L8g2)9#2k6Y4u0W2L8r3g2$3j5h3&6@1i4K6g2X3K9h3&6V1k6i4S2Q4x3@1b7I4
730K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8%4g2Y4j5i4u0Q4x3X3g2C8K9h3#2Q4x3V1k6H3L8%4y4@1M7#2)9J5c8X3y4$3k6g2)9J5k6o6t1H3x3e0N6Q4x3X3b7I4y4K6t1I4y4g2)9#2k6X3q4F1j5h3I4&6M7$3g2Q4x3V1j5`.
96fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3k6r3g2W2M7V1y4G2k6r3g2Q4x3V1k6H3i4K6u0r3x3e0p5&6x3e0V1$3x3e0u0Q4x3X3g2Z5N6r3#2D9
git clone https:
/
/
gitee.com
/
p1piyang
/
backward
-
analysis
cd backward
-
analysis
/
CVE
-
2017
-
17215
git clone https:
/
/
gitee.com
/
p1piyang
/
backward
-
analysis
cd backward
-
analysis
/
CVE
-
2017
-
17215
apt install binwalk
binwalk
-
Me HG532eV100R001C01B020_upgrade_packet.
bin
apt install binwalk
binwalk
-
Me HG532eV100R001C01B020_upgrade_packet.
bin
sudo apt
-
get install qemu
sudo apt
-
get install qemu binfmt
-
support qemu
-
user
-
static
wget https:
/
/
people.debian.org
/
~aurel32
/
qemu
/
mips
/
debian_squeeze_mips_standard.qcow2
wget https:
/
/
people.debian.org
/
~aurel32
/
qemu
/
mips
/
vmlinux
-
2.6
.
32
-
5
-
4kc
-
malta
sudo apt
-
get install bridge
-
utils
sudo brctl addbr Virbr0
sudo ifconfig Virbr0
192.168
.
10.1
/
24
up
sudo apt install uml
-
utilities
sudo tunctl
-
t tap0
sudo ifconfig tap0
192.168
.
10.11
/
24
up
sudo brctl addif Virbr0 tap0
apt install qemu
-
system
-
mips
sudo qemu
-
system
-
mips
-
M malta
-
kernel vmlinux
-
2.6
.
32
-
5
-
4kc
-
malta
-
hda debian_squeeze_mips_standard.qcow2
-
append
"root=/dev/sda1 console=tty0"
-
netdev tap,
id
=
tapnet,ifname
=
tap0,script
=
no
-
device rtl8139,netdev
=
tapnet
-
nographic
ifconfig eth0
192.168
.
10.2
/
24
up
ping
192.168
.
10.1
-
c
10
scp
-
r squashfs
-
root
/
root@
192.168
.
10.2
:~
/
mount
-
o bind
/
dev .
/
squashfs
-
root
/
dev
mount
-
t proc
/
proc .
/
squashfs
-
root
/
proc
ssh root@
192.168
.
10.2
chroot squashfs
-
root
/
bin
/
sh
.
/
bin
/
upnp
.
/
bin
/
mic
ifconfig eth0
192.168
.
10.2
/
24
up
ifconfig br0
192.168
.
10.11
/
24
up
至此,环境搭建成功,存在漏洞的服务已经启动
sudo apt
-
get install qemu
sudo apt
-
get install qemu binfmt
-
support qemu
-
user
-
static
wget https:
/
/
people.debian.org
/
~aurel32
/
qemu
/
mips
/
debian_squeeze_mips_standard.qcow2
wget https:
/
/
people.debian.org
/
~aurel32
/
qemu
/
mips
/
vmlinux
-
2.6
.
32
-
5
-
4kc
-
malta
sudo apt
-
get install bridge
-
utils
sudo brctl addbr Virbr0
sudo ifconfig Virbr0
192.168
.
10.1
/
24
up
sudo apt install uml
-
utilities
sudo tunctl
-
t tap0
sudo ifconfig tap0
192.168
.
10.11
/
24
up
sudo brctl addif Virbr0 tap0
apt install qemu
-
system
-
mips
sudo qemu
-
system
-
mips
-
M malta
-
kernel vmlinux
-
2.6
.
32
-
5
-
4kc
-
malta
-
hda debian_squeeze_mips_standard.qcow2
-
append
"root=/dev/sda1 console=tty0"
-
netdev tap,
id
=
tapnet,ifname
=
tap0,script
=
no
-
device rtl8139,netdev
=
tapnet
-
nographic
ifconfig eth0
192.168
.
10.2
/
24
up
ping
192.168
.
10.1
-
c
10
scp
-
r squashfs
-
root
/
root@
192.168
.
10.2
:~
/
mount
-
o bind
/
dev .
/
squashfs
-
root
/
dev
mount
-
t proc
/
proc .
/
squashfs
-
root
/
proc
ssh root@
192.168
.
10.2
chroot squashfs
-
root
/
bin
/
sh
.
/
bin
/
upnp
.
/
bin
/
mic
ifconfig eth0
192.168
.
10.2
/
24
up
[注意]看雪招聘,专注安全领域的专业人才平台!