Linux 提權總結
一. sudo 和 suid 提權
- 何爲 suid
可見在權限位置有一個 s 權限。那麼這個 s 的作用是什麼呢?
答案是當其他用戶執行該文件時,該文件會以 root 的身份執行。
這裏就涉及到了 Effective UID 和 Real UID 以及 Saved UID
Effective UID: 程序實際操作時生效的 UID
Real UID: 執行該程序的用戶的實際 UID
Saved UID: 在高權限用戶降權後,保留的其原本 UID (不展開說)
所以增加了一個 s 權限,該程序在實際運行時 Effective UID 就會變爲 0,即 root 的 UID
- sudo
就是能把一個命令視作 root 來執行, 用 sudo-l 查看可以被 sudo 的命令
- SUID 與 sudo 提權
遍歷目錄中的 suid 文件
執行該命令,會得到所有 suid 文件
用 sudo -l 查看哪些命令能被 sudo
可利用於提權的命令
nmap
使用 nmap 的 udp 或 tcp syn 掃描時,需要用到 root 權限,所以有些管理員圖方便會直接給 namp 上 s 權限,而 nmap 5.20(使用 nmap -v 查看 nmap 版本) 之前有一個 interactive 交互模式 (nmap –interactive),在 nmap effective uid 爲 0 時,可以通過這個模式獲得 root 權限交互式命令行,成功提權
全版本通殺提權,利用 nmap 可以執行指定文件的特點提權
find
find 命令自帶 - exec 參數,可以執行命令,若 find 有 suid 權限,那麼使用 exec 相當於直接提權到 root.
vim
vim 有了 suid 就可以任意文件讀取了
同時也可以輸入 :shell
來獲取 root shell
bash
less,more
和 vim 差不多,任意文件讀取,同時也可以輸入 !command 進行提權到 root
exim
exim 在特定版本下會有 suid 提權
下載 exp 打就完事了
二. rbash 繞過
- 何爲 rbash
rbash,是出於安全性考慮的一個功能受限的 bash,我在 vulnhub dc-2 首次接觸, 他的限制性可能會有如下.
-
cd 切換目錄
-
含有斜槓
/
的命令, 譬如/bin/sh
-
設置 PATH ENV 等環境變量
-
使用
>
<
進行重定向 -
binary 的運行. 通常 root 用戶會手動創建
/bin/binary_file -> /home/rbash_user/bin/binary_file
的軟鏈接, 限制性地提供部分 binary_file 給 rbash_user 使用 在 bash 下echo $SHELL
, 可以獲取當前環境是否是 rbash.
- bypass
scp bypass
我在 http://www.const27.com/2020/07/02/vulnhub-dc-2 / 就是用 scp 繞的
- 進入命令自帶 shell bypass
man,git config help,more,less,vim,vi,ftp,gdb 等命令都有自己的 shell,我們只需在他們各自的 shell 中執行 / bin/sh 即可
一般都是在 shell 鍵入!/bin/sh 來 bypass rbash
下面這種方法也是可行的(似乎僅 vim)
執行上面兩個語句,就 bypass 了
4 find bypasss
簡單概括就是 - exec 執行一下 / bin/bash …
5 編程語言 bypass
python
如果 python 都可以用的話,那就更輕鬆了,os 安排一下
似乎 pty 也行? 沒試
php
perl
ruby
- cp bypass
直接用 cp 把 / usr/bin 裏的命令複製過來就行了
- 直接更改 PATH/SHELL 變量
鍵入 export -p 查看該用戶的變量
如果這倆變量有 w 權,那麼我們可以直接寫入來 bypass
- ssh bypass
原理是通過 ssh 鏈接當前 IP 的當前用戶並啓動 / bin/bash
三. 內核提權
用 uanme -a 查明內核版本
然後找 exp 打就完事了,內核提權的內容有點底層,暫時不用深入瞭解
四. passwd 和 shadow
- 明文密碼
/etc/passwd 默認所有用戶可讀,但只有 root 可寫。
/etc/passwd 裏的用戶口令往往以 x 代替,其加密後的密碼會存入 / etc/shadow 裏面,/etc/shadow 默認只有 root 可讀。
但是有小概率情況,明文密碼就直接出現在 / etc/passwd 了,如果有這個情況且 root 密碼暴露在了 passwd 裏,那麼就可以輕而易舉提權了
- passwd 可寫
如果 / etc/passwd 我們當前用戶可寫,可以直接把 root 的密碼改成一個明文密碼,從而達到提權目的
- 爆破 shadow
如果 / etc/shadow 可讀,我們可以用 hashcat 或者 john 暴力破解 shadow 文件
五. 計劃任務
- 文件重寫
計劃任務由 crontab 管理,非 root 用戶是無法列出 root 用戶的計劃任務的,但我們可以列出 / etc 的系統任務,系統任務默認是 root 權限運行的
如果我們有幸有權限能更改其中一個任務指定的腳本,我們就可以往腳本里添加如反彈 shell 等指令,從而提權
- 環境變量劫持
我們查看定時任務
發現定義了諸多環境變量,如果其任務有未指定絕對路徑的指令,如
而且我們在其環境變量路徑中可以進行寫入操作,那麼我們可以通過寫入環境變量的靠前路徑一個同名惡意文件從而導致環境變量劫持
比如我們在 / sbin 寫入一個 反彈 shell 功能的 shell.sh,那麼就可以造成提權
- 通配符提權
https://www.secpulse.com/archives/72965.html 總結的太好了,我都不想記筆記了(偷懶
六. 環境變量
如果我們找到一個 suid 權限的程序,但是我們無法完成 suid 提權,就可以試試搭配環境變量進行提權。
這個提權方法的思想是,找到有 suid 的,內部有 system 函數調用未指定路徑的命令的文件。同時用戶有修改自己環境變量的權限,
我們就可以通過劫持 system 函數里調用的腳本文件,使其指向我們環境變量裏自行創建的一個同名腳本文件,那麼這個我們自行創建的同名腳本文件就能以 root 權限運行了,如果這個腳本文件裏的命令是 / bin/bash,那麼就相當於我們提權了。
可能有點小繞,看下面具體操作就行了。
實驗室配置:
首先在一個目錄下創建如下文件
然後 gcc demo.c -o shell 將其編譯爲可執行文件
然後 chmod u+s shell 爲其增加 suid 權限
攻擊者視角:
首先使用下列指令搜尋 suid 權限文件
發現可疑目標,執行一下看看
發現返回了 ps 命令的結果,我們可以以此猜測這個文件內部 有 system(“ps”); 這條 c 語言代碼。
遂可嘗試環境變量提權
我們依次執行以下命令
七. 密碼查找
這個提權技術說白了,就是去到處翻密碼
文件內查找
我們可以通過以上命令,指定關鍵字,在所有文件中搜索內容中有關鍵字的文件。
查找十分鐘內更改過的文件
八. capabilities
capabilities 是 linux2.2 後出現的產物,它的出現一定程度上彌補了 suid 這種粗糙的權限管理機制,但是 capabilities 自身也有造成提權的安全隱患
- 簡介
capabilities 把 root 的權限細分了,可以分別啓用或者禁用。
在進行特權操作的時候,如果 euid 不是 root,那麼系統就會檢查是否具有執行特權操作的對應 capabilities ,並以此爲憑據決定特權操作是否能被執行。
如下是一些常見的特權操作及其對應 capabilities
關於 capabilities 的管理工具有如下:
-
getcap
-
setcap
-
capsh
-
filecap
getcap 用於查詢 capabilities,setcap 用於設置 capabilities,capsh 用於查當前 shell 進程的 capabilities,filecap 既能設置又能查詢。
我們可以通過以下指令搜索設置了 capabilities 的可執行文件
- 實操
通過 cap_setuid
cap_setuid 可以設置當前用戶的 euid,我們可以通過此選項來進行一些提權。
以 python 爲例
我們發現 python3.8 有 cap_setuid 權限,那麼我們可以用以下指令進行提權
類似的有很多。
perl
gdb
php
python
rvim
需要支持 python3 模塊。
vim
需要支持 python3 模塊。vim --version
查詢,是否支持 py3
通過 CAP_DAC_READ_SEARCH
cap_dac_read_search 可以繞過文件的讀權限檢查以及目錄的讀 / 執行權限的檢查。
利用此特性我們可以讀取系統中的敏感信息。
如果 tar 有此權限,我們可以通過此來查看敏感文件內容。
tar -xvf shadow.tar //解壓縮
cd etc //進入解壓縮的目錄
chmod +r shadow //賦予讀權限
cat shadow | grep root //查看shadow文件的內容
九. Docker
Docker 用戶組提權
如果我們拿到了一個 Docker 用戶組的用戶權限,那麼我們可以很輕鬆地完成提權
首先我們執行如下命令
然後在其中的 / etc/passwd 中寫入一個 root 權限用戶(我這裏直接無密碼了)
然後退出來,直接嘗試 su root2
提權成功
十. NFS
NFS 是一個用來共享目錄的東西,但若配置權限不當則會引發安全問題
no_root_squash
我們 cat /etc/exports 如果有 no_root_squash 字樣,則說明 root 用戶就會對共享目錄擁有至高的權限控制,就像是對本機的目錄操作一樣。
也就是說,任何機器的 root 在此目錄上都有最高權限。
我們在獲得一臺機器的 root 權限後,可以通過 nfs 在另一臺低權限機器上實現提權
回到低權限機,執行 /tmp/bash 完成提權
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/1imh1Pl6tA95NpiF-e1sbQ