CTF

[GlacierCTF] Crypto-CryptoShop

오호츠크해 기단 2022. 11. 26. 13:13
728x90

CryptoShop

문제 링크: https://ctf.glacierctf.com/challenges#CryptoShop-68

 

GlacierCTF 2022

ctf.glacierctf.com

SHOP_ITEMS 리스트
"물건 이름" : (가격)
으로 구성되어 있다.

SHOP_ITEMS = {
    "USB Rubber Ducky": 1,
    "Malduino": 2,
    "WIFI Deauther": 3,
    "Bluetooth Jammer": 5,
    "GSM Jammer": 7,
    "Bad USB": 10,
    "CTF-Flag": 1000,
}

FLAG = open("flag.txt", "r").read()

buy 함수를 보니 CTF-Flag를 산다면 FLAG를 출력해주는 것 같다.

def buy(self, name: str) -> Union[ShopTransaction, int]:
        price = SHOP_ITEMS[name]

        if self.balance < price:
            return -1

        self.balance -= price

        if name == "CTF-Flag":
            print(f"Take this: {FLAG}")

        return ShopTransaction(name, price, self.priv_key)

nc pwn.glacierctf.com 13370
우선 포트에 접속해서 username을 입력하니 다음과 같은 메뉴가 떴다.

2번(Buy Item) 메뉴에 들어간 후 Malduino를 구입했다.
Balance가 재화이고 Malduiono는 위에 SHOP_ITEMS 리스트에서 찾아보면 2원인 것을 알 수 있다.
Malduino를 구입하니 5€ -> 3€ 로 돈이 줄어드며 환불 코드(Refund-Code)를 알려준다.

3번(Refund Item)메뉴에 들어가니 환불코드를 제공하라고 한다.
아까 구매하면서 받았던 환불 코드를 붙여넣기 해주었다. 그랬더니 'Successfully refunded'라는 문구가 뜨며 환불이 된 것을 볼 수 있다. 재화 또한 3€ -> 5€로 늘어났다.

여기서 취약점이 있었다.
환불을 무제한으로 할 수 있다는 점이다. 환불을 하더라도 환불 코드는 계속 알고 있기 때문에 무제한으로 환불이 가능하다. 이 점을 이용해서 재화를 1000€까지 늘린다면 CTF-Flag도 구매할 수 있을 것이다.

10€를 모아 Bad USB를 구입한 후

Bad USB 환불을 100번 반복해준다........ㅎㅎ
*여기서 물건의 가격을 SHOP_ITEMS 리스트와 다르게 입력하면 "Error, this refund code does not match the price!" 라는 문구가 뜬다..

1000€를 다 모았으면 이제 CTF-Flag를 구매해준다!!!

glacierctf{RsA_S1gnAtuRe_1ssu3}

원래 이렇게 푸는게 아니겠지만...방법을 몰라 그냥 노가다로 풀었다.