?在我們滲透測(cè)試的過(guò)程中,當(dāng)拿到普通用戶(hù)的shell后,可能會(huì)因?yàn)楦鞣N各樣的權(quán)限限制,導(dǎo)致無(wú)法進(jìn)行更多的操作,這個(gè)時(shí)候我們就要想辦法進(jìn)行提權(quán)。
收集環(huán)境信息
一旦我們拿到了受限制的shell,第一步是盡可能多地收集有關(guān)我們當(dāng)前shell環(huán)境的信息。收集的信息將讓我們了解我們所處的受限制的shell類(lèi)型,以及所提供的功能和我們可以使用的技術(shù)。我們可以做以下的測(cè)試:
- 檢查可用的命令,方法是手動(dòng)嘗試,按兩次TAB鍵看看能不能列出文件和目錄
- 檢查使用SUID權(quán)限配置的命令,看看它們是不是歸root用戶(hù)所有
- 檢查可以使用的命令列表sudo,看看能不能用我們的密碼執(zhí)行其他用戶(hù)的權(quán)限命令
- 檢查有什么語(yǔ)言,如Python,expect,perl,ruby等,他們會(huì)在以后派上用場(chǎng)
- 檢查重定向運(yùn)算符是否可用,例如'|' (pipe), “>”, “>>”, “<”
- 檢查轉(zhuǎn)義字符和執(zhí)行標(biāo)記,例如:( “;”冒號(hào)),“&”(后臺(tái)支持),“’”(單引號(hào)),“”(雙引號(hào)),“$(”(shell執(zhí)行標(biāo)記),“${”
然后,自己在本地搭建環(huán)境,進(jìn)行各種測(cè)試,根據(jù)報(bào)錯(cuò)信息,確認(rèn)是哪種類(lèi)型的shell...
常見(jiàn)的shell類(lèi)型報(bào)錯(cuò)如下:
rbash
rksh
rzsh
lshell
一些受限制的shell在錯(cuò)誤消息中會(huì)顯示其名稱(chēng),有些則沒(méi)有。
常用的突破技術(shù)
我們從基礎(chǔ)開(kāi)始、我們可以使用一些非常簡(jiǎn)單的技術(shù)逃避受限制的shell來(lái)執(zhí)行命令或訪(fǎng)問(wèn)我們不能或者不應(yīng)該訪(fǎng)問(wèn)的系統(tǒng)區(qū)域、、、這些技術(shù)大多依賴(lài)簡(jiǎn)單的命令轉(zhuǎn)義字符,重定向運(yùn)算符甚至linux系統(tǒng)shell變量污染、、、我們來(lái)分析一下:
1.Console編輯(vim)
Vim有一個(gè)功能,允許我們?cè)谄渲羞\(yùn)行腳本和命令、如果vim可用,可以用一下的命令來(lái)進(jìn)行測(cè)試:
:!/bin/ls -l b*
Vim會(huì)離開(kāi)編輯器并顯示“ls -l b*”執(zhí)行命令的結(jié)果,顯示所有目前目錄下以字母“b”開(kāi)頭的文件...
我們可以使用這個(gè)技術(shù)執(zhí)行任何其他命令甚至是另一個(gè)可用的shell,比如bash,以突破我們目前的限制,就比如:
:set shell=/bin/sh:shell
或者
:!/bin/sh
另一個(gè)好例子是ed。它是一個(gè)舊的默認(rèn)Unix控制臺(tái)編輯器。通常ed是提供給用戶(hù),它功能非常簡(jiǎn)單,但它仍然有內(nèi)部的第三方命令執(zhí)行功能,非常類(lèi)似于vim。一旦進(jìn)入,ed我們可以通過(guò)執(zhí)行另一個(gè)來(lái)逃避正常的shell,!’/bin/sh’如下所示:
另一個(gè)編輯器的例子是ne,它是一個(gè)非常小巧的被用來(lái)設(shè)計(jì)成替代vi的東西。使用ne,可以突破的例子如下:這是一個(gè)lshell、我們沒(méi)有權(quán)限回到“/”上面的任何其他目錄。。。。
那么就輪到我們的ne上場(chǎng)了,ne編輯器有一個(gè)非常騷的功能,允許我們保存或加載配置首選項(xiàng)。我們可以用這個(gè)功能來(lái)讀取文件系統(tǒng)中的內(nèi)容。按一下ESC一旦可以打開(kāi)主配置菜單、轉(zhuǎn)到最后一個(gè)菜單,“Prefs”選項(xiàng)“Load Prefs”:
點(diǎn)擊后,它就會(huì)顯示文件系統(tǒng)的內(nèi)容,讓我們可以從中選擇我們的首選項(xiàng)文件。但是在這里,請(qǐng)注意,我們現(xiàn)在可以進(jìn)入到上一級(jí)文件系統(tǒng)中的目錄,甚至到達(dá)“/”或任何其他目錄,獲取和讀取它里面的內(nèi)容:
我們甚至可以打開(kāi)/etc目錄文件/etc/passwd來(lái)枚舉用戶(hù):
2.Pager命令
Linux 的Pager類(lèi)型命令是一些簡(jiǎn)單實(shí)用的命令、它們?cè)试S我們以分頁(yè)的方式查看特定命令或文本文件的輸出,最著名的是“more”和“less”、它還具有執(zhí)行腳本的功能。。。是不是很騷。。。舉個(gè)栗子:我們less一個(gè)文件,然后輸入 !'ls'或者 !'sh',這里它就會(huì)成功的顯示本目錄下所有的文件
這種技術(shù),適用于more和less
3.man命令
命令“man”用于顯示Linux命令的手冊(cè)頁(yè),也具有突破功能功能。只需使用man命令顯示任何命令手冊(cè),如下所示:$ man ls當(dāng)ls出現(xiàn)命令手冊(cè)時(shí),我們可以使用more和less相同的技術(shù)、原因是 “man”使用“less”或“more”作為默認(rèn)的man打開(kāi)命令
4.pinfo命令
這個(gè)命令比較偏,只適用于一些個(gè)別的shell類(lèi)型中,作用和man一樣,這里使用 lshell 來(lái)演示一些受限制下的 lshell 如何使用 pinfo 提權(quán)。。。。我們嘗試一些命令如“nc”,“/bin/bash”或“ls /etc”,都無(wú)法被執(zhí)行,lshell限對(duì)這些命令有限制,然后我們來(lái)嘗試用pinfo提權(quán):
用pinfo打開(kāi)ls手冊(cè)u(píng)ser@kali:~$ pinfo ls當(dāng)ls手冊(cè)頁(yè)面打開(kāi)后,在里面打“!”(感嘆號(hào))。請(qǐng)注意,這里就會(huì)打開(kāi)了一個(gè)命令執(zhí)行功能,現(xiàn)在執(zhí)行一些簡(jiǎn)單的命令試試吧,就比如之前的“ls /etc”,可以看到成功執(zhí)行:
這里我們就成功繞過(guò)了lshell執(zhí)行受限命令的限制。。。
5.find命令
find是一個(gè)非常著名的命令,用于在Linux文件系統(tǒng)中查找文件。它有許多功能,其中“-exec”選項(xiàng)是一個(gè)讓我們可以執(zhí)行shell命令。關(guān)于這個(gè)命令,我在博客中有提過(guò),這里就不詳細(xì)說(shuō)了,放兩個(gè)例子:
/usr/bin/find examples.desktop -exec whoami ;
/usr/bin/find examples.desktop -exec /bin/sh ;
可以直接進(jìn)入root權(quán)限的shell中。。。
6.nmap命令
nmap是一個(gè)非常著名的掃描端口的命令,它有一個(gè)選項(xiàng)叫做“--interactive”,該“--interactive”選項(xiàng)在2009年5月之前的版本中用于打開(kāi)交互式控制臺(tái),可以運(yùn)行其他命令。但是有點(diǎn)憂(yōu)傷的是,這個(gè)功能在版本r17131中已停用,不過(guò)如果我們?cè)儆悬c(diǎn)舊版的Linux中可以嘗試一下,當(dāng)可以使用這個(gè)選項(xiàng)時(shí),可以輸入“!sh”,看看能不能打開(kāi)一個(gè)shell
user@kali:~$ nmap --interactivenmap> !sh$
7.export
如果這個(gè)命令可以,就可以直接添加環(huán)境變量,獲取到更多可以執(zhí)行的命令,比如:
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
利用編程語(yǔ)言的技巧
1.awk命令
awk是一種為文本處理而設(shè)計(jì)的解釋型編程語(yǔ)言。它是大多數(shù)類(lèi)Unix操作系統(tǒng)的標(biāo)準(zhǔn)功能,我們通常可以在shell中找到它們。它有很多的類(lèi)似功能如print(),sprintf()以及其他。其中最有意思的是system()、system()函數(shù)允許我們/bin/sh$ awk 'BEGIN {system("/bin/sh")}'即使 lshell 不允許 /bin/sh 直接運(yùn)行另一個(gè)shell(),我們也可以通過(guò)使用awk為我們打開(kāi)shell來(lái)突破它的限制:
2.Python
Python是世界上最好的語(yǔ)言、哈哈哈。它有很多的功能,我們可以用它來(lái)執(zhí)行的shell命令,比如system(),pty()等等,來(lái)看個(gè)栗子:
我們執(zhí)行函數(shù)print()來(lái)回顯字符串“testing”,因此我們就可以執(zhí)行任何其他命令(如ls甚至是shell)。對(duì)于第一個(gè)示例,我們導(dǎo)入OS模塊,負(fù)責(zé)操作系統(tǒng)交互,最后使用system()函數(shù)運(yùn)行本來(lái)不讓運(yùn)行的命令cp,這里只是隨便證明一下:
可以看到,我們成功運(yùn)行了cp命令,因此運(yùn)行shell應(yīng)該也可以吧,來(lái)試試:
可以看到,我們成功得到了shell。同樣的例子可使用多種不同的方式,主要看掌握的基礎(chǔ)知識(shí)是不是強(qiáng)大,再來(lái)個(gè)例子,如spawn()的pty模塊:
多說(shuō)一句,你掌握的知識(shí),決定你可以使用的功能。。。
如果我們想要shell可以遠(yuǎn)程使用,我們可以使用反彈shell讓python打開(kāi)我們的攻擊者機(jī)器的socket,如下所示:
檢查已經(jīng)在端口5000上偵聽(tīng)的攻擊者的電腦看看反彈過(guò)來(lái)了沒(méi):
3.Ruby
Ruby中可以讓我們使用irb(Interactive Ruby Shell)直接調(diào)用shell或任何其他命令:
可以反彈一個(gè)shell
4.Perl
我們使用perl with system()method來(lái)執(zhí)行禁止本來(lái)沒(méi)法執(zhí)行的命令cp,也可以調(diào)用/bin/sh,如下:
完成同樣騷操作的另一種方法是使用exec()方法,如下所示:
反彈個(gè)shell
5.php
PHP語(yǔ)言有很多選項(xiàng)可以在shell中執(zhí)行命令,其中包括已經(jīng)很有名的system()和exec()。您可以在php控制臺(tái)內(nèi)以交互方式進(jìn)行,也可以直接在命令行中進(jìn)行,就像之前在ruby,python和perl中做的那樣。。。
以下是交互式使用PHP的示例:還是一樣,試試cp命令
再使用exec()函數(shù)來(lái)嘗試執(zhí)行交互式shell:
也不一定非得要交互模式來(lái)獲取shell、我們可以用簡(jiǎn)單的php在命令行上執(zhí)行腳本并讓我們的靶機(jī)向我們反彈shell,如下所示:
是不是很棒。。。
當(dāng)然,提權(quán)的方式還有很多很多 ,后續(xù)會(huì)陸續(xù)發(fā)出,如果大家還有什么更騷的操作,歡迎私信。。。