Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >原创 Paper | 探秘 Zyxel 设备:固件提取分析

原创 Paper | 探秘 Zyxel 设备:固件提取分析

作者头像
Seebug漏洞平台
发布于 2024-04-10 06:13:38
发布于 2024-04-10 06:13:38
51200
代码可运行
举报
文章被收录于专栏:Seebug漏洞平台Seebug漏洞平台
运行总次数:0
代码可运行

作者:fan@知道创宇404实验室

时间:2024年3月27日

1 前言

参考资料

部门近期应急了一个 Zyxel VPN 未授权 RCE,在尝试进行漏洞复现的过程中,发现在 .bin 中无法提取文件系统,了解得知 .bin文件是 ZIP 格式的固件映像受密码保护。通过如下文章学习到了Zyxel固件解密方法[1],以此篇文章记录并说明踩过的坑。

Zyxel VPN Firewall 是一种网络安全设备,由 Zyxel 通信公司提供。它结合了防火墙和 VPN(Virtual Private Network,虚拟专用网络)功能,旨在保护企业⽹络免受未经授权的访问和恶意活动的威胁,并提供安全的远程访问解决⽅案。

2 固件提取

参考资料

2.1 问题分析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
固件版本 VPN100_V5.30(ABFV)

解压 VPN100_V5.30(ABFV.0)C0.zip

图2-1 解压VPN100_5.30压缩文件

尝试在 .bin文件中提取文件系统,并没有提取出文件系统。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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

因为文件 530ABFV0C0.bin 是 ZIP 格式的固件映像受密码保护,也没有找到有关 Zyxel 使用密码的信息,但是固件一起的PDF文章中有一段对 530ABFV0C0.ri 的描述如下:

图2-2 530ABFV0C0.ri作用描述

大致翻译为.ri文件是一个二进制固件恢复映像文件,仅在系统固件损坏紧急情况下使用。如果正常的固件升级文件(.bin)不能使用,且系统无法启动,这个文件可以用于尝试恢复固件至可用状态。由于.ri文件通常用于恢复损坏的固件,它可能包含完整的系统映像,所以尝试分析 .ri 文件。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ binwalk -e 530ABFV0C0.ri

图2-3 binwalk提权.ri文件

ri 文件中提取出 240 和 240.7z。

图2-4 ri文件中提取出240和240.zip

240.7z 为 240 文件的压缩包,所以继续提取 240 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cd _530ABFV0C0.ri.extracted/
$ binwalk -e 240

图2-5 binwalk提权240文件

可以在提取到的 _240.extracted 文件夹下看到 zyinit 二进制文件,linux 常规的初始化启动进程就是init,所以将焦点放在了zyinit。

图2-6 240文件提取内容

参考文章中提到分析 zyinit 发现它启动了其他外部命令,特别是 zld_fsextract 命令。

zld_fsextract 二进制文件中搜索密码,有很多很好的分析点,这里就不多赘述感兴趣可以自行跟进。发现 unzip 二进制文件使用这些选项来解压缩具有特定密码的文件,该密码在参数-P中定义。根据在线找到的信息并进行快速分析,二进制文件似乎根据二进制文件名称或二进制文件内容以某种方式计算解压缩密码。所以不需要密码, zld_fsextract 使用 unzip 即可拿到镜像文件。

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

2.2 QEMU 模拟

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ file zld_fsextract 
zld_fsextract: ELF 32-bit MSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), statically linked, stripped

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ./zyinit
-bash: ./zyinit: cannot execute binary file

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

准备文件系统和内核镜像:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vmlinux-2.6.32-5-5kc-malta  内核镜像
debian_squeeze_mips_standard.qcow2  文件系统

启动模拟环境:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ 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

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

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

宿主机安装依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo apt-get install bridge-utils uml-utilities

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/sh
ifconfig eth0 192.168.100.2 netmask 255.255.255.0
route add default gw 192.168.100.254

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

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

2.3 QEMU 固件提取

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ scp -r VPN100/ root@192.168.100.2:VPN100

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cp 530ABFV0C0.bin _530ABFV0C0.ri.extracted/_240.extracted/
# cd _530ABFV0C0.ri.extracted/_240.extracted/
# ./zld_fsextract 530ABFV0C0.bin -s list

使用 zld_fsextract 二进制文件提取固件且无需指定密码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ./zld_fsextract 530ABFV0C0.bin ./unzip -s extract -e code

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ls -al /rw/
total 94480
drwxr-xr-x  3 root root     4096 Mar 19 07:58 .
drwxr-xr-x 23 root root     4096 Mar 19 07:59 ..
-r--r--r--  1 root root 96575488 Apr 19  2022 compress.img
drwxr-xr-x  6 root root     4096 Apr 19  2022 etc_writable
-rw-r--r--  1 root root      139 Apr 19  2022 filechecksum
-rw-r--r--  1 root root    35655 Apr 19  2022 filelist
-rw-r--r--  1 root root      327 Apr 19  2022 fwversion
-rw-r--r--  1 root root     8375 Apr 19  2022 wtpinfo

这里是宿主机提取 compress.img 得到 squashfs-root 截图。

图2-7 镜像中提取出文件系统

拿到固件就可以开开心心进行漏洞复现和分析啦。

2.4 总结

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

3 参考链接

参考资学完了前面三个程序后,可以说已经入门了单片机开发,能进行以下几种基础操作:控制端口输出,编写中断函数,通过uart口输出调试信息。

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

https://security.humanativaspa.it/zyxel-firmware-extraction-and-password-analysis/

[2] MIPS ABI n32意味着什么

https://www.cnblogs.com/yorkwoo/p/4709772.html

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Seebug漏洞平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
强化学习从基础到进阶-案例与实践4.2:深度Q网络DQN-Cart pole游戏展示
比如本项目的Cart pole小游戏中,agent就是动图中的杆子,杆子有向左向右两种action。
汀丶人工智能
2023/06/30
3800
coach 模块化最好的强化学习框架
add agent http://coach.nervanasys.com/contributing/add_agent/index.html class Agent(object): class PolicyOptimizationAgent(Agent): class ActorCriticAgent(PolicyOptimizationAgent): presets.py class Carla_A3C(Preset): def __init__(self): Preset._
CreateAMind
2018/07/20
4900
强化学习反馈稀疏问题-HindSight Experience Replay原理及实现!
在强化学习中,反馈稀疏是一个比较常见同时令人头疼的问题。因为我们大部分情况下都无法得到有效的反馈,模型难以得到有效的学习。为了解决反馈稀疏的问题,一种常用的做法是为Agent增加一些内在的目标使反馈变的不再稀疏。
石晓文
2018/12/27
2K0
使用PyTorch Lightning构建轻量化强化学习DQN(附完整源码)
本文旨在探究将PyTorch Lightning应用于激动人心的强化学习(RL)领域。在这里,我们将使用经典的倒立摆gym环境来构建一个标准的深度Q网络(DQN)模型,以说明如何开始使用Lightning来构建RL模型。
deephub
2020/05/09
1.9K0
使用PyTorch Lightning构建轻量化强化学习DQN(附完整源码)
【深度强化学习】DQN训练超级玛丽闯关
上一期 MyEncyclopedia公众号文章 通过代码学Sutton强化学习:从Q-Learning 演化到 DQN,我们从原理上讲解了DQN算法,这一期,让我们通过代码来实现DQN 在任天堂经典的超级玛丽游戏中的自动通关吧。本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
黄博的机器学习圈子
2020/12/11
1.4K0
【深度强化学习】DQN训练超级玛丽闯关
强化学习Double DQN方法玩雅达利Breakout游戏完整实现代码与评估pytorch
Breakout是一款经典的雅达利游戏,也就是我们所熟知的“打砖块”。玩家需要左右移动在屏幕下方的短平板子将一颗不断弹跳的小球反弹回屏幕上方,使其将一块块矩形砖块组成的六行砖块墙面打碎,并防止小球从屏幕底部掉落。在Atari 2600版本的Breakout中,玩家共有5次小球掉落机会,一旦用完就标志游戏结束,每打掉一块砖块得1分,全部打掉则游戏胜利结束。
Ranlychan
2024/01/10
1K0
教程 | 深度强化学习入门:用TensorFlow构建你的第一个游戏AI
选自freeCodeCamp 机器之心编译 参与:陈韵竹、刘晓坤 本文通过一种简单的 Catch 游戏介绍了深度强化学习的基本原理,并给出了完整的以 Keras 为前端的 TensorFlow 代码实现,是入门深度强化学习的不错选择。 GitHub 链接:https://github.com/JannesKlaas/sometimes_deep_sometimes_learning/blob/master/reinforcement.ipynb 去年,DeepMind 的 AlphaGo 以 4-1 的比
机器之心
2018/05/10
1.4K0
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
深度Q网络(DQN)是深度强化学习的核心算法之一,由Google DeepMind在2015年的论文《Playing Atari with Deep Reinforcement Learning》中提出。DQN通过结合深度学习和强化学习,利用神经网络近似Q值函数,在高维、连续状态空间的环境中表现出了强大的能力。
不去幼儿园
2024/12/03
3130
【RL Base】强化学习核心算法:深度Q网络(DQN)算法
TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
本文中我们将一起创建一个深度Q网络(DQN)。它基于我们系列文章中(0)的单层Q网络,如果你是强化学习的初学者,我推荐你到文末跳转到(0)开始阅读。尽管简单的Q网路已经可以在简单的问题上和Q表表现一样出色,但是深度Q网络可以使其变得更强。要将简单的Q网络转化为深度Q网路,我们需要以下改进:
ArrayZoneYour
2018/03/01
8K1
TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
30分钟吃掉DQN算法
表格型方法存储的状态数量有限,当面对围棋或机器人控制这类有数不清的状态的环境时,表格型方法在存储和查找效率上都受局限,DQN的提出解决了这一局限,使用神经网络来近似替代Q表格。
lyhue1991
2023/09/05
2790
30分钟吃掉DQN算法
【强化学习】Double DQN(Double Deep Q-Network)算法
强化学习中的深度Q网络(DQN)是一种将深度学习与Q学习结合的算法,它通过神经网络逼近Q函数以解决复杂的高维状态问题。然而,DQN存在过估计问题(Overestimation Bias),即在更新Q值时,由于同时使用同一个网络选择动作和计算目标Q值,可能导致Q值的估计偏高。
不去幼儿园
2025/01/08
1.5K0
【强化学习】Double DQN(Double Deep Q-Network)算法
深度强化学习 | DQN训练超级玛丽闯关
本系列将延续通过代码学Sutton 强化学习系列,逐步通过代码实现经典深度强化学习应用在各种游戏环境中。本文所有代码在
NewBeeNLP
2021/03/03
1.5K0
深度强化学习 | DQN训练超级玛丽闯关
详解深度强化学习展现TensorFlow 2.0新特性
自TensorFlow官方发布其2.0版本新性能以来,不少人可能对此会有些许困惑。因此博主Roman Ring写了一篇概述性的文章,通过实现深度强化学习算法来具体的展示了TensorFlow 2.0的特性。
刀刀老高
2019/05/15
6750
详解深度强化学习展现TensorFlow 2.0新特性
【机器学习】机器学习重要分支——强化学习:从理论到实践
强化学习(Reinforcement Learning, RL)作为机器学习的重要分支之一,通过与环境交互、试错学习来优化决策策略,已在机器人控制、游戏AI、自动驾驶等领域展现出巨大的潜力。本文将深入探讨强化学习的基本原理、核心算法及其在实际中的应用,并提供代码示例和图表以帮助读者更好地理解和掌握这一技术。
E绵绵
2024/06/17
1.2K0
用强化学习通关超级马里奥!
作为强化学习(Reinforce Learning,RL)的初学者,常常想将RL的理论应用于实际环境,以超级马里奥为例,当看着自己训练的AI逐渐适应环境,得分越来越高,到最后能完美躲避所有障碍,快速通关时,你肯定能体会到算法的魅力,成就感十足!本文不拘泥于DQN(Deep Q Learning Network)算法的深层原理,主要从代码实现的角度,为大家简洁直白的介绍DQN以及其改进方法,接着,基于Pytorch官方强化学习教程,应用改进后的DQN算法训练超级马里奥,并得到更为优秀的结果。
Datawhale
2022/05/29
8100
用强化学习通关超级马里奥!
Python 强化学习实用指南:6~10
在前面的章节中,我们学习了强化学习(RL)的基本概念和几种 RL 算法,以及如何将 RL 问题建模为马尔可夫决策过程(MDP)。 我们还看到了用于解决 MDP 的不同的基于模型和无模型的算法。 在本章中,我们将看到 RL 中的经典问题之一,称为多臂老虎机(MAB)问题。 我们将看到什么是 MAB 问题,以及如何使用不同的算法解决该问题,然后了解如何使用 MAB 识别将接收大部分点击的正确广告横幅。 我们还将学习广泛用于构建推荐系统的上下文老虎机。
ApacheCN_飞龙
2023/04/24
1.5K0
【David Silver 深度强化学习教程代码实战07】 DQN的实现
点击上方“专知”关注获取更多AI知识! 【导读】Google DeepMind在Nature上发表最新论文,介绍了迄今最强最新的版本AlphaGo Zero,不使用人类先验知识,使用纯强化学习,将价值网络和策略网络整合为一个架构,3天训练后就以100比0击败了上一版本的AlphaGo。Alpha Zero的背后核心技术是深度强化学习,为此,专知有幸邀请到叶强博士根据DeepMind AlphaGo的研究人员David Silver《深度强化学习》视频公开课进行创作的中文学习笔记,在专知发布推荐给大家!(关注
WZEARW
2018/04/10
3.6K0
【David Silver 深度强化学习教程代码实战07】 DQN的实现
MADQN:多代理合作强化学习
处理单一任务是强化学习的基础,它的目标是在不确定的环境中采取最佳行动,产生相对于任务的最大长期回报。但是在多代理强化学习中,因为存在多个代理,所以代理之间的关系可以是合作的,也可以是对抗,或者两者的混合。多代理的强化学习引入了更多的复杂性,每个代理的状态不仅包括对自身的观察,还包括对其他代理位置及其活动的观察。
deephub
2024/03/20
3450
MADQN:多代理合作强化学习
OpenAI Gym 中级教程——深入强化学习算法
OpenAI Gym 是一个用于开发和比较强化学习算法的工具包,提供了多个环境,包括经典的控制问题和 Atari 游戏。本篇博客将深入介绍 OpenAI Gym 中的强化学习算法,包括深度 Q 网络(Deep Q Network, DQN)和深度确定性策略梯度(Deep Deterministic Policy Gradient, DDPG)。
Echo_Wish
2024/01/30
8291
【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。
在强化学习中,智能体是能够感知环境并采取行动的实体,而环境则是智能体所处的外部世界,智能体与环境之间通过交互来实现学习过程。例如,在一个简单的迷宫游戏中,智能体可以是一个试图找到出口的虚拟角色,而迷宫及其内部的障碍物、出口等构成了环境。
逆向-落叶
2024/12/25
2470
【机器学习】突出强化学习中智能体通过与环境交互不断成长,其决策能力逐步进化提升,展现强化学习核心特点与动态过程。
推荐阅读
相关推荐
强化学习从基础到进阶-案例与实践4.2:深度Q网络DQN-Cart pole游戏展示
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验