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:
| Timestamp | Nombre | Se actualiza cuando… |
|---|---|---|
| atime | Access time | Se lee el archivo (cat, less, etc.) |
| mtime | Modify time | Cambia el contenido del archivo |
| ctime | Change time | Cambia 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
Paso 1 — Reconocimiento
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
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
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
ssh-keygen -f '/home/kali/.ssh/known_hosts' -R '[<LAB_IP>]:2222'Paso 4 — Acceso SSH
ssh maria@<LAB_IP> -p 2222
Paso 5 — Exploración inicial
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
Paso 6 — Manipular el tiempo con faketime
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étodo | Cómo funciona | Problema |
|---|---|---|
| sudo date -s | Cambia el reloj del kernel (sistema global) | NTP lo resetea en milisegundos |
| faketime | LD_PRELOAD intercepta time() por proceso | Ninguno — 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
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
¿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ón | mtime (unix) | now (unix) | mtime > now | Resultado |
|---|---|---|---|---|
| Antes de cambiar fecha | ~1924905600 | ~1775260800 | ✓ True | Sin salida |
Con faketime "2031-01-01" | ~1924905600 | ~1924992000 | ✗ False | Muestra flag |
El cat original (/bin/cat.real) sigue disponible para el sistema operativo. Solo el wrapper que ven los usuarios aplica el filtro temporal.