核心版本為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權限了。