본문 바로가기

Personal/Cloud

CloudGoat 실습 - sqs_flag_shop

db랑 연결된 웹을 띄우려면 create 과정이 굉장히 오래 걸렸던 기억이 난다...

한 10분 넘게 기다려준다.

오래 기다렸더니 완료된 모습을 확인할 수 있다.

web에 ip를 통해 접속해준다.

쇼핑몰 페이지가 나온다. 우리는 여기서

돈을 100,000,000원으로 만들어서 Flag를 구매해야 한다.

Move to Cash Charge Page!로 접속해보자.

 

3개의 버튼이 보인다. 마지막 버튼인 10을 충전하는 버튼을 눌러보자.

눌렀더니 메인 화면으로 이동되고, 돈이 3010으로 10 늘어나는 것을 확인할 수 있었다.

이제 웹 페이지의 코드를 확인해봐야 겠다.

그 전에 시나리오를 처음부터 다시 풀어보자.

start.txt를 읽어준다.

프로필을 등록하자.

프로필 등록 후 Arn(Amazon resource name) 까지 자세하게 확인해줬다.

Arn 맨 뒤가 user name이다.

그걸 사용해서 어떤 정책이 연결되어 있는지 출력한다.

아래를 자세히 보면 역할이 하나 있다.

해당 역할의 정책을 살펴보자.

sqs_scenario_policy라는 정책이 부여되어 있다.

어떤 정책인지 자세히 보자.

큐url을 얻을 수 있고, 메시지를 보낼 수 있는 것 같다.

cash_charging_queue라는 Resource를 보아 캐시를 충전하는데 사용하는 sqs가 있다는 것을 유추 가능하다.

여튼 위에서 assume role이 있었으니까 이걸로 또 조작을 하면 될 것이다. 한 번 해보자.

five라는 이름의 profile 등록을 완료해준다.

이제 어떤 부분을 조작해야 하는지 찾아야 한다.

웹해킹 워게임 문제들에서 단서들을 많이 적어두는 웹 페이지 소스코드를 확인하면, github 주소가 나온다.

github 주소에서 해당 쇼핑몰의 돈 충전이 어떤 로직으로 이뤄지는지 확인할 수 있다.

sqs에서 메시지로 처리되는 것과 lambda 코드를 확인할 수 있다.

메세지의 전달은 {"charge_amount" : cash} 형식으로 해야 한다는 것을 우리는 알았다.

cli 명령어로 sqs queue의 url을 찾고 그 큐에 cash를 100,000,000넣어서 Flag를 구매하자.

프로필의 region 설정을 해주지 않아서 queue의 url이 처음에 나오지 않았다.

다시 configure --profile 명령어로 region을 us-east-1으로 입력해준다.

그 후 queue url을 출력하면 제대로 나오는 것을 알 수 있다. 이제 cash 충전하는 메시지를 queue에 넣으면 된다.

다시 웹에 접속 후 새로고침을 해준다.

돈이 많아진 것을 알 수 있다. 이제 Flag를 구매하자.

Order 버튼을 누른 후 Move to Receipt Page! 를 눌러서 영수증 페이지로 들어가자.

Data를 확인할 수 있다. 

우리가 찾던 Flag는 cg-secret-string-bob12-c.g.v 라는 것을 알 수 있다.

 

웹 페이지에서 비정상적인 금액임을 검증하는 단계가 없어서 가능했던 취약점이다.

현실에서 이런 일이 발생할 일은 드물겠지만, 웹해킹 CTF 문제를 응용하여 sqs를 활용한 시나리오를 제작했었다.