Writeup KMA CTF 2024
Last updated
Last updated
Bài này cho mình một trang web, có tính năng Signup và Signin đều không dùng được nên mình dirsearch
và thấy được part 1 của flag trong file robots.txt
:v
Vì đây chỉ là bài warmup nên mình đoán được là sẽ tìm các part tiếp theo trong các file public static của web.
🚩 Flag:
KMACTF{p1Ckleb4ll_WitH-uU_piCklepal_5a6b89113abb}
Bài này cho mình một trang web có tính năng check và list ip. Tại endpoint /check-ip
ta có đoạn code sau:
Ta có thể thấy mục đích của bài này cực kỳ đơn giản là bypass được hàm ip_address
tại endpoint /check-ip
từ đó khai thác SQL injection.
Mình dùng Pycharm để dựng local debug và nhảy vào source code của module ipaddress
để xem cách nó check ip.
Sau một lúc debug thì mình phát hiện nếu IP address là IPv6 thì trước khi convert string sang ip để check valid thì ta sẽ đi qua method _split_scope_id
Tại hàm _split_scope_id
sẽ split IPv6 thành 2 phần với delimiter là dấu %
. Phần đầu tiên sẽ là địa chỉ IPv6 được module xử lý tiếp để check valid, còn phần sau dấu %
được xem là scope id và bị bỏ qua không được check
Dựa vào hành vi này ta có thể bypass hàm ip_address
và trigger SQL injection với payload sau:
Dump table name
Dump column name
Đọc flag
🚩Flag:
KMACTF{actually__this_flag-is_not_so_malicious_but_the_ipv6_is}
Bài này cho mình một trang web chạy bằng spring boot với tính năng upload file và đọc file, mục tiêu là RCE. Nhìn sơ qua source code thì mình thấy có thể upload và ghi đè file vào bất kỳ đường dẫn nào nào (trừ các đường dẫn trong blacklist) và có thể đọc file từ bấy kỳ đường dẫn nào.
Upfile vào đường dẫn bất kỳ
Black list upload file
Read file từ đường dẫn bất kỳ
Vì blacklist là không thể bypass hoặc ít nhất với khả năng hiện tại của mình thì mình không thể bypass được nên mình tìm một đường dẫn khác mà có thể lợi dụng upload file để RCE.
Sau một hồi tìm kiếm thì mình đã tìm ra câu trả lời từ 2 bài blog sau:
Ý tưởng exploit là ta sẽ replace file charsets.jar
trong thư mục lib
của JDK. Sau khi thay thế thì gọi đến
Khi Header Accept có giá trị charset thì Spring sẽ parse header lấy ra giá trị <custome_charset> và lookup
Vì ta đã thay thế lib charset bằng malicous charsets.jar. Nên ta chỉ cần gọi đến charset mà ta đã modify để RCE -> Win
Tuy nhiên còn 1 vấn đề cần quan tâm là ta chỉ có thể exploit khi spring chưa gọi đến lib charset, ngay khi spring đã gọi đến lib này rồi thì cho dù ta có replace thế nào đi nữa exploit cũng sẽ không hoạt động. Nên ta sẽ có 1 cơ hội duy nhất để RCE.
Ý tưởng là như vậy bây giờ thì cùng exploit thoi.
Đầu tiên để biết được đường dẫn JDK của chall mình chạy đoạn code java sau lên docker
Khi build và chạy mình có kết quả
Ta sẽ tiến hành replace file /usr/lib/jvm/java-1.8-openjdk/jre/lib/charsets.jar
bằng file charsets.jar độc hại trong link này. File này dùng để test exploit và khi trigger sẽ tạo file ở thư mục /tmp
Vì malicous charsets.jar overwrite hầu hết các charset bằng code RCE nên ta có thể gửi request trigger với bất kỳ charset hợp lệ nào, ví dụ như sau:
Nếu trigger thành công ta sẽ nhận response có status code 500, còn nếu failed ta sẽ nhận response có status code 406
RCE thành công
Bây giờ ta chỉ cần thay đổi code thực thi để đọc flag thôi. Tuy nhiên đây là bước khiến mình mất nhiều thời gian và bị lỗi nhiều nhất. May mắn khi build file jar bằng java trong môi trường docker thì thành công luôn.
Các bước build của mình như sau:
Git clone code gen payload về máy docker
Chỉnh sữa code RCE để đọc flag, mình chỉnh file IBM33722.java
để cat flag vào thư mục /tmp/endy
Cd vào thư mục charsets và tiến hành build file jar với các câu lệnh sau
Khi build ra file class thì ta sẽ bị 7 warning, ta cứ mặc kệ tiếp tục build ra file jar thì payload vẫn hoạt động bình thường
Khi này mình có được file charsets.jar
, việc cuối cùng là tải file về máy, upload vào challage và lấy flag thôi
Upload file
Trigger
Đọc flag
🚩Flag:
KMACTF{ayoooo00oo0ooo0o0o00o0ooooo000oo0oo0o00000}
Bài này cho ta một trang web như sau
Khi nhập tên và password thì ta được cấp 1 jwt và redirect đến dashboard
Tại đường dẫn robots.txt thì ta có được hint như sau
Sau một vài giờ cố gắng để hiểu thuật toán trong vô vọng thì mình có được đoạn script để generate jwt theo ý muốn như sau bằng cách search gg ≽^•⩊•^≼:
Cre: https://ctftime.org/writeup/26445
Mình chỉ cần thay 2 jwt làm mẫu và thêm padding vào giá trị r là code chạy ngon lành. Mình chỉ cần thay giá trị quirk thành HACKING là sẽ mở khóa được chức năng mới của web.
Tại đây thì mình có thể upload được file docx và trang web sẽ trả về response như sau khi mình upload thành công
Dựa vào response này mình xác định sẽ có 3 khả năng để exploit là
XSS
XXE
Zipslip/Symlink
Mình fuzz cả 3 trường hợp trên nhưng đều không ra kết quả khả quan. Sau một hồi bế tắc thì mình để ý thấy khi upload thành công web sẽ đếm số lượng words trong file docx, mà trong cấu trúc file docx ta có thể thay đổi giá trị của tag <Words> trong file docProps/app.xml
-> có thể XXE và đọc file
Mình tạo 1 file docx và unzip để bắt đầu chỉnh sữa file docProps/app.xml
Sau đó mình nén lại thành file docx và upload
🚩 Flag:
KMACTF{3cd54_n0nc3_r3u53_4774ck_4nd_xx3_up104d}