首页
社区
课程
招聘
[原创]华为HG532路由器命令注入漏洞分析(CVE-2017-17215)
发表于: 2022-10-13 22:03 23987

[原创]华为HG532路由器命令注入漏洞分析(CVE-2017-17215)

2022-10-13 22:03
23987

本文为作者第一个分析的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
binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin
apt install binwalk     #需要提前安装binwalk
binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin
#下载qemu虚拟机
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
 
#创建tap接口,添加到网桥
sudo apt install uml-utilities
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.10.11/24 up
sudo brctl addif Virbr0 tap0
 
#启动qemu虚拟机,账号密码都为root
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
 
#进入虚拟机后,配置ip地址,测试与主机的连通性
ifconfig eth0 192.168.10.2/24 up
ping 192.168.10.1 -c 10
 
#回到主机中将squashfs-root文件夹复制到虚拟机
scp -r squashfs-root/ root@192.168.10.2:~/
 
#挂载
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc
 
#虚拟机速度过慢,回到主机通过ssh远程连接虚拟机,执行漏洞程序
ssh root@192.168.10.2
chroot squashfs-root /bin/sh
./bin/upnp
./bin/mic
 
#此时的虚拟机的路由IP已经发生了变化,ssh已经断开了,所以需要返回虚拟机的终端进行更改IP地址
ifconfig eth0 192.168.10.2/24 up
ifconfig br0 192.168.10.11/24 up
 
至此,环境搭建成功,存在漏洞的服务已经启动
#下载qemu虚拟机
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
 
#创建tap接口,添加到网桥
sudo apt install uml-utilities
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.10.11/24 up
sudo brctl addif Virbr0 tap0
 
#启动qemu虚拟机,账号密码都为root
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
 
#进入虚拟机后,配置ip地址,测试与主机的连通性
ifconfig eth0 192.168.10.2/24 up
ping 192.168.10.1 -c 10
 
#回到主机中将squashfs-root文件夹复制到虚拟机
scp -r squashfs-root/ root@192.168.10.2:~/
 
#挂载
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc
 
#虚拟机速度过慢,回到主机通过ssh远程连接虚拟机,执行漏洞程序
ssh root@192.168.10.2
chroot squashfs-root /bin/sh
./bin/upnp
./bin/mic
 
#此时的虚拟机的路由IP已经发生了变化,ssh已经断开了,所以需要返回虚拟机的终端进行更改IP地址
ifconfig eth0 192.168.10.2/24 up

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 8
支持
分享
打赏 + 100.00雪花
打赏次数 1 雪花 + 100.00
 
赞赏  Editor   +100.00 2022/10/26 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (2)
雪    币: 319
活跃值: (372)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
吾观此文,犹如池鱼观滔滔江水,初看即赞不绝口,细看甚为震撼,故曰:“此乃好文也!”已学习,谢谢楼主
2022-10-14 23:40
0
雪    币: 205
活跃值: (173)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请问POC里面  headers和data的内容是怎么写出来的
2022-10-25 15:07
0
游客
登录 | 注册 方可回帖
返回