# [HTB] WS Todo Writeup
## Giới thiệu
Đầu tiên khi vào một bài Lab nào thì mình cũng sẽ đọc code và mở web lên vọc vạch chút xem như thế nào

Sau một hồi mày mò thì mình sẽ xác định được mục tiêu mình cần đạt được và những điểm đáng ngờ
:::info
:bulb: Lại là một bài Lab thú vị với NodeJS, trước đây mình cũng từng là dev dùng MEAN stack nên khi gặp bài này thì cũng khá tự tin chút xíu. HEHEE
:::
## Mục tiêu và đối tượng
1. Mục tiêu
1. Flag nằm ở Websocket GET với UserID là 1 (wsHandler.js)
2. Đối tượng đáng ngờ
1. @wll8/express-ws: Đây là library dùng ngoài và mình đọc code thấy khá đơn giản, cũng như có loop để tạo object tùy ý (khả năng PP) (các thư viện khác mình không tìm ra CVE nào với version thế nên mình coi đây là nơi có thể khai thác được)
2. LOC:28 file wsHandler.js tại đây lưu dữ liệu là một chuỗi và có thể thêm property cho object tùy ý vì input là của mình thêm vào. kkkkkk
3. Endpoint /report vì nó cho phép mình mở ra một trang web bất kì trên browser kể cả local và còn đăng nhập với account đã định trước nữa. (Này giống cái hint cho mình nè)
Với các đối tượng trên thì mình có thể mường tượng ra trong đầu cách để đi vào lấy flag là mình cần tạo một web có khả năng request khi đưa vào trong report tận dụng session id lưu ở cookie mà browser phía server đã đăng nhập trước đó để lấy dữ liệu và tuồn ra phía của mình. Hoặc là mình sẽ pollution cái userID thành 1 để reqeust lấy được. Đây là 2 hướng mình có thể khai thác.
## Thực hiện thôi
1. Plan 1: thử PP
https://github.com/wll8/express-ws
Đây là link lib mà mình kiếm được từ lib, ver lúc mình clone xuống thì đã là ver 1.0.5 nên mình sẽ chuyển sang version 1.0.3 cho đúng với prj để nghiên cứu.

mình tìm thấy được 2 hàm này có thể tạo Object với property do người dùng nhập vào, nhưng hàm Params thì sẽ bỏ qua vì nó cần phải truyền params lúc code nhưng prj thì không cần. Nhưng theo kinh nghiệm mình thì với loop như vậy chỉ dừng ở mức Object Pollution chứ chưa đến được Prototype Pollution nên là mình nghĩ đây không phải là plan tốt.
2. Plan 2: Craft một web có khả năng request xuống phía local tận dụng cookies
Ở đây thì mình thử gửi payload là một url ngoài xem thử nó có request ra không nha

Mình build Live Server chạy port 5500 và dùng ngrok để public nó ra ngoài và dùng link đó gửi qua /report

Có request tới để tạo web nhưng chưa kịp reqeust sang requestrepo để đưa dữ liệu ra ngoài, có vẻ như browser bị close khá là nhanh. hmmmmmmmm
Mình lại phát hiện ra Lab có cung cấp cho mình một trang tester và nhận param html dùng render ra. Có vẻ đây là hint cho mình bởi vì dùng local thì tốc độ load nó vẫn nhanh hơn khi load về phía server ở mình.
Vậy mình thử convert đống trên sang html encode nhé

Ta thử dùng input này nhét vào trang đó thử xem

Ngon lành cành đào
Trang tester sẽ ở port 8080 bởi vì ta soi file config ở đây

đồng thời bên requestrepo cũng nhận được nội dụng request luôn, vậy là hướng khai thác này hợp lí hơn là build server riêng

decode ra thì mình thấy chưa có task nào nên mình sẽ thêm task vào nhé vì flag nó sẽ ở trong quote

Ở đây ta nhận được dữ liệu

Nhưng mà bị encrypt mất chưa có key để decrypt.

Đây là 2 hàm mà en và de cần key, như dữ liệu trên mình đã có cipher là iv và content, h chỉ thiếu mất cái key là secret được lưu trong table user với userid là 1. để mình request secret xem thử sao.

Im hơi lặng tiếng và không nhận bất cứ dữ liệu nào dược gửi ra. Vậy phải vọc xem trong code có thêm thứ gì bẩn bựa để mình làm không

Tại vì mình không nắm sâu về SQL nên nhờ ChatGPT hỏi xem các ý tưởng và mình nhận thấy nếu dữ liệu quá 255 thì sẽ lấy từ 0 - 255 giống hàm slice() bên js. Điều này cộng thêm với đối tượng đáng ngờ b) ở phía trên mình liệt kê thì mình sẽ craft ra một secret fake của mình và tạo ra object vừa đủ 255 kí tự, để lưu vào db nó sẽ tự động xóa đi cái secret thật.
kkkk

mình dùng console craft cho nhanh :))))))))
Xong payload bây h test thử xem ý tưởng mình đúng chưa

Ta bế hàm decrypt đấy ra và thử riêng cho nhanh

Tadaa, đã cap được flag, mình che một nửa rồi nhá. HEHE