Nebula level01

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

對的,看來窩們還沒有權限…

然後 flag01setUID 權限欸,可以確定就是要用它跑 getflag

因為直接給執行檔,看起來是沒有辦法對程式的內容做修改了,弱點應該是在環境變數上。

我的想法是先做一個假的echo出來跑getflag,再改環境變數讓flag01跑這個假的echo

照抄 flag01 的 code (`・ω・´)


接著跑跑看 /usr/bin/env,看一看指令執行是先從哪個地方開始找。

因為執行指令時會依照環境變數 PATH 的順序來尋找符合的指令來執行,這也是為什麼 alias 可以改指令的名字

東西太多了就先 grep 出我想要看的,再用 exportPATH 變數…記得要保留「原本的」PATH…不然會 PATH 裡面會連 getflag 的指令都找不到(我就蠢 0A0)

這樣應該就可以…了?

度的,成功! 0w0


這類獲取權限的方式被稱為 "Privilege Escalation",意指讓原本沒有權限的人拿到更高權限,是常見的 Linux 漏洞之一

參考: A Guide To Linux Privilege Escalation


下一關

回系列首頁