Học gì ở Positive Hack Camp? Bài 4 – Exploit known vulnerabilities in network services (Khai thác các lỗ hổng đã biết trong dịch vụ mạng)

Bài viết này thuộc series “Học gì ở Positive Hack Camp?”, nơi tôi chia sẻ, tổng hợp và minh hoạ lại những kiến thức bản thân đã học trong camp.

”Positive Hack Camp là sáng kiến giáo dục toàn cầu của Positive Technologies và Positive Education dành cho các chuyên gia an ninh mạng được triển khai tại Moskva với sự hỗ trợ của Bộ Phát triển Kỹ thuật số Nga và Quỹ Phát triển An ninh mạng Quốc tế Cyberus.

Chương trình kéo dài trong 2 tuần, bao gồm các khóa đào tạo thực hành chuyên sâu, các nghiên cứu tình huống thực tế và kết nối quốc tế với sự hướng dẫn của các chuyên gia hàng đầu của Nga. Mục tiêu của chương trình là giúp các quốc gia phát triển nhân tài và chuyên môn về an ninh thông tin, hỗ trợ chủ quyền không gian mạng và tương lai số an toàn.” (Theo Báo Nhân dân Điện tử)

The first rule of the zero-day market was: Nobody talks about the zero-day market. The second rule of the zero-day market was: Nobody talks about the zero-day market.

(Quy tắc đầu tiên của thị trường zero-day là: Không một ai được nhắc đến thị trường zero-day. Quy tắc thứ hai của thị trường zero-day là: Không một ai được nhắc đến thị trường zero-day.)

This Is How They Tell Me the World Ends, Nicole Perlroth

Tiếp tục sau bài khai thác lỗ hổng web, đây là cách “cạy cửa” thứ hai để vào được hệ thống.

Từ khoá của bài này nằm ở chữ “KNOWN”, nghĩa là “đã biết”. Lỗ hổng này đã được công khai trên mạng, đã trở thành một CVE, có thể kiếm tìm được trên Internet. Trong đa phần trường hợp bạn có thể tìm được cả payload khai thác lỗ hổng – những đoạn code người khác đã viết sẵn – bạn chỉ cần tải về, sửa lại một chút cho phù hợp với mục tiêu (nếu cần) và thực hiện tấn công.

Trong khi bài trước chú trọng vào các lỗ hổng trong web app, bài này bao trọn một tập lớn các lỗ hổng trong các dịch vụ mạng: tường lửa, máy chủ mail, máy chủ VPN, hệ thống ERP, vv… Thường thì các dịch vụ này được xây dựng bởi một bên thứ ba và sẽ có những “bug” mà cả thế giới biết. Đây chính là những lỗ hổng Day-1 mà chúng ta đi khai thác.

Một vài thuật ngữ cho bạn nào chưa biết:

  • Exploit: một chương trình máy tính/ phần mềm/ các câu lệnh – được sử dụng để thực hiện tấn công trên hệ thống máy tính
  • Payload: phần code thực hiện hành vi độc hại (ăn cắp dữ liệu, xoá dữ liệu, ngắt kết nối hệ thống…). Tôi hay gọi vui vui, nếu như exploit là cái bánh ga-tô thì payload chính là phần “cherry on top”, đảm bảo bữa tiệc vui vẻ cho những người mà hacker chúng tôi đi “chúc mừng sinh nhật” 😀
  • Lỗ hổng 0-day (Zero-day vulnerability): Một lỗ hổng mà chưa có bản vá hay biện pháp phòng thủ được đưa ra. Lỗ hổng 0-day sẽ trở thành lỗ hổng 1-day khi nhà sản xuất phần mềm thông báo tới tất cả mọi người về nó và đưa ra bản vá lỗi tương ứng.

Công cuộc này nói chung là… nhàn, chỉ vất vả ở đoạn tìm kiếm lỗ hổng và thử đi thử lại cho đến khi được thì thôi. Trong bài học này chúng tôi học cách sử dụng msfconsole của Metasploit Framework. Đây là một công cụ mã nguồn mở với nhiều tính năng, trong đó bao gồm kết nối tới cơ sở dữ liệu các lỗ hổng cũng như mã khai thác của chúng, cho phép chúng ta tự động hoá một phần quá trình kiểm thử.

Quá trình này đi qua 4 bước:

  1. Tìm kiếm mục tiêu
  2. Xác định lỗ hổng
  3. Lựa chọn exploit
  4. Khai thác lỗ hổng

1 – Tìm kiếm mục tiêu

Bước đầu tiên, chúng ta làm như những gì đã được học trong bài số 2 “Exploration in the customer’s external infrastructure (Thăm dò hạ tầng bên ngoài của khách hàng)”. Mục tiêu là biết được phiên bản phần mềm, các dịch vụ, máy chủ đang chạy, tính năng, vv…

Một khó khăn bạn có thể gặp trong bước này chính là việc thiếu những thông tin cụ thể về phiên bản phần mềm. Trong trường hợp này, có một vài mẹo:

  • Tính checksum của các file tĩnh và so sánh nó với các file tương ứng của một phiên bản cụ thể. Ví dụ như các file favicon, js, ảnh…;
  • Đào bới lịch sử thay đổi của code, xem xem các bản vá có thể nhìn thấy được từ trang web có giống với code trong repo phần mềm ở phiên bản nào không;
  • Tìm kiếm thêm các lựa chọn debug hoặc sử dụng các trang tiết lộ thông tin phần mềm khác.

2 – Xác định lỗ hổng

Bước tiếp theo, sau khi xác định được phiên bản phần mềm, chúng ta sẽ tận dụng các kiến thức thông tin sẵn có cùng với công cụ để tìm kiếm xem có lỗ hổng nào tồn tại hay không. Một số công cụ mà bạn có thể cân nhắc bao gồm:

Khả năng tìm kiếm là không giới hạn, tuỳ thuộc vào sự sáng tạo của bạn. Bạn cũng có thể sử dụng các công cụ tìm kiếm như Google, trình quản lý phiên bản code như GitHub, các trang blog, và (tôi xin giữ nguyên văn lời mấy thầy Nga:) “the Chinese segment of the Internet” (iykyk), vv…

3 – Lựa chọn exploit

Không phải lúc nào mọi thứ cũng xuôi chèo mát mái. Trong nhiều trường hợp, việc tìm thấy exploit cho một lỗ hổng cụ thể không phải chuyện dễ dàng. Chủ yếu exploits thường không bao giờ được biết đến.

Đến đoạn này thì hơi có một chút mùi của thế giới ngầm. Bám chắc vào, để tôi dẫn bạn đi.

Sẽ xảy ra hai khả năng:

  1. Bạn tìm ra phiên bản phần mềm và một lỗ hổng cụ thể của nó. Bạn cũng tìm thấy trên mạng một hoặc nhiều exploit. Khi đó việc còn lại cần làm là:
    • Tìm và lựa chọn exploit;
    • Hiểu cơ chế hoạt động của exploit đó;
    • Đọc kỹ lại code;
    • Sửa chỗ này chỗ kia cho phù hợp nếu cần;
    • Tiến hành debug, thử nghiệm exploit trên môi trường test của bạn trước;
    • Cuối cùng nếu mọi thứ ngon nghẻ thì sử dụng exploit đó.
  2. Không có exploit công khai cho lỗ hổng của một phiên bản phần mềm cụ thể mà bạn đang nhắm đến. Khi ấy, bạn chỉ còn hai lựa chọn:
    • Tự viết mã khai thác của bạn; hoặc
    • Tìm mua nó trên chợ đen.
    • Hoặc bạn phải có não, hoặc bạn phải có tiền. Mà, có cả hai thì sẽ tốt hơn.

4 – Khai thác lỗ hổng

Trước khi chạy exploit, điều rất quan trọng bạn cần nắm là những gì sẽ xảy ra sau khi bạn nhấn nút. Bạn phải đảm bảo rằng:

  • Bạn hiểu exploit sẽ làm gì, tại sao và như thế nào mà nó hoạt động;
  • Mã khai thác sẽ không làm “bung bét” các chức năng của hệ thống hay thay đổi trạng thái của nó một cách đáng kể;
  • Mã này không chứa những chức năng khác ngoài mong muốn hay logic bomb, thứ có thể bị ẩn đi bởi kẻ tấn công/ người viết mã này (đôi khi không cẩn thận là bị đâm sau lưng!);

Một khi đã thực thi mã, hãy sẵn sàng chuyển sang các bước tiếp theo là giữ quyền truy cập (secure access), chắc chắn rằng mã đã được debug kiểm tra cẩn thận để bạn không phải chạy đi chạy lại lằng nhằng, càng phức tạp lại càng dễ bị phát hiện. Đạt được mục tiêu trong càng ít bước càng tốt.

Ngoài Metasploit Framework, nếu bạn có xèng ($$$!), bạn có thể cân nhắc những framework khác như Cobalt Strike, Exploit Pack hay Core Impact Pro. Tuy nhiên, việc biết và sử dụng thành thạo Metasploit là một kỹ năng không thể thiếu của một hacker, nên hãy học và thực hành nó nhé.

Khởi động chương trình Metasploit với câu lệnh:

msfconsole

Tìm kiếm exploit có liên quan đến phiên bản phần mềm với:

search <từ_khoá>

Metasploit sẽ tiến hành tìm kiếm trong database của nó những lỗ hổng có từ khoá với cái bạn tìm kiếm. Nếu có nó sẽ trả về một danh sách. Bạn hãy đọc mô tả và đánh giá xem cái nào là phù hợp nhất với mục tiêu hiện tại của mình. Thường thì những payload được đánh giá “Excellent” sẽ là những cái tốt nhất, song cũng không đảm bảo luôn hoạt động – còn tuỳ vào hệ thống và cách bạn cài đặt sau đó nữa.

Lựa chọn exploit với câu lệnh:

use <mã_số/ tên_exploit>

Tìm hiểu thông tin về exploit với:

info

Bạn cần phải xác định hệ thống mình đang tấn công chạy hệ điều hành nào. Lựa chọn payload cho phù hợp với OS đó với:

set payload <tên_payload>

Mẹo: Bạn có thể nhấn phím ‘Tab’ để công cụ gợi ý danh sách payload mà nó nghĩ là phù hợp với mục tiêu. Chú ý là đôi khi danh sách này có thể rất dài, nên có thể sẽ làm máy bạn bị treo 🙂

Kiểm tra xem để chạy được exploit này thì bạn cần phải set những tham số nào với:

options

Sau đó, hãy nhìn vào danh sách các options mà exploit này yêu cầu cùng với các mô tả của chúng. Những tham số có ghi “Required” bên cạnh là những tham số bạn cần gán giá trị cho nó thì mới có thể chạy được mã khai thác.

Đặt giá trị mới bằng:

set <tên_option> <giá_trị>

Tiếp tục xem trước xem liệu nếu mình chạy mã này thì có khai thác được lỗ hổng không với:

check

Nhớ rằng không phải mã khai thác nào cũng hỗ trợ tính năng này.

Nếu được báo khai thác thành công, hệ thống có lỗ hổng, hãy thực hiện bước cuối cùng:

exploit
Tôi cũng yêu trường lắm, mỗi tội không dám ngạo nghễ khi ở đây. Hôm đó là hôm đầu tiên tôi tập dùng Metasploit.

Đọc qua và làm thử theo thầy cảm thấy khá dễ dàng, song khi làm thật thì mới thấy cũng có không ít những trở ngại. Theo kinh nghiệm của tôi, trong quá trình làm thường sẽ có lúc exploit chạy không thành công, mặc dù Metasploit báo có thể khai thác được; hay thậm chí nó báo hệ thống không có lỗ hổng mặc dù bạn chắc 99,99% là nó có điểm yếu đó. Tôi thấy thường là do vài lý do:

  • Bạn lựa chọn exploit không đúng từ đầu;
  • Bạn lựa chọn payload không khớp với kiến trúc hệ thống;
  • Bạn set các option (tham số) với giá trị chưa chính xác.

Việc cần làm trong toàn bộ trường hợp này, đó là quay lại và kiểm tra, set giá trị khác, thử đi thử lại cho đến khi được. Sự kiên nhẫn chính là chìa khoá! Hoặc bạn có thể lựa chọn đi tìm tiếp và khai thác một lỗ hổng khác – thường sẽ không chỉ có duy nhất một nơi yếu điểm.

Hoặc tự viết payload cho mình, và bạn có quyền sử dụng nó theo ý bạn muốn: Bán nó, dùng nó cho mục đích cá nhân, hay công khai nó. Hãy lựa chọn sáng suốt, nhất là khi bạn giỏi đến mức tự viết được payload mà đảm bảo được nó luôn chạy. (Với cả hãy nhận tôi làm đồ đệ…)

Chúc các bạn thành công!