首页
社区
课程
招聘
[原创]Zyxel设备固件提取
发表于: 2024-9-26 14:08 8183

[原创]Zyxel设备固件提取

2024-9-26 14:08
8183

年初部门应急了一个 Zyxel VPN 未授权 RCE ,本来想跟着复现一下漏洞,结果发现在 .bin 中无法提取文件系统,了解得知 .bin 文件是 ZIP 格式的固件映像受密码保护。 通过如下文章学习到了Zyxel固件解密方法[1],以此篇文章记录并说明踩过的坑。
Zyxel VPN Firewall 是⼀种⽹络安全设备,由 Zyxel 通信公司提供。它结合了防⽕墙和 VPN(Virtual Private Network,虚拟专⽤⽹络)功能,旨在保护企业⽹络免受未经授权的访问和恶意活动的威胁,并提供安全的远程访问解决⽅案。

解压 VPN100_V5.30(ABFV.0)C0.zip
解压VPN100_5.30压缩文件
尝试在 .bin 文件中提取文件系统,并没有提取出文件系统。

因为文件 530ABFV0C0.binZIP 格式的固件映像受密码保护,也没有找到有关 Zyxel 使用密码的信息,但是固件一起的PDF文章中有一段对 530ABFV0C0.ri 的描述如下:
530ABFV0C0.ri作用描述
大致翻译为 .ri文件是一个二进制固件恢复映像文件,仅在系统固件损坏紧急情况下使用。如果正常的固件升级文件(.bin)不能使用,且系统无法启动,这个文件可以用于尝试恢复固件至可用状态。 由于 .ri 文件通常用于恢复损坏的固件,它可能包含完整的系统映像,所以尝试分析 .ri 文件。

尝试使用binwalk提取 bin 同目录下 .ri 文件。

binwalk提权.ri文件
.ri 文件中提取出 240240.7z
ri文件中提取出240和240.zip
240.7z240 文件的压缩包,所以继续提取 240 文件。

binwalk提权240文件
可以在提取到的 _240.extracted 文件夹下看到 zyinit 二进制文件,linux 常规的初始化启动进程就是init,所以将焦点放在了zyinit
240文件提取内容
参考文章中提到分析 zyinit 发现它启动了其他外部程序,特别是 zld_fsextract 程序( zld_fsextract 应该是固件的解密程序)。

分析一下 zyinit 如何启动 zld_fsextract 。搜索关键字 zld_fsextract 再进行交叉引用。


一个一个看看,sub_1000722C+64 地址内容如下

这段函数实现了调用 ./zld_fsextract 程序,并对解压和处理固件进行操作。这样的话是不是可以直接运行 zld_fsextract 程序进行固件解密,再分析一下 zld_fsextract 程序。

zld_fsextract 程序用法如下

再通过搜索关键字 extract 并交叉引用看看 -s 接收的参数都实现什么功能。


extractlistmodel 等选项对应着命令行工具的不同操作模式,应该用于处理某种文件(例如 ZIP 文件)或配置。(例如extract为提取模式,list为列表模式)。

现在可以尝试模拟MIPS环境执行二进制文件尝试提取文件了。

先来判断一下需要模拟什么环境,这里 N32 有一个比较大的坑。

通过判断 zld_fsextract 文件类型, 一开始使用 qemu-system-mips 内核镜像选择 vmlinux-3.2.0-4-5kc-malta 结果环境启动不了。第二次换内核镜像为 vmlinux-2.6.32-5-4kc-malta 环境成功启动,但是运行 zld_fsextract 报错不兼容。

分析得知 N32 是用在32位和64位 MIPS处理器上的一种中间形式[2],它允许使用64位寄存器和内存寻址,但保持了32位数据模型,这样可以减少由于64位数据类型较大而带来的性能和内存使用上的开销。所以需要选择支持N32 ABI的MIPS64架构的模拟器来运行。

准备文件系统和内核镜像

启动模拟环境

启动后用户名和密码都是root即可登录模拟系统

接下来在宿主机创建一个网卡,是 qemu 内能和宿主机通信。

宿主机安装依赖

将如下代码保存为 net.sh 并运行即可

然后配置 qemu 虚拟系统的路由,在 qemu 虚拟系统运行如下 net.sh 并运行。

//虚拟系统可能没有 vimnano,使用 echo 一行一行写。

这样宿主机和模拟环境就可以网络互通了。

将刚才问题分析时宿主机上整个文件夹上传到 qemu 系统

这样就可以在虚拟机使用 zld_fsextract 二进制文件获取固件映像信息了,记得将 530ABFV0C0.bin 移动到 zld_fsextract 同目录下。

通过 ./zld_fsextract 530ABFV0C0.bin -s list 输出信息结合前文 zyinit 程序中获取到信息,使用 zld_fsextract 程序提取固件。

这时会在 /rw/ 路径下生成 compress.img ,将这个文件传输到宿主机使用 binwalk 提取即可得到 squashfs-root 文件系统。

这里是宿主机提取 compress.img 得到 squashfs-root 截图。
镜像中提取出文件系统
拿到固件就可以开开心心进行漏洞复现和分析啦。

参考文章中不仅讲到了固件提取,还进行了密码分析。读者如果感兴趣可以跟着继续深度学习,这里只是将实操过程中的步骤进行更详细的展示,也是一次学习过程的笔记记录。

[1] Zyxel固件提取和密码分析

Zyxel固件提取和密码分析 - hn security (humanativaspa.it)

[2] MIPS ABI n32意味着什么?

MIPS ABI n32意味着什么? - Trunk.Woo - 博客园 (cnblogs.com)

固件版本 VPN100_V5.30(ABFV)
固件版本 VPN100_V5.30(ABFV)
$ binwalk -e 530ABFV0C0.bin
$ cd _530ABFV0C0.bin.extracted/
$ ls
0.zip         etc_writable  fwversion         wtp_image
compress.img  filechecksum  kernelchecksum    wtpinfo
db            filelist      kernelvpn100.bin
$ binwalk -e 530ABFV0C0.bin
$ cd _530ABFV0C0.bin.extracted/
$ ls
0.zip         etc_writable  fwversion         wtp_image
compress.img  filechecksum  kernelchecksum    wtpinfo
db            filelist      kernelvpn100.bin
$ binwalk -e 530ABFV0C0.ri
$ binwalk -e 530ABFV0C0.ri
$ cd _530ABFV0C0.ri.extracted/
$ binwalk -e 240
$ cd _530ABFV0C0.ri.extracted/
$ binwalk -e 240
/zyinit/zld_fsextract /zyinit/zld_fsextract /tmp/Firmware /zyinit/unzip -s extract -e code
/zyinit/zld_fsextract /zyinit/zld_fsextract /tmp/Firmware /zyinit/unzip -s extract -e code
$ file zld_fsextract
zld_fsextract: ELF 32-bit MSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), statically linked, stripped
$ file zld_fsextract
zld_fsextract: ELF 32-bit MSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), statically linked, stripped
# ./zyinit
-bash: ./zyinit: cannot execute binary file
# ./zyinit
-bash: ./zyinit: cannot execute binary file
vmlinux-2.6.32-5-5kc-malta  内核镜像
debian_squeeze_mips_standard.qcow2  文件系统
vmlinux-2.6.32-5-5kc-malta  内核镜像
debian_squeeze_mips_standard.qcow2  文件系统
$ qemu-system-mips64 -M malta -kernel vmlinux-2.6.32-5-5kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
$ qemu-system-mips64 -M malta -kernel vmlinux-2.6.32-5-5kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
$ sudo apt-get install bridge-utils uml-utilities
$ sudo apt-get install bridge-utils uml-utilities
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tap0 -j ACCEPT
sudo iptables -I FORWARD 1 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo ifconfig tap0 192.168.100.254 netmask 255.255.255.0
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2024-9-26 14:11 被摆烂星君编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 3262
活跃值: (5494)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习了,看下私信,加个好友,有时间可以交流下!
2024-9-26 14:42
0
雪    币: 28
活跃值: (155)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
涨姿势了!
2024-9-27 16:21
0
雪    币: 220
活跃值: (99)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
牛逼呀
2024-10-14 18:30
0
雪    币: 7
活跃值: (379)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享,很有启发性
2024-11-21 15:39
0
游客
登录 | 注册 方可回帖
返回
//