★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
近日 Rapid7 发现并报告了 CVE-2022-30525 Zyxel ZTP RCE 漏洞,该漏洞影响支持零接触配置 (ZTP) 的 Zyxel 防火墙,其中包括 ATP 系列、VPN 系列和 USG FLEX 系列。允许未经身份验证的远程攻击者以 nobody 受影响设备上的用户身份执行任意代码。
利用代码网上已经公开了,这里就不过多赘述了。下面给各位小伙伴分享下自己对 Zyxel 固件破解到漏洞原理分析,以及配置文件密码破解的过程。
从官网选择下载 Zyxel USG FLEX 100 v5.30 和 v5.21 两个版本。解压固件,包含一个 `.bin` 主文件,一个 `.ri` 文件和两个 `.pdf` 文件:
其中 `.bin` 、 `.db` 文件使用 `binwalk` 无法解压获取linux目录, `binwalk -Me 521ABUH1C0.ri` 文件解压后可以看到 `zyinit` 目录:
注意到其中有一个 `zld_fsextrct` 文件,使用的是 `MIPS` 架构:
经过测试可使用 `qemu-mipsn32-static` 执行:
使用如下命令可以看到支持的选项:
使用 `extract` 选项解压,提示 `Exec format error` ,原因是 `binwalk` 解压后 `unzip` 格式为 `mips` 指令集:
尝试使用 `strace` 来监视 `unzip` 请求,注意到执行 `unzip` 命令时包含了一个固定密码:
尝试利用该密码解压 521ABUH1C0.bin 文件:
继续利用 `binwalk -e compress.img` 提取文件目录:
先看一下环境情况, `/usr/local/zyxel-gui` 为配置界面服务,使用 Apache 启动,端口为 443:
可以看到配置文件添加了 `.py` 类型 cgi 映射:
`ZTP` 模块位于 `/htdocs/ztp/cgi-bin` 目录:
`handler.py` 中引用 `liib_wan_settings.py` :
支持 `setWanPortSt` 和 `getWanPortSt` 操作:
从请求中获取 `command` 的值并进行调用相应函数,其中并没有进行权限检查:
提取 5.21 和 5.30 固件后进行补丁对比,漏洞文件出现在 `lib_wan_settings.py` 下的 `setWanPortSt` 函数。当 `proto` 为 `pppoe` 时, `req[mtu]` 的值直接传入 `cmdLine` 并进行 `os.system` 调用:
修补后调用为 `subprocess.call` ,且进行 `shlex.split` 检查:
通过上面的分析,很容易构造出利用过程了,网上放出了很多 POC ,这里就不重复了。
拿下权限后,可以尝试分析配置文件。用户配置文件存储于 `__system_default.xml` 中:
密码示例为 `$4$*` ,可以被解密还原:
某些老设备可能还存在 CVE-2020-29583 后门漏洞,可使用后门密码登录 ftp 21 端口。
有兴趣获取完整分析工具和漏洞分析过程的小伙伴,请加入我们的漏洞空间站-致力于打造优质漏洞资源和小伙伴聚集地!
由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。
★且听安全★-点关注,不迷路!
★漏洞空间站★-优质漏洞资源和小伙伴聚集地!
原文始发于微信公众号(且听安全):漏洞空间站上线啦!CVE-2022-30525 Zyxel ZTP RCE 从固件破解到漏洞分析再到密码破解