yubyeong

CloudGoat 오픈소스 New Scenario 제작 및 Pull Request 요청 본문

클라우드(Cloud)

CloudGoat 오픈소스 New Scenario 제작 및 Pull Request 요청

yubyeong 2025. 12. 23. 16:37

CloudGoat는 클라우드 보안 연습을 위해 만들어진 의도적으로 취약한 AWS 환경입니다.

 

  • 목적: AWS에서 실제로 일어날 수 있는 보안 사고를 실습으로 연습하게 해주는 오픈소스 워게임
  • 형태: 여러 개의 취약한 시나리오(랩) 가 준비돼 있음
  • 누가 만들었나: Rhino Security Labs 보안 연구팀
  • 환경: AWS (IAM, EC2, S3, Lambda 같은 서비스들 사용) -> Terraform 코드로 사용자가 직접 환경 구축.

밑에 내용은 새로운 시나리오를 제작하여 PR 요청을 해봤습니다.


 

s3_version_rollback_via_cfn

시나리오 리소스

  1. 1 IAM User
  2. S3 x 1

시나리오 시작

  1. AWS Access Key/Secret Key (기본 권한)
  2. S3 웹사이트 주소 (정적 웹사이트 호스팅 URL)

시나리오 목표

  • 숨겨진 /index.html 이전 버전을 복원하여 플래그 페이지를 노출시키기

시나리오 요약

💡한 스타트업에서는 서비스 초기 개발을 빠르게 배포하기 위해 AWS S3를 이용한 정적 웹사이트 호스팅으로 프로토타입 사이트를 운영하고 있다.
이 사이트는 외부 고객을 대상으로 한 테스트 페이지이며, 웹 접근 제한은 따로 걸려 있지 않다.
개발자가 /index.html에 플래그를 파싱해오는 관리자 페이지를 실수로 잘못 올렸다. 곧이어 덮어쓰기된 정상 index 페이지를 업로드하였다. 이러한 덮어쓰기를 방지하기 위해 객체를 Governanace 모드로 잠금한다. 하지만 S3 Versioning Enable 상태로 전에 관리자 페이지를 올렸던 버전이 남아있었고 이를 복원하면 플래그를 얻을 수 있다.

Walkthrough

  1. S3 웹사이트 접속 → 정적 사이트에 접속
  2. S3 버킷 탐색 → 객체 리스트, 버전 리스트 조회
  3. Index.html 이전 버전 확인 → index.html의 예전 버전 ID 확인 → flag.txt 내용확인도 불가.
  4. 복원 시도 → 실패 (put,copy object 권한 X)
  5. index.html 예전 버전 내용 확인 → flag.txt를 파싱하는 로직 확인.
  6. 객체 잠금 확인 → 잠금 정보 (Governance 모드) 확인 → (약간의 페이크)
  7. 권한 상승 시도 → 주어진 Cloudformation Create Stack 권한으로 Lambda Invoke (객체 삽입)
💡출제자 의도 : 권한 제한과 객체 잠금으로 보안상으로 문제가 없다 생각하지만 PutObject 권한만 얻는다면 잠금을 무시하고 객체를 바꿀 수있다. (S3의 버저닝은 객체를 덮어쓰는 것이 아닌 쌓아올리는 것이기 때문이다. CopyObject 권한은 정책에서 지정하는 권한이 아니라 PutObject + GetObject 권한 조합으로 동작. 결론은 CopyObject의 권한도 Put과 같이 동작.)
-> 사실상 객체 잠금은 버저닝과 함께 조합하여도 putobject 권한을 획득하면 의미가 없는 보안 설정.
--> 객체 잠금은 S3에 저장된 객체를 일정 기간 동안 삭제하거나 수정하지 못하도록 보호하는 기능이며,
버저닝이 활성화된 버킷에서 과거 객체 버전을 기반으로 새로운 버전을 생성하는 행위까지 제한하는 기능은 아니다.

   8. 이전 버전 복원 → 이전 버전 ID로 객체에 새로운 버전 생성. →웹에서는 덮어쓰기의 효과

   9. S3 웹 사이트 재접속 → index.html 복원으로 플래그 노출.

문제 핵심

💡1. 객체 잠금 + 버저닝 조합의 취약점 파악.
     2. Cloudformation 스택 생성으로 AWS Privilege Escalation(권한 상승→ 람다 함수 생성) → IAM Role과     Cloudformation의 취약한 권한을 연계.

Route

https://github.com/jeonyubyeong/cloudgoat/tree/master/cloudgoat/scenarios/aws/s3_version_rollback_via_cfn

 

cloudgoat/cloudgoat/scenarios/aws/s3_version_rollback_via_cfn at master · jeonyubyeong/cloudgoat

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

github.com

위의 링크가 작업 내용이며 이 내용으로 Pull Request 요청 완료. (Terraform 코드, Readme, CheatSheet를 확인할 수 있다.)

관심있으신 분들은 풀어보시면 좋을 것 같아요!!! (풀이법은 CheatSheet 확인!)
(CloudGoat 환경 구축했으면 CG 시나리오 디렉토리에 직접 위의 TF 코드 추가 후 Create 하면 됩니다.)
(밑의 코드는 위의 링크의 테라폼 코드를 이용해서 구축하면 됩니다. - cgid는 예시)

terraform init
terraform apply -var="cgid=test123"
terraform output -json
terraform destroy (test123이랑 디폴트 프로파일 사용자 입력)

삭제할 때는 Readme 읽어보시면 적혀있는데 코드안에 쉘 스크립트를 먼저 실행하고 destroy 하여야합니다. 
객체 잠금 으로 인해 destroy 명령어로 바로 안 지워집니다.. -> CG 명령어 & Terraform 명령어 모두

<여담>

Pull Request를 요청하고 Rhino Security Labs 디스코드에 들어가서 New Scenario로 머지 승인 요청을 하였다.

위에처럼 1차 검토 승인? 되었고 담당자의 연락을 기다리고 있는데 연락이 너무 안와서 문의해보니 회사의 담당 인원들이 퇴사하고 펜테스팅팀이 너무 바쁜 결과로 좀 더 기다려야 할 거 같다고 연락이 왔다...  7월에 올렸었는데 아직까지는 기약 없이 기다려보고는 있다... Merge 승인이 될지는 모르겠지만 해당 프로젝트에 노력을 제법 했어서 아까워서라도 기록을 남겼다 ㅎㅎ