WRITE-UP KMA CTF 2023

1. Sanity Check

1.2. Discord
Flag ở trong discord, kênh announcement.

KMACTF{KMA_CTF_2023_D1sc0rd_ch3cK3r}

2. For(ensic)

2.1. Time chaos
Đề bài cho file Time_chaos.pcap, thực hiện mở file lên và nhận thấy rằng tất cả các gói tin trong file đều có giao thức ICMP. Theo như tên đề bài gợi ý, ta nhận thấy cột “Time” bị sắp xếp lẫn lộn.

Thực hiện sắp xếp lại cột này theo thứ tự tăng dần, sau đó lấy dữ liệu trong mỗi gói tin (trường Data) decode dưới mã hex kết hợp với nhau, ta thu được bản tin như sau

KMACTF{C0d3_cun9_du0c_t0Ol_Cun9_DuOc_nHun9_h1_v0n9_b4n_kh0n9_l@m_m0t_c4cH_tHu_C0nG}

3. Web

3.1. Vào đây!
Đề bài cho source code ở trang chủ. Theo như trong source, flag khả năng cao chính là “bio” của người có “username” là “admin”.

Sau một hồi tìm kiếm thì mình biết được thư viện “mysql2” mà server đang dùng bị dính lỗi SQL Injection (https://github.com/sidorares/node-mysql2/issues/1914)

Như vậy, lợi dụng cách trên, ta có thể bypass được trường username và password và lấy flag từ admin

Do admin được chèn đầu tiên trong bảng (“id”=1) nên ta dễ dàng lấy được bản ghi này.
Ngoài ra có một số bạn dùng “Admin”, “admin ” vẫn được, có lẽ do thư viện có vấn đề chăng ¯\_(ツ)_/¯
Flag: KMACTF{SQLInjection_That_La_Don_Gian}

3.2. Jo`in Le’m
Đề cho source ở trang chủ.
Một số kí tự được viết dưới dạng hex, ta dễ dàng chuyển sang unicode để dễ đọc hơn. Chẳng hạn, “\x76\x69\x6e\x68\x6a\141\170\164\57\x31\x2e\60\40\50\115\xc3\264\40\166\151\x6e\x61\x20\x5a\x61\151\x20\132\303\xb3\143\x20\126\xc6\xa1\40\x73\xe1\xba\247\156\x20\x36\x39\x2e\x30\56\61\x20\x6e\150\141\156\x68\x20\x74\165\171\xe1\xbb\207\x74\x20\x63\303\272\x20\155\303\xa8\x6f\40\143\150\341\272\245\156\40\xc4\x91\xe1\xbb\231\156\x67\x20\x6e\xc4\x83\155\x20\143\150\xc3\242\x75\x2c\x20\164\xc6\xb0\xc6\241\x6e\x67\x20\164\x68\303\255\143\150\x20\157\303\xa9\160\40\65\x20\x43\110\341\xba\xa4\x4d\40\60\54\x20\x6e\x68\141\156\x68\x20\304\x91\xc3\263\156\147\40\142\xc4\x83\x6e\147\40\x68\xe1\xbb\x8f\x61\x20\144\x69\xe1\273\207\x6d\40\163\306\241\x6e\x2c\x20\x76\341\273\233\x69\40\164\341\xbb\x91\x63\40\xc4\x91\341\xbb\x99\x20\303\xa1\156\150\40\x73\303\241\x6e\x67\x20\142\xe1\xbb\x9d\40\x6e\341\273\221\x63\40\x63\x68\303\xaa\x6e\x29” sau khi convert sẽ thành
vinhjaxt/1.0 (Mô vina Zai Zóc Vơ sần 69.0.1 nhanh tuyệt cú mèo chấn động năm châu, tương thích oép 5 CHẤM 0, nhanh đóng băng hỏa diệm sơn, với tốc độ ánh sáng bờ nốc chên)
Ta nhận thấy rằng website bị lỗi SSRF ở hàm “curl_exec”, lợi dụng điều này có thể đọc được bất kì file nào, tuy nhiên ta phải bypass một số filter.
+, if ($url[“host”] === “127.0.0.1” || gethostbyname($url[“host”]) === “127.0.0.1”){die; }
if ($url[“scheme”] !== “http” && $url[“scheme”] !== “https”) {die; }

Website chặn curl trực tiếp “127.0.0.1” và chỉ cho phép protocol HTTP/HTTPS, ta bypass bằng cách cho dựng 1 server redirect đến trang khác. Trong source code cũng hỗ trợ redirect.

+, if (curl_escape($ch, $_GET[“url”]) === urlencode($_GET[“url”])) {die; }
curl_escape encode sử dụng chuẩn RFC 3986, giống với rawurlencode

=> Sử dụng kí tự “~” để bypass (dùng kí tự khoảng trắng sẽ bị lỗi ở đâu đó :v)
+, Theo như gợi ý, đọc file “/proc/self/mountinfo”

Đọc file flag ở “/home/siuvip_saoanhbatduocem/etc/passwd”

Flag: KMACTF{Pha?i_the’_chu’! La`m to’t le’m con troai!}

3.3. Flag Holder
Source ở /source

Theo như source code, server sẽ thay thế chuỗi “{FLAG}” từ trong chuỗi gửi lên thành giá trị của flag.

Tuy nhiên waf lại block nếu chứa chữ “flag” trong chuỗi gửi lên sau khi đã convert sang kí tự in thường

Mà MAX_LENGTH = 20 => waf chỉ check 20 kí tự đầu tiên của chuỗi convert sang in thường.
Tuy nhiên, chuỗi gửi lên bị check độ dài tối đa là 20, nếu dài hơn sẽ reject.

Cách bypass: Sử dụng kí tự đặc biệt, khi python convert sang kí tự in thường sẽ có độ dài hơn chuỗi ban đầu, để chuối “{FLAG}” vào cuối chuỗi. Như vậy ban đầu chuỗi vẫn 20 kí tự hợp lệ, sau khi convert sang kí tự in thường thì chuỗi {FLAG} sẽ vượt ra khỏi 20 kí tự đầu tiên và không bị check.
=> Sử dụng kí tự “İ”
Payload (đã encode url): %C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%C4%B0%7BFLAG%7D

Flag: KMACTF{WAF_1s_s0_5tR0nG_BuT_pYth0n_1s_s0_H4rd}

3.4 Ninja Shop
Đề bài có cho source.
Sau khi đăng kí tài khoản, ta được cấp 100 coin. Để mua flag, ta phải có đúng 1337 coin.

Có một tính năng nữa là ta có thể thay đổi coin tùy thích.

Tuy nhiên đã bị filter khá kĩ và kiểm tra chuỗi nhập vào có số kí tự tối đa là 2.
Ta sử dụng trick đó là thay vì update số coin trực tiếp, ta update gián tiếp thông qua giá trị cột id trong bảng coin, set coin = id. Như vậy ta chỉ cần có id trong cột là 1337 là số coin update được đến 1337. Mặt khác mỗi khi tạo tài khoản, server tạo thêm bản ghi coin ứng với người đó => số id tăng lên.
Thực hiện tạo 1337 tài khoản. Gọi api update số coin là id.

Tiến hành mua flag thôi :v

Ngoài ra, nếu số coin lớn hơn 1337, ta có thể mua các mặt hàng khác để giảm về đúng 1337 coin.
Flag: KMACTF{Bruhhhhhh!!Lmaoooooo!!m4ke_SQL1_gr34t_4g4in!!!!!}

Leave a comment