[案例分享] 解包威聯通NAS系統映象,恢復降級後丟失的系統元件

路人甲的世界發表於2021-11-06
威聯通(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埠,可以連通,問題成功解決!

相關文章