nebula level01中flag01源碼如圖所示

hint提示說(shuō):There is a vulnerability in the below program that allows arbitrary programs to be executed
首先查看flag01的權(quán)限

具有s權(quán)限且用戶(hù)組具有執(zhí)行的權(quán)限,所以通過(guò)運(yùn)行flag01可以暫時(shí)從level01獲取到flag01的權(quán)限,如果對(duì)s權(quán)限不理解可以先來(lái)看一個(gè)例子(例子文章轉(zhuǎn)載于http://over-rainbow.cn/2016/12/24/S-%E6%9D%83%E9%99%90/):
s權(quán)限
和普通的rwx權(quán)限不同,當(dāng)s權(quán)限出現(xiàn)在文件上的時(shí)候,意味當(dāng)其他用戶(hù)使用執(zhí)行這個(gè)文件的時(shí)候會(huì)被暫時(shí)set UID,簡(jiǎn)稱(chēng)SUID.
該權(quán)限的一些作用:
1.SUID權(quán)限僅對(duì)二進(jìn)制程序有效(重要…)
2.執(zhí)行則對(duì)于該程序需要具有x的可執(zhí)行權(quán)限
3.本權(quán)限僅在執(zhí)行該程序的過(guò)程中有效
4.執(zhí)行者將具有該程序擁有者的權(quán)限
可以看出SUID的目的就是:讓本沒(méi)有相應(yīng)權(quán)限的用戶(hù)運(yùn)行這個(gè)程序是,可以訪(fǎng)問(wèn)他沒(méi)有權(quán)限訪(fǎng)問(wèn)的資源.
看兩個(gè)例子:
1.Linux的密碼是放在/etc/shadow下面的,然而權(quán)限一般普通用戶(hù)都是0權(quán)限的,這就涉及到了一個(gè)問(wèn)題.
那么普通用戶(hù)為什么能修改密碼?

是通過(guò)系統(tǒng)的passwd命令修改的,然后查看passwd的權(quán)限發(fā)先root權(quán)限是rws,這個(gè)s代表setuid的權(quán)限,因此當(dāng)普通用戶(hù)調(diào)用passwd命令時(shí),setuid給了它一個(gè)臨時(shí)的root權(quán)限,使得普通用戶(hù)能夠?qū)?etc/shadow文件進(jìn)行修改.接著我嘗試給cat命令一個(gè)s權(quán)限,讓普通用戶(hù)讀取/etc/shadow文件.

2.接下想個(gè)這樣的問(wèn)題:有一個(gè)用戶(hù)user創(chuàng)建了一個(gè)文件之后,權(quán)限被設(shè)置為600,那么以為著只能user和root可以查看.那么當(dāng)有一個(gè)其他的用戶(hù)test02想要讀取這個(gè)文件,就可以通過(guò)這種方式來(lái)讀取.前提條件:需要user用戶(hù)創(chuàng)建一個(gè)二進(jìn)制程序,并且給予其他用戶(hù)x權(quán)限,再給自己設(shè)置一個(gè)s權(quán)限.(出現(xiàn)”S”的原因是由于本身不具有x權(quán)限)這里通過(guò)cp一個(gè)cat命令來(lái)實(shí)現(xiàn).兩個(gè)用戶(hù)test1和test2.

可以看出key.txt文件屬于test1權(quán)限為600.

此時(shí)的test2沒(méi)有讀取的權(quán)限,但是getkey是test1且可運(yùn)行并且擁有s權(quán)限.成功讀取內(nèi)容

對(duì)于s權(quán)限同樣可以參考下面文章:https://segmentfault.com/a/1190000002523542
通過(guò)執(zhí)行flag01函數(shù)可以短暫獲取到該文件所有者flag01的權(quán)限,但是并不能提權(quán),既然提示說(shuō)是是可執(zhí)行任意文件漏洞,我們從最關(guān)鍵的函數(shù)下手——倒數(shù)第二行的system函數(shù)。程序使用了system函數(shù)執(zhí)行指定的shell命令,代碼中,system執(zhí)行的/usr/bin/env命令,但是system的參數(shù)并非來(lái)自變量,也就是我們無(wú)法控制system的參數(shù)。但是,這里它執(zhí)行了env,通過(guò)env找到echo程序,and now what”是傳遞給echo的參數(shù),所以只要控制echo函數(shù)的位置的內(nèi)容和位置便可以永久獲取一個(gè)shell,達(dá)到提權(quán)的目的。
如何控制echo函數(shù)的位置?
通過(guò)控制環(huán)境變量中path的路徑來(lái)控制echo函數(shù)的位置,在修改echo函數(shù)路徑之前先需要了解一下知識(shí)
Linux也提供了修改和查看環(huán)境變量的命令,下面通過(guò)幾個(gè)實(shí)例來(lái)說(shuō)明:
echo 顯示某個(gè)環(huán)境變量值 echo $PATH
export 設(shè)置一個(gè)新的環(huán)境變量 export HELLO="hello" (可以無(wú)引號(hào))
env 顯示所有環(huán)境變量
set 顯示本地定義的shell變量
unset 清除環(huán)境變量 unset HELLO
readonly 設(shè)置只讀環(huán)境變量 readonly HELLO
關(guān)于PATH的作用:
PATH說(shuō)簡(jiǎn)單點(diǎn)就是一個(gè)字符串變量,當(dāng)輸入命令的時(shí)候LINUX會(huì)去查找PATH里面記錄的路徑。比如在根目錄/下可以輸入命令ls,在/usr目錄下也可以輸入ls,但其實(shí)ls這個(gè)命令根本不在這個(gè)兩個(gè)目錄下,事實(shí)上當(dāng)你輸入命令的時(shí)候LINUX會(huì)去/bin,/usr/bin,/sbin等目錄下面去找你此時(shí)輸入的命令,而PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒號(hào)使目錄與目錄之間隔開(kāi)
/bin,/sbin,/usr/bin,/usr/sbin區(qū)別
/: this is root directoryroot 用戶(hù)根目錄
/bin: commandsin this dir are all system installed user commands系統(tǒng)的一些指令
/sbin:commands in this dir are all system installedsuper user commands超級(jí)用戶(hù)指令系統(tǒng)管理命令,這里存放的是系統(tǒng)管理員使用的管理程序
/usr/bin: usercommands for applications后期安裝的一些軟件的運(yùn)行腳本
/usr/sbin:super user commands for applications超級(jí)用戶(hù)的一些管理程序
/usr/X11R6/bin: X application user commands
/usr/X11R6/sbin: X application super usercommands
Linux中的某些重要的目錄:
?主目錄:/root、/home/username
?用戶(hù)可執(zhí)行文件:/bin、/usr/bin、/usr/local/bin
?系統(tǒng)可執(zhí)行文件:/sbin、/usr/sbin、/usr/local/sbin
?其他掛載點(diǎn):/media、/mnt
?配置:/etc
?臨時(shí)文件:/tmp
?內(nèi)核和Bootloader:/boot
?服務(wù)器數(shù)據(jù):/var、/srv
?系統(tǒng)信息:/proc、/sys
?共享庫(kù):/lib、/usr/lib、/usr/local/lib
每個(gè)用戶(hù)都擁有一個(gè)主目錄。所有用戶(hù)的個(gè)人文件(配置、數(shù)據(jù)甚至應(yīng)用程序)都放在其中。根的主目錄為/root。大多數(shù)非根主目錄包含在/home 樹(shù)中,通常以用戶(hù)命名。重要的二進(jìn)制位于 /bin(用戶(hù)二進(jìn)制)以及 /sbin(系統(tǒng)二進(jìn)制)中。不重要的二進(jìn)制(如圖形環(huán)境或Office 工具)安裝在/usr/bin 和 /usr/sbin中。進(jìn)行這種分隔是為了盡可能地縮小根分區(qū)。使用源代碼編譯的軟件通常位于 /usr/local/bin 和/usr/local/sbin中。
由于獲得系統(tǒng)的權(quán)限為:

并不具備在其他目錄進(jìn)行寫(xiě)操作,除了tmp目錄之外,/tmp目錄對(duì)任何用戶(hù)都是有完整的權(quán)限,我們可利用它下手:

先修改環(huán)境變量$PATH:

在tmp目錄下創(chuàng)建一下可執(zhí)行文件并且用gcc編譯:
#include <stdio.h>
#include <stdlib.h>
void main()
{
system("/bin/bash");
}
再執(zhí)行flag01發(fā)現(xiàn)已經(jīng)提權(quán)成功
