年初部门应急了一个 Zyxel VPN
未授权 RCE
,本来想跟着复现一下漏洞,结果发现在 .bin
中无法提取文件系统,了解得知 .bin
文件是 ZIP
格式的固件映像受密码保护。 通过如下文章学习到了Zyxel固件解密方法[1],以此篇文章记录并说明踩过的坑。
Zyxel VPN Firewall 是⼀种⽹络安全设备,由 Zyxel 通信公司提供。它结合了防⽕墙和 VPN(Virtual Private Network,虚拟专⽤⽹络)功能,旨在保护企业⽹络免受未经授权的访问和恶意活动的威胁,并提供安全的远程访问解决⽅案。
解压 VPN100_V5.30(ABFV.0)C0.zip
尝试在 .bin
文件中提取文件系统,并没有提取出文件系统。
因为文件 530ABFV0C0.bin
是 ZIP
格式的固件映像受密码保护,也没有找到有关 Zyxel 使用密码的信息,但是固件一起的PDF
文章中有一段对 530ABFV0C0.ri
的描述如下:
大致翻译为 .ri
文件是一个二进制固件恢复映像文件,仅在系统固件损坏紧急情况下使用。如果正常的固件升级文件(.bin)不能使用,且系统无法启动,这个文件可以用于尝试恢复固件至可用状态。 由于 .ri
文件通常用于恢复损坏的固件,它可能包含完整的系统映像,所以尝试分析 .ri
文件。
尝试使用binwalk
提取 bin
同目录下 .ri
文件。
.ri
文件中提取出 240
和 240.7z
。
240.7z
为 240
文件的压缩包,所以继续提取 240
文件。
可以在提取到的 _240.extracted
文件夹下看到 zyinit
二进制文件,linux
常规的初始化启动进程就是init,所以将焦点放在了zyinit
。
参考文章中提到分析 zyinit
发现它启动了其他外部程序,特别是 zld_fsextract
程序( zld_fsextract
应该是固件的解密程序)。
分析一下 zyinit
如何启动 zld_fsextract
。搜索关键字 zld_fsextract
再进行交叉引用。
一个一个看看,sub_1000722C+64
地址内容如下
这段函数实现了调用 ./zld_fsextract
程序,并对解压和处理固件进行操作。这样的话是不是可以直接运行 zld_fsextract
程序进行固件解密,再分析一下 zld_fsextract
程序。
zld_fsextract
程序用法如下
再通过搜索关键字 extract
并交叉引用看看 -s
接收的参数都实现什么功能。
extract
、list
、model
等选项对应着命令行工具的不同操作模式,应该用于处理某种文件(例如 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
并运行。
//虚拟系统可能没有 vim
或 nano
,使用 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)
$ 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
-
bash: .
/
zyinit: cannot execute binary
file
-
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
被摆烂星君编辑
,原因: