# [FPTU SECATHON 2023] - ehc_social_network - WriteUp ## Giới thiệu Kì CTF này mình không đi thi nên là có lượm được source về để vọc vạch. Được biết thì chall này nhiều điểm nhất, nó có 2 FLAG và tổng 2 FLAG là gần 1k điểm nên là khá thú vị. Lab này mình sẽ build local chứ server thật đã đóng nên mình k viết WU kịp trên con real > Lưu ý: Lab này nên dùng Linux nếu không code sẽ thực thi sai Link source chall: https://github.com/an040702/ctf/blob/main/ehc_social_network.zip Tổng quan sơ qua về chall này thì vọc vạch về PP phía Node để RCE và lấy flag. ## Mục tiêu và đối tượng 1. Mục tiêu 1. Ở Flag 1 thì nằm ở endpoint /get_tweet và flag sẽ được response nếu request đúng 2. Ở Flag 2 thì là một file nằm trên server. 2. Đối tượng đáng ngờ 1. LOC:25 tại đây sử dụng hàm random nhưng lại chưa gọi thực thi function, chỉ gọi tới tên biến function, điều này biến từ random thành không random ![](https://hackmd.io/_uploads/HyJpsYZRh.png) 2. Và khi đã biết salt cố định thì hàm hash chúng ta có thể control dễ dàng ![](https://hackmd.io/_uploads/Syb0jtZC2.png) 3. Đồng thời tại đây tồn tại một function bị PP ![](https://hackmd.io/_uploads/SkH13FbA3.png) ## Triển Từ các dữ kiện trên và đọc code thì ta chia thành 2 phase như đề bài đã cho, capture Flag 1 để có được jwt access vào phase 2. Vào phase 2 thì PP lên RCE để lấy được flag 2 nằm trên phía server Như dữ kiện a) và b) đã nêu trên thì mình sẽ bế code ra ngoài để lấy hash của status thứ 0, vì flag được add tại ví trí đầu tiên trong array nên status sẽ là số 0 ![](https://hackmd.io/_uploads/BybW2FbAh.png) Chạy riêng code hash để lấy được hash tại status 0 ![](https://hackmd.io/_uploads/By6ZhFZ0h.png) Sau khi có được hash 0 thì gửi request để lấy Flag đầu tiên (lưu ý đây là flag local) ![](https://hackmd.io/_uploads/ryczhYZ03.png) Tiếp đến lấy flag đó nhập vào site hidden để lấy jwt từ đó để gửi request lên /quote1 hoặc /quote2 Tại phase 2 mình xác định sẽ PP để lên RCE, trong code sẽ không sử dụng child_process nên buộc mình phải kiếm trong prj thằng nào sử dụng child_process sẽ triển. Như trong hacktricks có đề cập tại mục RCE thông qua Require thì có thể thực thi theo hướng như sau (link hacktricsk để dưới): * Tìm kiếm file nào có sử dụng child_process * Control require path đến file js sử dụng đó * Và pollute các cmdline để RCE https://book.hacktricks.xyz/pentesting-web/deserialization/nodejs-proto-prototype-pollution/prototype-pollution-to-rce#pp2rce-vuln-child_process-functions Và bất kì dự án node nào thì đều dùng npm hoặc yarn, và một trong 2 thằng đều có các tập tin sử dụng child_process. Đồng thời trong code ta có thể kiểm soát được require path tại endpoint /quote1, đây là điều kiện tiên quyết để ta RCE. ![](https://hackmd.io/_uploads/rkKS2tbAn.png) Thực hiện mò mẫm path traversal để check xem có tồn tại file changelog.js như hacktricks đề cập không thì rất may là có Đây là request không tồn tại file ![](https://hackmd.io/_uploads/rJFUnFWAn.png) Đây là request kiểm tra tồn tại file changelog.js sau path traversal 3 folder ![](https://hackmd.io/_uploads/BkBPhtbCh.png) Sau khi check tồn tại file thì thực thi pollution tại execSync có trong file changelog.js đó (tại sao biết file đó dùng execSync thì hãy mở file sẽ thấy tại LOC 16) Ta sẽ PP thông qua endpoint /quote2 vì tại đây dùng hàm combine phía trên c) để pollute cmdline execSync như hacktrick hướng dẫn https://book.hacktricks.xyz/pentesting-web/deserialization/nodejs-proto-prototype-pollution/prototype-pollution-to-rce#execsync-exploitation ![](https://hackmd.io/_uploads/S1Ojntb0h.png) Sau khi đã pollute thì qua endpoint /quote1 để trigger ![](https://hackmd.io/_uploads/S1PF2F-Rn.png) Và đã RCE thành công thông qua PP execSync. Cứ như vậy gửi request outbound ra ngoài lấy Flag cuối cùng (lưu ý đây là Flag Local) ![](https://hackmd.io/_uploads/BJeq3tWAh.png)