picoCTF 2017 – Digital Camouflage

Đây là bài mở màn cho loạt bài write-ups về các câu hỏi thuộc nhóm Forensics. Ngày xưa bắt đầu biết chơi CTF là tôi đam mê với Forensics, một phần vì soi vào từng ngóc ngách, tìm kiếm và lục lọi, tháo banh một thứ gì đó để tìm hiểu cơ chế vận hành của nó, vốn là bản tính của tôi từ nhỏ. Chơi Forensics cũng đòi hỏi lục tìm, đào sâu nhiều chỗ.

Nói hoa mỹ vậy thôi, sự thật là do tôi code dở quá!

Ta bắt đầu với bài đầu tiên của Forensics trong picoCTF 2017, đây cũng là bài ở mức Level 1. Ta quan sát đề đưa cho cái gì và gợi ý cái gì. Phàm cứ chơi CTF, có gợi ý thì cứ coi hết đi, bày đặt chảnh tự cao chả giải quyết được cái gì đâu.

cats

Digital Camouflage

We need to gain access to some routers. Let’s try and see if we can find the password in the captured network data: data.pcap.

HINTS

  • It looks like someone logged in with their password earlier. Where would log in data be located in a network capture?
  • If you think you found the flag, but it doesn’t work, consider that the data may be encrypted.

Đề bài cho ta một file chứa dữ liệu bắt được bằng Wireshark, mục tiêu cần thiết là tìm ra được mật khẩu trong đó. Mật khẩu gì thì không quan trọng, quan trọng là nếu có mật khẩu thì chắc chắn dữ liệu bắt được này là dữ liệu đăng nhập tài khoản người dùng.

Suy luận tiếp, nếu đây là quá trình đăng nhập, vậy dữ liệu bắt được là dạng các gói tin xử lý trên web, cụ thể là người dùng gửi yêu cầu lên server để truy cập trang web đăng nhập, sau đó server trả về trang web trên trình duyệt, người dùng gõ vào tài khoản (thông thường gồm có 2 trường chính là username và password). Sau khi nhấn Enter để đăng nhập thì thông tin đó được gửi lên server. Bất kể là đúng hay sai, dữ liệu khi đã điền vào các ô thông tin sẽ được gửi lên server để bắt đầu xác thực. Wireshark đứng ở giữa của quá trình này, bắt được toàn bộ quá trình thực thi chuỗi công việc vừa mô tả ở trên.

Đề bài đưa ra mong muốn, phải làm sao lục tìm được mật khẩu mà người dùng đã gõ và gửi lên server. Mà trong việc xử lý các công việc liên quan tới web, có hai loại phương thức request thông thường dùng nhiều nhất (nói như vậy là vì bên cạnh nó, còn có những dạng request khác nữa), đó là GETPOST.

Phương thức GET xuất hiện khi người dùng mở trình duyệt lên, gõ vào thanh địa chỉ tên của trang web cần truy cập và nhấn Enter. Chính cái khoảnh khắc nhấn Enter và trình duyệt bắt đầu xoay vòng vòng ở trên tab tương ứng, lúc này mới gọi là GET – tức là phương thức GET (method GET) mới thực sự diễn ra. Dữ liệu trả về từ máy chủ chứa trang web đó (nếu trang web đó tồn tại và địa chỉ truy cập không gõ sai), sẽ bắt đầu được xuất hiện trên trình duyệt. Quá trình này có thể hiểu là trình duyệt render trang web ra cho người dùng xem.

Với tất cả những suy luận ban đầu như vậy, chỉ từ vài dòng ngắn gọn của đề bài, ta mới bắt đầu mở file pcap lên và quan sát. Với đặc trưng là các cuộc thi có đề bài gợi mở đầy đủ, ta nên tập trung suy luận ban đầu trước, thay vì cắm đầu vào mở lên và rà tìm trong hàng chục, hàng trăm hoặc thậm chí hàng nghìn gói tin để rồi tốn thời gian vô ích.

Vậy, ta thử mở tập tin pcap này lên và quan sát.

cats1.jpg

Có tổng cộng 180 gói tin tất cả, bao gồm những gói không cần thiết quan tâm. Nếu từng thử mở Wireshark để bắt gói tin, bạn sẽ thấy từ lúc bạn nhấn mở trình duyệt, Wireshark đã bắt đầu bắt các gói tin. Đây là các gói tin khởi tạo, trong các cuộc thi CTF lẫn ngoài đời không cần quan tâm nhiều thêm rối.

Lướt qua từ trên xuống dưới, từ dưới lên trên, ta thấy thấp thoáng các gói tin HTTP với các phương thức GET và POST xuất hiện.

Như đã phân tích ở trên, GET dùng cho việc người dùng gửi lên mạng yêu cầu truy cập một trang web bất kỳ, vậy thì POST là dùng cho việc từ trang web trả về trước đó, ta nhập vào thông tin từ bàn phím và gửi lên server. Gửi lên làm gì thì ta không cần quan tâm (đăng nhập, tìm kiếm, bình luận, phản hồi,…).

Vậy để tìm mật khẩu, ta thử lọc ra các gói tin HTTP có phương thức POST xem sao.

Cú pháp để lọc ra các gói tin mong muốn sẽ có dạng:

http.request.method == “POST”

Với cú pháp này, tôi sẽ lọc ra các gói tin dạng POST. Nếu cần lọc gói tin GET thì thay chữ POST ở trong câu trên bằng chữ GET là được.

Và sau khi thử filter, kết quả dĩ nhiên không ngoài mong đợi.

cats2.jpg

May mắn thay, chỉ có một gói tin phù hợp với yêu cầu filter kể trên.

Ta quan sát ở cửa sổ giữa của chương trình chính Wireshark, đây chính là các vùng thông tin cụ thể của một gói tin. Tạm thời ta không cần quan tâm tới các trường như Frame, Ethernet II,.. Cái ta cần nhìn vào là 2 trường cuối: Hypertext Transfer ProtocolHTML Form URL Encoded: application/x-www-form-urlencoded. Đặc biệt là trường HTML Form URL Encoded: application/x-www-form-urlencoded. Bởi vì đây chính là phần bắt được dữ liệu đăng nhập của người dùng. Tại sao lại như vậy?

Khi lập trình web từ lúc HTML, CSS rồi đến JavaScript và PHP, ta chắc chắn phải biết, để xử lý các sự kiện đăng nhập hay các sự kiện bất kỳ cần gửi lên server, mọi thứ đều được bỏ trong các thẻ <form action=”GET/POST”>. Làm như vậy, ta có thể bắt được sự kiện phát sinh từ phía người dùng để gửi xuống backend code (JavaScript, PHP) xử lý.

Khi bạn bắt tay vào code một trang web đăng nhập đơn giản, sẽ thấy được ý nghĩa của việc này.

Quay trở lại đề bài, ta đã xác định được chính xác gói tin cần trích xuất thông tin. Vậy tiếp theo là mở rộng trường cuối ra – bấm vào nút > ở đầu dòng – để xem các thông tin bên trong trường đó.

cats3.jpg

Không ngoài dự đoán, ta đã tìm được đúng gói tin cần trích xuất thông tin.

Tới đây ta lại tiếp tục quan sát. Các hướng xử lý tiếp theo là hí hửng copy dữ liệu ở trường pswrd và đem submit lên server của trò chơi CTF. Nhưng thất bại!

Nhìn kỹ lại cái mật khẩu này, ta biết được nó đang được hiển thị ở dạng mã hóa Base64. Tại sao tôi lại biết như vậy? Bởi căn cứ vào hai dấu “==” ở cuối. Đây chính là dấu hiệu đặc trưng của dạng mã hóa base64 và base32, bởi nếu thiếu một số bit theo quy định về độ dài của mã hóa Base64, thì nó tự động thêm vào hai dấu “==” để cân bằng chuỗi mã hóa. Phần này tôi đọc lâu lắm rồi, cũng không nắm rõ ý lắm.

Như vậy, sau khi xác định được dạng mã hóa của cái password này, tôi tìm một trang giải mã Base64. Với các dạng mã hóa cơ bản, ta có thể search công cụ giải trên mạng bằng cách gõ tên kèm với decode hoặc decrypt. Trong trường hợp Base64 này thì là decode.

cats5.jpg

Chuỗi giải mã có được cũng hoàn toàn vô nghĩa. Nhưng đặc trưng của picoCTF là vậy. Ta lấy kết quả đem đi submit và tìm được flag chính xác!

Đây là toàn bộ quá trình suy luận, một cách cực kỳ chi tiết, cho người mới bắt đầu chơi CTF phần Forensics với các bài cơ bản như vầy.

VÕ TÌNH THƯƠNG

votinhthuong9@gmail.com

Advertisements

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