KSNCTF write up

KSNCTF write up
Screenshot by myself

Cuộc thi CTF lần đầu tiên được tổ chức tại hội thảo bảo mật nổi tiếng DefCon (Mỹ) lần thứ 5 năm 1997. Ngày nay hàng năm có rất nhiều các cuộc thi CTF được tổ chức trên toàn thế giới theo các quy mô khác nhau. Đơn vị tổ chức thường là các tổ chức, các trường đại học – học viện, viện nghiên cứu… và rất nhiều các cuộc thi CTF được tổ chức bên lề các hội thảo về Security và Hacking.

Các hình thức CTF

Jeopardy

Ở hình thức chơi này, đề bài sẽ là một tập hợp các bài thi ở nhiều chủ đề khác nhau: Web, network, forensic, crypto, binary,… Các bài thi sẽ có độ khó khác nhau mà cũng có điểm số khác nhau. Mục tiêu của mỗi người chơi (hoặc đội chơi) là sử dụng tất cả các kỹ năng, kinh nghiệm của mình để tìm kiếm flag được giấu. Khi tìm được flag thì sẽ ghi điểm, và chiến thằng sẽ dành cho đội nào có điểm cao nhất. Ngoài ra, một số cuộc thi CTF cho điểm thưởng rất cao cho người chơi có thể tìm được flag trong khoảng thời gian ngắn.

Attach & Defense

Đây là hình thức chơi CTF nguyên thủy. Các đội tham gia CTF sẽ được cấp một máy chủ (hoặc một mạng máy chủ) đã cài đặt sẵn nhiều chương trình chứa các lỗ hổng bảo mật. Nhiệm vụ của đội chơi là tìm ra các lỗ hổng đó, tấn công các máy chủ của các đội khác để ghi điểm, đồng thời phải nhanh chóng vá các lỗ hổng trên máy chủ của đội nhà, để tránh bị tấn công bởi các đội khác. Hình thức này khó hơn so với hình thức khác do yêu cầu cơ hơn ở người chơi ngoài các kỹ năng tìm kiếm lỗ hổng bảo mật, khai thác các lỗ hổng đó thì người chơi cần có có khả năng khắc phục các điểm yếu lỗ hổng, bảo vệ hệ thống của mình trước các tấn công từ các đội khác. Đây là hình thức thi này là hình thức gần với thực tế nhất. Các hacker thực hiện tấn công vào hệ thống, các nhà quản trị mạng – chuyên viên bảo mật có nhiệm vụ chống lại các tấn công từ bên ngoài và vẫn phải bảo đảm duy trì hoạt động của hệ thống… Cuộc thi nổi tiếng nhất về dạng này là DEF CON CTF .

Ngoài ra, trong các cuộc thi CTF có thể kết hợp cả 2 hình thức chơi trên.

ksnctf

Trang chủ của cuộc thi này ở đây: http://ksnctf.sweetduet.info/

Đây là một trang thi CTF theo hình Jeopardy. Theo tôi đánh giá, nó rất thích hợp cho những người mới làm quen với CTF hay cả những cao thủ. Các câu hỏi của nó ở đủ thể loại khác nhau liên quan đến các lĩnh vực của bảo mật máy tính. Flag trong các câu hỏi này có định dạng FLAG_123456xyz. Mục tiêu là bạn hãy tìm các flag cho từng câu hỏi. Để ghi điểm và chạy đua với những người khác, bạn hãy đăng nhập bằng Twitter. Trang Web đã được bảo mật để đảm bảo rằng bạn chắc chắn chơi CTF chứ không dùng các cách khác để “hack flag”.

Dưới đây là cách làm một số bài của cuộc thi này, các bài sẽ được sắp xếp theo thứ tự mà tôi cảm thấy khó dần.

Cách giải một số bài ksnctf

1: Test problem

URL: http://ksnctf.sweetduet.info/problem/1

Đây chưa phải là một bài CTF, nó là một bài để test thử hệ thống. Hãy chắc chắn rằng bạn có thể submit flag và ghi điểm.

Flag của bài này là

FLAG_SRORGLnTh2Q5fTwu

10: #!

URL: http://ksnctf.sweetduet.info/problem/10

Flag của câu hỏi này là FLAG_S?????? với S?????? là tên gọi cho chuỗi ký tự #!.

Để giải bài này, đương nhiên bạn cần biết tên của #! là gì. Những ký tự này rất phố biến với các script của Linux/Unix. Và là những lập trình viên, bạn chắc chắn đã nhìn thấy nó nhiều lần. Có thể bạn đã biết tên của nó, hoặc bạn có thể Google (Google là một kỹ năng rất quan trọng khi thi CTF :D), bạn sẽ tìm ra nhiều thông tin lý thú, ví dụ ở đây.

Tên của chuối ký tự này là shebang, và flag của câu hỏi này sẽ là:

FLAG_SHEBANG

20: G00913

URL: http://ksnctf.sweetduet.info/problem/20

Flag của câu hỏi này là: FLAG_Q20_{first 10-digit prime found in consecutive digits of π}

Bạn cần tìm ra số nguyên tố đầu tiên có 10 chữ số trong phần thập phân của π (3.14…). Bạn có thể tính bằng tay :D. Tuy nhiên tiêu đề của câu hỏi này gợi ý rằng “Hãy google”. Bạn có thể sử dụng Google và tìm kiếm từ khóa “first 10-digit prime found in consecutive digits of π” hoặc keyword khác mà bạn thích.

Sau khi Google thì bạn đã biết số nguyên tố đó là 5926535897 và flag của câu hỏi này là: FLAG_Q20_5926535897

Việc đọc các câu trả lời quá dễ dàng có thể khiến cho việc chơi CTF mất hay. Từ những câu hỏi sau, tôi sẽ đưa ra các gợi ý cho các câu hỏi. Và câu trả lời cụ thể hơn sẽ có ở link khác. Bạn hãy cố gắng tìm ra câu trả lời từ những gợi ý của tôi.

25: Reserved

URL: http://ksnctf.sweetduet.info/problem/25

Câu hỏi yêu cầu bạn tìm flag trong một chuỗi những ký tự mà trông như nó bị mã hóa. Thực ra nó đúng là chuỗi đã được mã hóa, nhưng là chuỗi mã hóa của một ngôn ngữ lập trình. Hãy cố gắng tìm ra ngôn ngữ lập trình và cách mã hóa đã được sử dụng, bạn sẽ tìm ra flag của câu hỏi này.

35: Simple Auth II

URL: http://ksnctf.sweetduet.info/problem/35

Đây là một câu hỏi thuộc thể loại Web. Để tìm được flag, bạn phải đăng nhập được vào trang Web http://ctfq.sweetduet.info:10080/~q35/auth.php. Mã nguồn (đã censor) của trang này được đưa ra cho bạn như một gợi ý ở đây, và bạn có thể dễ dàng tìm ra lỗ hổng bảo mật ở đây.

Bạn không cần phải nghĩ đến SQLInjection, câu hỏi này rất dễ và hoàn toàn chưa cần đến nó. Nhìn mã nguồn bạn sẽ thấy rằng, trang Web sử dụng một cơ sở dữ liệu SQLite, và nếu truy cập được đến nó, bạn sẽ biết username và password để đăng. Hãy thử xem.

2: Easy Cipher

URL: http://ksnctf.sweetduet.info/problem/2

Đây là một câu hỏi thuộc thể loại crypto. Bạn cần giải mã một đoạn cipher để biết câu trả lời. Nhìn chuỗi cipher và để ý rằng các dấu cách vẫn còn nguyên, điều đó cho thấy rằng chuỗi này sử dụng cách mã hóa rất đơn giản. Chính xác nó sử dụng cách mã hóa khá cổ điển là mã hóa Caesar. Bạn có thể tìm hiểu về mã hóa Caesar và cách giải mã, brute-force (thử tất cả các trường hợp) là một cách như vậy (chỉ có 26 trường hợp với mã Caesar nên brute-force cũng không mất thời gian lắm)

32: Simple Auth

URL: http://ksnctf.sweetduet.info/problem/32

Ở câu hỏi này, ban cần phải login vào trang Web http://ctfq.sweetduet.info:10080/~q32/auth.php. Gợi ý là mã nguồn của trang Web này http://ksnctf.sweetduet.info/q/32/auth.php

Bạn cần phải login vào trang Web để tìm flag, trang này không sử dụng database nào cả. Và password rất dài, nếu brute-force, bạn cần phải thử 16^62 = 4.5231285e+74 trường hợp khác nhau. Đây không phải là cách khả thi.

Cách làm ở đây là lợi dụng lỗ hổng bảo mật. Nhìn mã nguồn và bạn thấy rằng, bạn cần vượt qua những dòng này để login thành công.

if (isset($_POST['password'])) if
    (strcasecmp($_POST['password'], $password) == 0) echo
    "Congratulations! The flag is $password"; else echo
    "incorrect...";

Hãy tìm lỗ hổng có thể ở đây và khai thác nó. Bạn sẽ tìm flag.

14: John

URL: http://ksnctf.sweetduet.info/problem/14

Nội dung của câu hỏi này là nội dung file passwd của Linux (file lưu trữ password của các user). Để “crack” nó, có một chương trình khá nổi tiếng, mà ngay cả tiêu đề câu hỏi cũng gợi ý đến nó, đó là “John the ripper”. Đây là chương trình để crack các loại password. Bạn hãy Google và tìm hiểu cách sử dụng của nó. Nó sẽ giúp bạn tìm flag cho câu hỏi này, và hãy để ý một chút, câu hỏi có một vài gợi ý khác nữa.

29: Double Blind

URL: http://ksnctf.sweetduet.info/problem/29

Câu hỏi này yêu cầu bạn tìm tác giả của paper. Tất nhiên, ý nó là bạn tìm ra người nào đã tạo ra file đó. Đó là một file docx. Thực ra docx là một dạng file mở rộng của file zip. Đổi đuôi nó thành zip và mở nó bằng các trình giải nén, hãy cố gắng đọc cấu trúc của nó, bạn sẽ tìm ra câu trả lời.

28: Lo-Tech Cipher

URL: http://ksnctf.sweetduet.info/problem/28

Ở câu hỏi này, bạn phải tìm flag từ một file zip

Giải nén file zip này, bạn sẽ thấy 2 file ảnh. Gợi ý của tôi là hãy chồng 2 bức ảnh này lên nhau, bạn sẽ nhìn thông tin được giấu. Tất nhiên không chỉ có thế bạn đã thấy ngay flag, nhưng chỉ thêm một chút thao tác nữa, bạn sẽ tìm ra.

8: Basic is secure?

URL: http://ksnctf.sweetduet.info/problem/8

Đây là một câu hỏi network, với câu hỏi này, bạn cần phân tích một file pcap. Đây là một lưu trữ các gói tin bắt được trong mạng LAN. Để phân tích nó, bạn cần sử dụng một số công cụ, ví dụ Wireshark.

Bạn có thể sử dụng công cụ nào bạn thích, nếu muốn dùng Wireshark, bạn có thể tìm hiểu thêm ở đây

Tiêu đề của câu hỏi này gợi ý rằng, các gói tin gửi đi có sử dụng cách phương thức authentication là Basic. Bạn nên tìm hiểu thêm về phương thức. Nếu đã hiểu rồi, thì việc tìm flag cho câu hỏi này sẽ trở nên rất đơn giản.

22: Square Cipher

URL: http://ksnctf.sweetduet.info/problem/22

Đây là một câu hỏi crypto, bạn cần giải mã một chuỗi cipher 31 dòng và mỗi dòng có 31 ký tự. Gợi ý của câu hỏi này chính là bạn hãy xây dựng nên một hình vuông từ cipher này.

Gợi ý của tôi là, các ký không có nghĩa, chính kiểu của chúng (hoa-thường) mới có thể, hãy thử thay thế chúng xem sao, và hãy nhớ rằng, hãy xây dựng một hình vuông từ chúng. Bạn sẽ tìm ra flag.

5: Onion

URL: http://ksnctf.sweetduet.info/problem/5

Với câu hỏi này, bạn cần giải mã một chuỗi ký tự khá dài. Đây là một chuỗi đã được mã hóa, bằng cách mã hóa ra base64. Bạn có thể dùng các công cụ giải mã để giải nó.

Tuy nhiên, bạn sẽ nhận ra rằng, sau khi giải mã, bạn thu được một chuỗi vẫn bị mã hóa. Gợi ý của tôi là hãy tiếp tục giải mã (tới khi nào không giải mã được nữa), bạn sẽ nhìn thấy điều kỳ diệu. Tuy nhiên, sau khi giải mã base64, bạn sẽ cần một phương thức giải mã khác nữa.

13: Proverb

URL: http://ksnctf.sweetduet.info/problem/13

Với câu hỏi này, bạn cần ssh vào server và chạy chương trình proverb để nhận flag. Chương trình proverb khá đơn giản, bạn sẽ nhận ra hoạt động của nó sau khi chạy thử vài lần. Nó nhận đầu vào là file proverb.txt và chọn ngẫu nhiên một dòng để in ra. Nếu bạn có thể thay proverb.txt thành flag.txt, bạn sẽ tìm được flag.

Tuy nhiên, người ta đã thiết lập quyền user với thư mục, bạn không thể làm gì ở thư mục /home/q13. Gợi ý của tôi là hãy sử dụng thư mục /tmp và symbolic link sẽ giúp bạn.

6: Login

URL: http://ctfq.sweetduet.info:10080/~q6/

Với câu hỏi này, bạn cần phải login vào trang Web http://ctfq.sweetduet.info:10080/~q6/. Bạn có thể sử dụng SQLInjection ở câu hỏi này. Thử điền vào ô ID ' or 1=1-- và bạn đã đăng nhập thành công. Tuy nhiên, như vậy vẫn chưa đủ.

Trang Web cho bạn mã nguồn như một gợi ý và yêu cầu rằng flag chính là mật khẩu của admin. Bạn sẽ cần các kỹ năng SQLInjection nâng cao hơn nữa để giải quyết câu hỏi này.

7: Programming

URL: http://ksnctf.sweetduet.info/problem/7

Với câu hỏi này, bạn cần tìm flag trong một chương trình. Mã nguồn câu hỏi đưa ra là file program.cpp. Thực sự đây là một trick, khiến bạn nghĩ rằng đây là mã nguồn một chương trình C++ (C). Tuy nhiên, biên dịch và chạy như một chương trình C/C++ bạn sẽ chỉ nhận được FROG_This_is_wrong_:(. Đây đương nhiên không phải là flag của câu hỏi.

Hãy để ý rằng, chương trình có quá nhiều dấu cách và dòng trắng. Tất cả chúng đề là không cần thiết với một chương trình C/C++. Tuy nhiên đừng xóa chúng đi hay thay đổi mã nguồn, vì bạn không thể tìm được flag nếu vẫn nghĩ đây là một chương trình C hay C++. Thực ra, đây là một chương trình viết bằng ngôn ngữ Whitespace. Với Whitespace, chỉ có ký tự trắng (cách, tab, xuống dòng) mới có ý nghĩa, các ký tự khác sẽ bị bỏ qua.

16: Math I

URL: http://ksnctf.sweetduet.info/problem/16

Các biến số trong câu hỏi này (n, c, p, q, …) rất giống với các biến sử dụng trong hệ thống mã hóa RSA http://en.wikipedia.org/wiki/RSA_(cryptosystem)

Hãy tìm hiểu về cách mã hóa và giải mã RSA, nếu đã hiểu rồi, tôi tin rằng bạn sẽ tìm ra flag của câu hỏi này rất nhanh.

12: Hypertext Preprocessor

URL: http://ksnctf.sweetduet.info/problem/12

Với câu hỏi này, bạn cần phải tìm flag từ một trang Web http://ctfq.sweetduet.info:10080/~q12/

Trang Web đơn giản là show một chuỗi chữ số, một phần của chúng là thời gian truy cập. Không có input, nên cũng khó tìm ra lỗ hổng ở đây.

Bạn sẽ nhận thấy rằng, mỗi lần bạn truy cập trang Web, chuỗi ký tự đều thay đổi, nhưng phần mở đầu của nó 2012-1823:20 không bao giờ thay đổi. Đây chính là một gợi ý. Sử dụng Google vào bạn có thể tìm ra một vài không tin như ở đây

CVE-2012-1823 là một bug của PHP-CGI. Bạn có thể khai thác nó, ví dụ, truy cập vào URL http://ctfq.sweetduet.info:10080/~q12/?-s bạn nhìn được toàn bộ mã nguồn của trang Web này.

Bạn sẽ cần khai thác với một vài kỹ năng nâng cao hơn để tìm ra flag cho câu hỏi này. Cố lên.

9: Digest is secure!

URL: http://ksnctf.sweetduet.info/problem/9

Với câu hỏi này, bạn cần phân tích một file pcap khác. Tiêu đề câu hỏi gợi ý rằng phương thức Authentication được sử dụng ở đây là Digest. Bạn có thể Google để hiểu hơn về phương thức này.

Phân tích file pcap, bạn có thể tìm ra được gói tin nào gửi các thông tin authorization đi. Tuy nhiên, không giống Basic Authentication, Digest sử dụng MD5 hash để mã hóa theo một phương thức khá phức tạp nên việc crack để tìm ra password là rất khó.

Bạn có thể sử dụng những cách làm khác mà không biết password. Bạn phải tìm cách “replay” lại quá trình gửi thông tin xác thực giống như quá trình gửi trong file pcap. Để đăng nhập được, bạn chỉ cần điều chỉnh gói tin gửi đi sao cho các thông tin khớp nhau, và bạn sẽ xác thực được với trang Web. Cố lên.

17: Math II

URL: http://ksnctf.sweetduet.info/problem/17

Với câu hỏi này, bạn cần phải tính toán với những số rất lớn. Câu hỏi này ít điểm hơn Math I, tuy nhiên bản thân tôi cảm thấy nó lại có phần khó hơn.

Bạn cần tính căn bậc 101 của một số dài hơn 100 chữ số. Số quá lớn nên vượt qua khả năng tính toán của các phần mềm thông thường. Tôi chưa sử dụng các công cụ toán học như Mathematica nên không rõ liệu nó có thể tính được không.

Một vài cách làm khác như tính toán qua logarithm lại cho sai số quá lớn.

Có một cách có thể giải bài này, đó là thử brute-force với y (vì tính toán mũ 101) thì dễ hơn là tính căn bậc 101. Và với một số thủ thuật, bạn có thể giảm số trường hợp cần tính đi.

18: USB flash drive

URL: http://ksnctf.sweetduet.info/problem/18

Với câu hỏi này, bạn cần tìm flag trong một file zip. Download và giải nén nó, bạn sẽ thấy một file img. Đừng lo lắng về cách mở nó. Nó là một file ảnh của đĩa cứng, chỉ cần đổi đuôi img thành iso, bạn có thể mở nó dễ dàng.

19: ZIP de kure

URL: http://ksnctf.sweetduet.info/problem/19

Với câu hỏi này, bạn cần tìm flag từ một file zip. Tuy nhiên, file zip đã được bảo mật bằng password, và bạn cần “crack” nó.

Có nhiều công cụ để crack password các file zip. Tuy nhiên tôi gợi ý pkcrack. Bạn có thể google, download và dùng thử. File zip được bảo mật bằng password thực sự cũng không khó để crack. Bạn cần biết một phần nội dung của một trong những file bên trong zip (càng nhiều càng tốt) và sử dụng pkcrack, bạn sẽ mở được nó.

Tôi xin lỗi nếu bài viết có bất kỳ typo nào. Nếu bạn nhận thấy điều gì bất thường, xin hãy cho tôi biết.

Nếu có bất điều gì muốn nói, bạn có thể liên hệ với tôi qua các mạng xã hội, tạo discussion hoặc report issue trên Github.