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}
원래 이렇게 푸는게 아니겠지만...방법을 몰라 그냥 노가다로 풀었다.
'CTF' 카테고리의 다른 글
[Swing CTF] Reversing-OPEN THE DOOR (0) | 2022.11.27 |
---|---|
[Swing CTF] Misc-QR Discovery (0) | 2022.11.27 |
[Swing CTF] Pwn-SimpleBOF (0) | 2022.11.26 |
[Swing CTF] Misc-babymath (0) | 2022.11.26 |
[Swing CTF] Web-Baby Sign (0) | 2022.11.26 |