Crear Entorno Vulnerable en Nube Local (Docker)

Instalación Docker

Primero instalaremos docker:

sudo apt install docker-ce

Despues vamos a cargar la imagen de ubuntu con la ultima version:

docker pull ubuntu:latest

Ahora tendremos que ver en que ID de contenedor esta para meternos con una shell dentro del mismo.

docker images

Cogeremos unicamente los 3 primeros numeros de del IMAGE ID por ejemplo si fuera 03a haremos lo siguiente:

docker run -it 03a

Y con esto tendremos una shell dentro del docker, ahora vamos actualizarlo de esta forma:

apt update

Echo todo esto, podremos pasar a la instalacion del entorno vulnerable de una nube de forma local.

Instalación de los requisitos

Vamos a instalar todos los requisitos necesarios para realizar la instalacion de la nube local.

apt install -y apache2 php php-cli php-curl php-mbstring php-xml php-zip unzip curl
curl -O https://dl.min.io/server/minio/release/linux-amd64/minio
apt install -y python3-pip curl unzip jq git default-jre
pip3 install awscli --upgrade --break-system-packages
pip3 install awscli-local --break-system-packages
chmod +x minio
mv minio /usr/local/bin/
cd /
mkdir -p /data/s3
apt install -y composer

Instalado todo, vamos a iniciar el servidor configurando el usuario con sus credenciales para la nube local.

Inicio del servidor de la nube local

MINIO_ROOT_USER=<USER> MINIO_ROOT_PASSWORD=<PASSWORD> minio server /data/s3 --console-address ":9001" &

Una vez con el servidor iniciado, vamos a configurar a nivel local las variables que vamos a necesitar para manipular dicho servidor:

Variables de configuracion local para la nube

aws configure

Echo esto nos metera en un entorno de configuracion pidiendo los datos de los cuales hemos configurado anteriormente al iniciar el servidor.

# Access Key ID: <USER>
# Secret Access Key: <PASSWORD>
# Region: us-east-1
# Output format: json

Configurado esto, ya podremos interactuar con la nube local, por ejemplo vamos a crear una politica para el bucket el cual tambien vamos a crear, para que sea vulnerable.

Crear un bucket para la nube local

aws --endpoint-url http://localhost:9000 s3api create-bucket --bucket <BUCKET_NAME>

EJEMPLO:

aws --endpoint-url http://localhost:9000 s3api create-bucket --bucket huguelogistics-data

Con esto ya habremos creado el bucket por lo que vamos a configurarle una politica que permita que cualquier usuario de la nube local puede enumerar las politicas y se puede descargar cualquier archivo de dicho bucket.

Creacion de politica vulnerable

cd /tmp

public-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicReadPolicy",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:GetBucketPolicy"
      ],
      "Resource": [
        "arn:aws:s3:::<BUCKET_NAME>",
        "arn:aws:s3:::<BUCKET_NAME>/*"
      ]
    }
  ]
}

EJEMPLO CON EL NOMBRE:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPublicReadPolicy",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket",
        "s3:GetBucketPolicy"
      ],
      "Resource": [
        "arn:aws:s3:::huguelogistics-data",
        "arn:aws:s3:::huguelogistics-data/*"
      ]
    }
  ]
}

Ahora una vez creado el archivo que cargaremos desde el /tmp lo cargaremos con este comando:

aws --endpoint-url http://localhost:9000 s3api put-bucket-policy --bucket huguelogistics-data --policy file:///tmp/public-policy.json

Una vez echo esto, podemos cargar algun archivo de prueba que tenga credenciales de usuarios o cualquier cosa, por ejemplo podriamos probar a crear un .xlsx con usuarios y contraseñas al bucket si tuvieramos un archivo de este estilo, lo podremos subir de esta forma:

Subida de archivos al bucket

cd /tmp
touch <FILE_NAME>.xlsx
aws --endpoint-url http://localhost:9000 s3 cp <FILE_NAME>.xlsx s3://huguelogistics-data/

Ejecutando este comando habremos subido de forma correcta el archivo .xlsx al bucket, ahora desde una maquina atacante, se podria hacer lo siguiente.

Vista desde un atacante

Probando de forma anonima a enumerar el bucket veremos esto:

aws --no-sign-request --endpoint-url http://<IP_VICTIM>:9000 s3api get-bucket-policy --bucket huguelogistics-data

Si lo queremos filtrar para ver mejor seria algo asi:

aws --no-sign-request --endpoint-url http://<IP>:9000 s3api get-bucket-policy --bucket huguelogistics-data | jq -r '.Policy | fromjson | .Statement[] | {Effect, Principal, Action, Resource, Sid}'

Info:

{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "*"
    ]
  },
  "Action": [
    "s3:ListBucket",
    "s3:GetBucketPolicy",
    "s3:GetObject"
  ],
  "Resource": [
    "arn:aws:s3:::huguelogistics-data",
    "arn:aws:s3:::huguelogistics-data/*"
  ],
  "Sid": "AllowPublicReadPolicy"
}

Veremos que esta funcionando correctamente, por lo que sabiendo todo esto vamos a probar a descargarnos el archivo que subimos al servidor anteriormente de la nube.

aws --no-sign-request --endpoint-url http://<IP>:9000 s3 cp s3://huguelogistics-data/<FILE_NAME>.xlsx .

Y con esto veremos que ha funcionado toda la vulnerabilidad, ya que nos esta descargando el archivo de forma correcta.

[EXTRA] Configuracion en un Apache2

Si queremos alojar el bucket en un entorno web como por ejemplo con apache2 podremos realizar lo siguiente:

apt install apache2
service apache2 start
cd /var/www/html

Ahora vamos a plasmar toda la configuracion en dicha pagina web:

composer require aws/aws-sdk-php

Vamos asignarle los permisos necesarios, junto con las configuraciones necesarias:

chmod -R 755 /var/www/html
chown -R www-data:www-data /var/www/html
a2enmod rewrite
service apache2 restart
apt-get install -y php-gd
composer require phpoffice/phpspreadsheet

Y ya con esto podremos implementar PHP como pagina web, para poder implementar sistemas de autenticacion, validaciones, etc... Con PHP.

Last updated