시나리오 개요
Starting as an anonymous outsider with no access or privileges, exploit a misconfigured reverse-proxy server to query the EC2 metadata service and acquire instance profile keys. Then, use those keys to discover, access, and exfiltrate sensitive data from an S3 bucket.
시나리오 목표
S3 버킷 내의 confidential 파일 다운로드(탈취)
시나리오 세팅
./cloudgoat.py create cloud_breach_s3
solutions 디렉토리 내의 cloud_breach_s3 시나리오 제작 Terraform이 실행됨
타겟 EC2 인스턴스의 IP만 주어진 채로 시나리오가 시작된다.
Solution
1. 인스턴스 IP를 기반으로 타겟 분석
주어진 정보로는 인스턴스 IP 단 한개이다. 먼저 포트스캔부터 진행해 보았다.
SSH와 웹 포트가 하나 열린 것으로 확인되었다.
문제에서 reverse proxy 서버라고 하였으므로 웹 포트부터 살펴본다.
이 서버는 EC2 메타데이터 서버로 request를 전송하도록 구성되었다고 한다. 그리고 host 헤더를 변조하라고 너무 대놓고 나와있다.
EC2 메타데이터와 관련된 내용은 이전에 정리한 적이 있으므로 해당 글을 먼저 보고오면 도움이 될 것이다.
Host 헤더를 EC2 메타데이터 서버인 169.254.169.254로 설정하고 Request를 전송해본다.
인스턴스 외부에서 전송한 Request가 EC2 메타데이터 서버로 전송된 것을 확인할 수 있다.
2. EC2 Metadata Exploit
EC2 메타데이터에 접근할 수 있는 상황이다. 여기서 가장 먼저 생각할 수 있는 것은 인스턴스에 부착된 IAM Role이 있다.
http://169.254.169.254/latest/meta-data/iam/security-credentials
iam/security-credentials 경로로 접근하면 해당 인스턴스에 부착된 IAM Role을 확인할 수 있고, 실제로 Role이 부착되어있는 것도 확인할 수 있다.
해당 IAM Role을 탈취하도록 한다.
3. 탈취한 IAM Role로 S3 버킷 접근 및 리소스 탈취
이제 탈취한 IAM Role로 시나리오의 목표인 S3에 접근해보도록한다.
aws s3 ls --profile [탈취한 IAM Role]
aws s3 sync s3://[버킷명] ./ --profile [탈취한 IAM Role]
문제 제목과는 조금 다르게 EC2 SSRF에 가까운 모습을 보인다.