[案例分享] 解包威联通NAS系统镜像,恢复降级后丢失的系统组件
本文完整阅读约需 9 分钟,如时间较长请考虑收藏后慢慢阅读~
威联通(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.bz
和rootfs_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端口,可以连通,问题成功解决!