Write up CTF The big iam challenge
date
Jul 15, 2024
slug
write-up-ctf-the-big-iam-challenge
status
Published
tags
ctf
security
devsecops
summary
IAM (Identity and Access Management) là một dịch vụ của AWS giúp bạn quản lý quyền truy cập vào các tài nguyên AWS của mình. IAM cho phép kiểm soát ai có thể làm gì trong tài khoản AWS của bạn.
type
Post
Challenge: https://thebigiamchallenge.com
IAM (Identity and Access Management) là một dịch vụ của AWS giúp bạn quản lý quyền truy cập vào các tài nguyên AWS của mình. IAM cho phép kiểm soát ai có thể làm gì trong tài khoản AWS của bạn.
Challenge 1

Kiểm tra IAM Policy, ta thấy policy này cho phép tất cả entity có thể tải xuống các object từ bucket thebigiamchallenge-storage-9979f4b và liệt kê các đối tượng trong bucket này nếu các đối tượng đó nằm trong thư mục files.

Thực hiện list bucket, get object và nhận được flag được giấu trong flag1.txt

Submit thành công

Điểm yếu bảo mật
- Truy cập không được kiểm soát, cấu hình cho toàn bộ entity, bao gồm cả những entity không được phép có quyền list bucket và get object.
Biện pháp khắc phục
- Chỉ định rõ ràng các thực thể (users, roles, accounts) được phép truy cập.
Challenge 2

Kiểm tra policy, ta thấy nó đang cho phép tất cả entity đều có quyền send và receive message queue.

Lệnh để nhận các message được gửi tới:

Thực thi lệnh:

Truy cập URl trong body để get flag

Submit thành công

Điểm yếu bảo mật
- Truy cập không được kiểm soát, cấu hình cho toàn bộ entity, bao gồm cả những entity không được phép gửi và nhận message.
Biện pháp khắc phục
- Chỉ định rõ ràng các thực thể (users, roles, accounts) được phép truy cập.
Challenge 3

Check qua policy, ta thấy nó đang cấp quyền thực hiện action subscribe sns cho các tài khoản AWS, với điều kiện các Endpoint phải có đuôi @tbic.wiz.io, có vẻ như họ đang muốn subscribe message qua email có prefix như trên.

"Principal": "*"
- Điều này có nghĩa là chính sách áp dụng cho tất cả các thực thể, bao gồm cả user,
group, role và tài khoản AWS.
"Principal": { "AWS": "*" }
- Điều này có nghĩa là chính sách áp dụng cho tất cả các tài khoản AWS. Đây là cách viếtchi tiết hơn và thường được sử dụng trong các chính sách IAM để chỉ định rõ ràng rằng chính sách áp dụng cho tất cả các tài khoản AWS.
Ta không có email với domain tbic.wiz.io, bây giờ phải tìm cách để bypass condition đó.
SNS có support nhận message qua các giao thức http, https. Ta sẽ tạo url bằng webhook để nhận các request đến với param chứa chuỗi “@tbic.wiz.io” để bypass điều kiện trong policy.
Tạo request subscribe cho 1 url:

Đợi 1 chút, ta sẽ nhận được thông tin verify trên Webhook:

Sau khi truy cập vào SubscribeUrl để verify, sqs sẽ bắt đầu gửi message về url ta đăng ký, sẽ nhận được flag trong message gửi đến:

Submit flag

Điểm yếu bảo mật
- Truy cập không được kiểm soát: Tất cả các tài khoản AWS đều có thể truy cập vào resource dẫn đến rủi ro bảo mật.
- Tấn công từ bên ngoài: Các tài khoản AWS không đáng tin cậy có thể khai thác quyền truy cập này để thực hiện các cuộc tấn công.
- Điều kiện sử dụng trong policy không kiểm soát chặt chẽ, dễ dàng bypass.
Biện pháp khắc phục
- Chỉ định rõ ràng các tài khoản AWS được phép truy cập.
- Điều kiện phải được kiểm soát chặt chẽ, trong trường hợp trên, nếu muốn endpoint là một email, phải thêm điều kiện protocol là email hoặc email-json.

Challenge 4

Kiểm tra s3 policy, ta thấy nó đang cho phép action getObject đối với mọi entity.
Tuy nhiên ở action ListBucket, chỉ cho phép thực thi action khi thỏa mãn điều kiện s3:prefix phải bắt đầu bằng files/* và ARN của principal phải là arn:aws:iam::133713371337:user/admin

Lỗi do vi phạm điều kiện

Bây giờ, ta phải tìm cách để by pass điều kiện thứ 2
"ForAllValues:StringLike": {
"aws:PrincipalArn": "arn:aws:iam::133713371337:user/admin"
}
Sau khi tìm hiểu về key ForAllValues, ta tìm được ý sau:

Tóm tắt: Trong IAM Policy, ForAllValues operator được sử dụng để kiểm tra tất cả các giá trị trong một mảng. Tuy nhiên, khi sử dụng ForAllValues với một key không tồn tại trong authorization context, điều kiện sẽ được đánh giá là đúng. Điều này xảy ra vì tập hợp rỗng là một tập con của tất cả các tập hợp.
Ví dụ về một authorization context

Mà aws:PrincipalArn chỉ tồn tại 1 giá trị trong context, như vậy, đây có thể là một cấu hình sai.
Để điều kiện thứ 2 luôn đúng, ta sẽ phải làm cho aws:PrincipalArn không có giá trị.
Sau khi tìm hiểu, ta biết được truy cập s3 với anonymous user, nó sẽ không bao gồm key PrincipalArn gán trong context, để get bucket với anonymous user, ta sử dụng option no-sign-request.
Thực hiện get flag:

Submit flag:

Điểm yếu bảo mật
- Truy cập không được kiểm soát, cấu hình cho toàn bộ entity, bao gồm cả những entity không được phép có quyền get object.
- Cấu hình ForAllValues:StringLike condition không chính xác dẫn tới có thể bị bypass.
Biện pháp khắc phục
- Chỉ định rõ ràng các thực thể (users, roles, accounts) được phép truy cập.
- Đọc kỹ các tài liệu liên quan trước khi config, như ở trường hợp trên, thay vì sử dụng ForAllValues:StringLike cho 1 key chỉ có tối đa 1 giá trị, ta nên dùng StringLike để kiểm tra, hoặc cấu hình trực tiếp lên Principal.