乐趣区

关于linux:案例分享-解包威联通NAS系统镜像恢复降级后丢失的系统组件

威联通 (QNAP) 在 2021 年 9 月公布了全新的 QTS 5.0 零碎,笔者最近收到了官网更新告诉,于是将本人的 TS-551 降级到最新版,却发现无论是零碎晦涩度还是稳定性都与他们宣传的差距甚远,不得不降级到 QTS 4.5.4。然而因为 QTS 5.0 将 FTP 作为可选软件包(QuFTP),降级后零碎里既没有 QuFTP,也没有 QTS 4 应该有的proftpd,本文将为读者分享威联通 NAS 解包零碎镜像,复原零碎组件的过程。

0x01 问题概述

如上文所示,笔者在从 QTS 5 降级到 QTS 4 后,发现 FTP 服务关上后,21 端口仍旧无奈联通,进入 SSH 查看过程列表,却发现基本没有 proftpd 过程:

0x02 剖析问题

笔者首先想到的是手动启动 FTP 服务,于是执行了如下命令:

sudo /etc/init.d/ftp.sh start

执行结束后,却发现 FTP 过程并没有呈现。

于是笔者关上上述启动脚本,心愿能手动启动服务,查看是否有报错或其余信息:

/sbin/daemon_mgr proftpd start "LD_PRELOAD=/usr/local/lib/libtrash.so TZ=/etc/localtime /usr/local/sbin/proftpd -n > /dev/null 2>&1 &"

间接报错segmentation fault

间接执行/usr/local/sbin/proftpd

看来这就是问题所在,proftpd 基本不存在,兴许是降级时固件遗记将 QTS 5.0 删除的 proftpd 复原回来,导致此问题。

在通过一番搜寻后,笔者发现威联通批改过 proftpd 的源码,退出了治理性能和一些其余的定制性能,因而无奈间接从网上找现成的二进制文件或源码包装置,必须应用和零碎版本匹配的原版二进制文件复原回去。那么哪里来二进制文件呢?笔者想到了官网的零碎固件。

笔者从威联通的下载核心下载和零碎版本统一的镜像,取得名为 TS-XA51_20210923-4.5.4.1800.zip 的零碎镜像,解压之,取得了后缀名为 .img 的同名镜像。在尝试应用多款解压缩软件和磁盘镜像软件后,笔者意识到,仿佛该镜像文件并不是惯例的格局,而是威联通定制的格局。

既然是定制的格局,那么肯定有中央能够解压,而零碎镜像是装置到 NAS 里的,解压工具也应该在 NAS 里有内置才对。

0x03 解包镜像

找到了一个可行的方向,于是笔者开始在零碎里寻找与固件更新相干的脚本。在笔者的一番寻找下,发现一个位于 /etc/init.d/update.sh 的脚本十分『可疑』,因为脚本较长,下文摘录其中一行,也是最要害的一行:

/sbin/PC1 d QNAPNASVERSION4 "$path_name" "${_tgz}" "${CS_SIGNATURE}";

依照脚本所示,PC1 应该是解压零碎固件包的工具,该工具将零碎固件解压到一个 .tar.gz 文件。于是笔者依照这个命令的规定,对上文咱们取得的 img 包进行解压:

PC1 d QNAPNASVERSION4 ./TS-XA51_20210923-4.5.4.1800.img ./TS-XA51_20210923-4.5.4.1800.tar.gz

后果令人振奋,果然拿到了一个名为 TS-XA51_20210923-4.5.4.1800.tar.gz 的压缩包:

接下来笔者尝试解压该压缩包,取得了下图所示的文件:

依据文件名规定,能够猜测出局部文件来自 boot 分区,而外面的 rootfs2.bzrootfs_ext.tgz则是须要关注的重点。于是笔者持续解压这两个文件:

$ bzip2 -k -d ./rootfs2.bz
bzip2: ./rootfs2.bz is not a bzip2 file.
# 既然其格局不是规范格局,那么应用 file 命令来看看到底是什么格局
$ file ./rootfs2.bz
rootfs2.bz: LZMA compressed data, streamed
# 原来是 LZMA 格局,和 initrc.img 一样解压即可
$ xz -dc ./rootfs2.bz | cpio -id

此时再查看当前目录,会发现呈现了一些目录:

上文提到,咱们须要的文件在 /usr/local/sbin/prosftpd,那么来看看./rootfs2.bz 文件里是否蕴含咱们所须要的文件呢:

答案是必定的~

0x04 解决问题

既然取得了这个文件,接下来要做的事件就非常简单了:将其复制到对应目录,而后在 NAS 的控制面板里从新关上 FTP 服务:

$ sudo cp ./usr/local/sbin/proftpd /usr/local/sbin/proftpd

再查看过程列表:

应用 telnet 连贯 21 端口,能够连通,问题胜利解决!

退出移动版