作者:Saviour

這個APT源污染,需要同步下載大量的源服務器文件,我下完之后大約220多G。

系統:Ubuntu 16.04 LTS  
硬盤:500G  
軟件:apt-mirror  
路徑:/service/ubuntu/mirror  
木馬:sudo apt-get install slurm  

第一個階段:

為了測試我們將原版的slurm修改為我們測試之后的版本,用自定義好的測試文件將原版的slurm進行替換;

按照如下命令進行操作,如圖:

image

圖一(解壓縮slurm deb包)

提示:將生成好的測試文件替換后,執行md5sum slurm計算md5值,將原先的slurm值替換掉,然后再使用dpkg打包deb

image

圖二(計算替換后的slurm MD5值)

image

圖三(替換DEBIAN目錄下md5sum文件中的slurm值)

image

圖四(dpkg進行slurm重打包 )

image

圖五(將生成好的slurm包進行本地安裝測試)

第二個階段:

這個也是一個非常漫長的過程,需要同步APT源到本地,大約200多G。

同步完成之后,使用Apache搭建網站,并開啟列目錄功能,按照如下內容進行配置: image

圖六(修改配置文件,設置網站目錄,并開啟列目錄功能)

image

圖七(開啟之后的APT源列目錄)

進行APT源測試,執行sudo apt-get update,同步本地APT源,看是否正常。

image

圖八(同步本地APT源)

image

圖九(同步本地APT源成功,無報錯)

image

圖十(測試通過本地APT源進行安裝軟件成功)

第三個階段:

這個階段將分析APT源軟件的安裝方式,研究一個完整的APT軟件安裝過程及過程中調用的文件,并試圖將調用的文件內容進行特定修改,看APT是否能再次執行成功。

首先我們執行sudo apt-get install slurm進行原版軟件安裝,然后分析Apache訪問日志,默認網站日志路勁:/etc/apache2/access.log

通過查看APT源網站訪問,發現在初始APT源安裝軟件的時候,APT下載過InRelease、Packages.xz等文件; image

圖十一(APT訪問InRelease簽名文件)

image

圖十二(APT訪問Packages.xz文件)

InRelease文件是一個gpg明文簽名文件,里面包含了Packages.xz等md5、sha1、sha256、文件大小等校驗值。 image

圖十三(InRealse文件)

Packages.xz等文件(包括其他Packages開頭文件),里面包含了其對應pool目錄下的deb文件md5、sha1、sha256、文件大小等校驗值。 image

圖十四(Packages.xz文件)

通過對gpg進行了解,發現gpg可以進行簽名偽造,比如ubuntu官方的簽名郵箱為mirror@ubuntu.com,那么我們也可以使用官方簽名的郵箱重新進行申請,獲得一個簽名key。 image

圖十五(gpg key)

由于默認官方對Release文件進行了簽名,那么我們在修改Release文件后必須對他進行重新簽名,生成我們自己的Release文件(不然會在APT更新時報錯)。

這次實驗會用到的gpg命令如下:

gpg命令解析

gpg --gen-key 創建一個key
gpg --list-keys 查看key列表
gpg --armor --output public-key.txt --export [用戶ID] 導出公鑰
gpg --armor --output private-key.txt --export-secret-keys 導出私鑰
gpg --keyserver hkp://keys.gnupg.net --send-keys [用戶ID] 上傳公鑰到服務器
gpg --fingerprint [用戶ID] 驗證公鑰
gpg --clearsign test.txt 明文簽名文件

我使用的是Git Windows客戶端進行gpg key 生成,然后將生成的key導入ubuntu中 image

圖十六(gpg密鑰生成)

默認Windows gpg密鑰生成路徑為:C:\Users[用戶名].gnupg image

圖十七(gpg密鑰Windows目錄)

將.gnupg文件夾導入ubuntu用戶目錄下,路僅為:/home/[用戶名] image

圖十八(gpg密鑰ubuntu目錄)

第四個階段:

將我們重打包的slurm deb文件,md5、sha1、sha256、大小等信息收集起來,這里我們需要改兩個文件,一個是Packages.xz、一個是InRealse文件,步驟如下:

將slurm文件md5、sha1、sha256、大小寫入Packages.xz解壓后文件對應的字段中 image

圖十九(修改slurm對應的值)

改完slurm文件后,對Packages進行xz壓縮,重新計算Packages.xz的md5、sha1、sha256、文件大小值,將獲得的值寫入Release文件對應的字段中。 image

圖二十(修改Release對應的md5值)

image

圖二十一(修改Release對應的sha1值)

image

圖二十二(修改Release對應的sha256值)

改完后我們使用剛注冊好的gpg key對Release文件進行明文簽名,生成Release.asc文件

image

圖二十三(對Release文件進行簽名)

image

圖二十四(簽名后的Release文件)

最后階段:

修改完成后,將生成的Release.asc改名為InRelease,并覆蓋原先的InRelease文件,執行sudo apt-get update,看是否更新正常,如果報錯請導入證書文件,如果報hash不匹配,有可能是你的Release里面的值或文件大小填寫錯誤,填寫正確后重新對Release文件進行簽名即可,并進行覆蓋,重新執行sudo apt-get update,無誤后進行本次的最后一步sudo apt-get install slurm。

導入證書:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys [證書公鑰ID]

成功結果:

APT成功安裝了我們自定義的APT源deb文件,這就意味著,此刻如果我安裝的是一個被替換過之后的惡意文件,那么我的主機就被成功入侵了,由于有些用戶喜歡使用root用戶執行的apt命令,那么就導致惡意文件會以最高權限運行,導致服務器徹底淪陷。

image

圖二十五(自定義slurm文件成功被安裝)

實驗目的:

1、 APT源是可以篡改的。 2、 警惕不明的第三方源; 3、 官方源也未必完全可信; image

實驗說明:

此次實驗不完全針對APT問題,也不排除YUM源等也存在此問題。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/270/