威联通(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服务,于是执行了如下命令:
<code class="bash">sudo /etc/init.d/ftp.sh start
执行结束后,却发现FTP过程并没有呈现。
于是笔者关上上述启动脚本,心愿能手动启动服务,查看是否有报错或其余信息:
<code class="bash">/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
的脚本十分『可疑』,因为脚本较长,下文摘录其中一行,也是最要害的一行:
<code class="bash">/sbin/PC1 d QNAPNASVERSION4 "$path_name" "${_tgz}" "${CS_SIGNATURE}";
依照脚本所示,PC1应该是解压零碎固件包的工具,该工具将零碎固件解压到一个.tar.gz
文件。于是笔者依照这个命令的规定,对上文咱们取得的img包进行解压:
<code class="bash">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
则是须要关注的重点。于是笔者持续解压这两个文件:
<code class="bash">$ 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服务:
<code class="bash">$ sudo cp ./usr/local/sbin/proftpd /usr/local/sbin/proftpd
再查看过程列表:
应用telnet连贯21端口,能够连通,问题胜利解决!