There is a vulnerability in the below program that allows arbitrary programs to be executed, can you find it?
To do this level, log in as the level01 account with the password level01. Files for this level can be found in /home/flag01.
一樣先登入 level01, 密碼也是 level01
這是 /home/flag01
的原始檔,跟我一開始的理解
// C 函式庫
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Unix 函式庫
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char **argv, char **envp)
{
gid_t gid;
uid_t uid;
// ??
gid = getegid();
uid = geteuid();
// ???
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
// ????
system("/usr/bin/env echo and now what?");
}
阿…不會的東東有點多 (゚∀。),開 terminal man geteuid
下去
Linux 中一個 process 會有至少 6 個 ID:
ID | who |
---|---|
real user ID | 真正的所有者(只有 superuser 可以改) |
real group ID | 真正的所有群(只有 superuser 可以改) |
effective user ID | 程式執行時要到的權限 |
effective group ID | 程式執行時要到的權限 |
saved set-user ID | exec() 執行時會從 effective ID 複製一份過去 |
saved set-group ID | exec() 執行時會從 effective ID 複製一份過去 |
geteuid()
是取得該程式的 get effective user id, getegid
則是取得該程式的 get effective group id。
effective id 就是程式執行時要到的權限,可以用程式要到的權限來對原本沒有權限的檔案進行操作
setresuid(uid_t ruid, uid_t euid, uid_t suid)
則是直接將程式的三種 user (或是 group) id 設成指定的值,想當然,只有有setUID
權限的程序 (也就是 mode bits 中有 "s" 的程序) 才能隨意設定,除此之外的程序都只能在real UID/effective UID/saved set-user-ID
之間轉換。
system(const char* command)
是執行一個 shell 指令,看起來是:「用 /usr/bin/env
的環境變數,去跑 echo
指令,把 and now what?
丟到終端機上」
大概理解之後就先跑跑看
看起來題目的意思應該是要用這個 flag01 來跑 getflag
?
對的,看來窩們還沒有權限…
然後 flag01
有 setUID
權限欸,可以確定就是要用它跑 getflag
了
因為直接給執行檔,看起來是沒有辦法對程式的內容做修改了,弱點應該是在環境變數上。
我的想法是先做一個假的echo
出來跑getflag
,再改環境變數讓flag01
跑這個假的echo
照抄 flag01
的 code (`・ω・´)
接著跑跑看 /usr/bin/env
,看一看指令執行是先從哪個地方開始找。
因為執行指令時會依照環境變數 PATH 的順序來尋找符合的指令來執行,這也是為什麼 alias
可以改指令的名字
東西太多了就先 grep
出我想要看的,再用 export
改 PATH
變數…記得要保留「原本的」PATH
…不然會 PATH
裡面會連 getflag
的指令都找不到(我就蠢 0A0)
這樣應該就可以…了?
度的,成功! 0w0
這類獲取權限的方式被稱為 "Privilege Escalation",意指讓原本沒有權限的人拿到更高權限,是常見的 Linux 漏洞之一
參考: A Guide To Linux Privilege Escalation