5

[案例分享] 解包威联通NAS系统镜像,恢复降级后丢失的系统组件

 2 years ago
source link: https://segmentfault.com/a/1190000040919853
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

威联通(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端口,可以连通,问题成功解决!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK