2019年10月5日 星期六

Linux - Rootkit

現今越來越多惡意程式在肆虐系統,不過大多數的惡意程式,防毒軟體都可以識別,像是後門/木馬、檔案加密、鍵盤側錄等等都可以輕易阻擋,然而也有進階的惡意程式非常難抵抗,像是Rootkit,那麼什麼是Rootkit,顧名思義就是能提升到root權限的程式,不過它有二種形式的運行方式,第一種是在應用層(ring3)幫助駭客提升權限,這種就很好解決它,另一種是存在於核心層(ring0),這種就比較頭痛,因為它能攔截(Hook)系統呼叫(system call),所以能輕易的隱藏檔案、防止檔案被刪除,甚至無法將它移除(需要找到它的實際檔案在哪裡,不然無法根除),因此防毒軟體才會難以阻擋這種高強度的惡意程式,那我們就來瞭解要如何利用Rootkit來提升權限。

核心版本為Linux 4.4.0 x64。

一、setuid分析

setuid是修改uid的函式,如果將uid設置為0,就是root權限(Linux的最高權限用戶),不過無權限的使用者是無法修改uid。

a. 新增一個cred的空間,cred是使用者權限的結構,裡面包含uid、gid、euid等等的變數。

b. 確認是否有足夠的權限來修改uid。

c. 如果有足夠權限就配置新的uid。

d. 如果有足夠權限就配置新的fsuid和euid。

e. 修改成新的uid。

f. 如果無權限就無法配置uid。



cred的結構,主要還是關於使用者權限的結構,只要將它全部設置為0就是最高權限root。



這邊要注意kuid_t(kgid_t)是一個結構,因此需要uid.val = 0,不然編譯時可能會出錯。



二、提升到root權限

我們已經知道setuid的運作原理了,那我們來嘗試修改uid,如下程式碼:

kuid_t own_uid. val = 0;

kgid_t own_gid.val = 0;

new = prepare_creds();

new->uid = new->euid = new->suid = new->fsuid = own_uid

new->gid = new->egid = new->sgid = new->fsgid = own_gid

commit_creds(new);

只需要短短的幾行程式碼,就能完成提升到root權限,是不是感覺駭客很好當呀! 那麼如果只想要讓特定的uid提升到root權限,還需要判斷setuid的參數。

三、運行成果

一般使用者使用setuid是無法改變uid的,因此還是原本的uid。



我們將寫好的rootkit.ko運行到系統上,在使用setuid,就能無條件的變成root權限了。