Hôm nay mình muốn viết một cái note này để dành cho những bạn mới bắt đầu nghiên cứu về bảo mật máy tinh. Mình sẽ không đi quá chi tiết vào từng mảng cũng như khái niệm, công cụ, mà đơn giản chỉ là một cái note, một cái roadmap cho bạn để dễ hình dung mình nên bắt đầu từ gì và bắt đầu như thế nào.

Về cơ bản bảo mật máy tính hiện tại chia thành các mảng sau đây:

  • Web Application Security (Ứng dụng web)
  • Reverse Engineering (Dịch ngược)
  • Software Exploitation (Phần mềm)
  • Cryptography (Mật mã học)
  • Forensics (Điều tra chứng cứ số)
  • Networking Security (An toàn mạng)
Hãy học lập trình.

Bạn sẽ đắn đo liệu rằng mình nên bắt đầu từ mảng nào, mình chỉ có lời khuyên bạn nên bắt đầu từ Coding – Lập trình . Đây là điều mình luôn khuyên tất cả các bạn trẻ dù đang theo học bất kì lãnh vực nào trong thế giới máy tính. Vì đơn giản, một khi bạn có tư duy logic của một lập trình viên, mọi thứ sẽ trở nên dễ dàng hơn. Nên ghi nhớ, máy tính được cấu tạo từ 2 bit logic 1 và 0 , đúng và sai, true and false. Cho nên hiển nhiên 100{a800a251b634c5d11f20a2d07a906847a3b3472666285838eb476f2ac984752d}, logic là thứ bạn cần để đi tiếp con đường này. Ít nhất hãy trang bị cho mình những kiến thức cơ bản về: Hệ điều hành (Operating System), Cấu trúc dữ liệu (structures), cũng như có khả năng lập trình được từ 03 ngôn ngữ trở lên.

Tìm ra cách học và theo đuổi đam mê cho riêng mình.

Về phần mình, mình đã bắt đầu với việc lập trình PHP, việc tạo ra những công cụ nhỏ lẻ mà không thể tìm được trên mạng là thứ mình thích. Bạn cũng nên thế, hãy tìm ra sở thích của mình, và dùng công cụ để tạo nên nó, nó sẽ là động lực để bạn có hứng thú tìm hiểu sâu hơn mà không ngán ngẫm. Mình chỉ đơn giản là một thằng nhóc theo đuổi thứ mình thích lâu nhất và không bỏ cuộc.

Hãy đừng so sánh ngôn ngữ nào hay hơn, mạnh hơn ngôn ngữ nào. Suy cho cùng nó chỉ là một công cụ để cho con người thực thi những việc mình muốn một cách nhanh và tự động. Mình đã từng nghe câu như này:

Máy tính, nhanh và chính xác, nhưng lại kém thông minh. Con người cực kì thông minh, nhưng lại quá chậm và sai sót.

Kết hợp cả hai thứ trên, thì mới là cao nhân. Trí tuệ nhân tạo được như ngày hôm nay thì cũng là do con người setup cho, chứ nó chẳng tự dưng thông minh lên.

Okay, quay trở lại việc bắt đầu với các mảng chính kể trên.

Bạn nên chọn mảng nào ?

Đây có lẽ là điều băn khoăn nhất với những người bắt đầu. Về phần mình, là người đã tham gia vào nó một thời gian đủ lâu, quan sát từng mảng và cả những người chuyên về lĩnh vực đó. Mình nhận thấy, mảng nào cũng hay, mảng nào cũng là cả một nghệ thuật và đòi hỏi quá trình học hỏi không ngừng.

Quan trọng là: bạn thích gì, bạn cảm thấy mình hợp, bạn cảm thấy vui khi làm cái nào nhất ?

Như đã kể trên, mình bắt đầu với việc lập trình web trước, vì hồi nhỏ mình thấy anh trông net nhà kế bên, gõ gõ notepad html mà ra một trang web. Nên thấy nó thú vị, và bản thân mình cũng thích làm một website thật bắt mắt, đó là điều mình thích thú và cảm thấy vui vẻ khi làm. Cho nên việc bắt đầu với mảng Web Application Security với bản thân mình tại thời điểm đó là hợp nhất.

Nếu bạn suy nghĩ về một thứ gì đó trong khoảng một thời gian dài, và việc suy nghĩ về nó chiếm hơn 1/4 ngày của bạn, đó chính là thứ bạn thích, theo mình là vậy.

Còn nếu bạn thật sự chưa biết gì về các mảng trên thì hãy… thử hết, nhưng hãy thử thật nhanh, thử chơi CTF (Capture The Flag) mảng đó xem, xem mình thích không, không thích thì thử mảng khác. Sau đó ngồi ngẫm xem, mình thấy vui nhất khi làm cái nào. Vậy thôi, mọi thứ trên đời cái gì cũng có cái hay/dở của nó, quan trọng là bạn thích cái gì. Vì bạn phải vui, thì bạn mới bỏ công sức, tâm huyết mình vào với nó, lúc đó mới có thể phát triển xa được, nếu không mọi thứ nó sẽ trở nên hỗn độn, không gì ra gì, chỉ tốn phí thời gian mình thôi.

Dù bạn có thiên bẩm, mọi thứ vẫn phải tuân theo quy luật 10,000 hours. Tức là bạn phải luyện tập 10,000 tiếng đồng hồ mới có thể nên cơm cháo được.

Lí do tại sao, mình nghĩ con người nên phát triển đam mê từ bé, vì lúc đó bạn sẽ không nghĩ ngợi gì nhiều, không phải đắn đo việc xung quanh, cơm áo gạo tiền,…

 

Hãy tập thói quen hỏi “Tại sao?”

Mọi thứ bạn làm, mọi công cụ bạn chạy, hãy tự hỏi bản thân “Tại sao?”, nguyên lý nó như thế nào, tại sao nó lại bị lỗi, tại sao phải khai thác như thế, tại sao và tại saoooo.

Cũng thay vì bạn tìm hiểu khái niệm về một lỗi bảo mật nào đó, đừng!. Đây là cách học mình cho là hay nhất: Hãy tạo ra chính lỗi đó, hãy là người lập trình mắc phải những vấn đề tương tự, rồi bạn sẽ hiểu được nó một cách rõ ràng, hệ thống, và logic nhất. Đó là cách học theo mình là đúng đắn cho một chặng đường dài mà bạn phải theo đuổi.

Tin mình, hãy học bằng một cách khác đi. Đừng chạy công cụ nữa 🙁

 

Bắt đầu việc phân tích những điểm hay ho trong từng mảng.

🌐 Web Application Security (Ứng dụng web)

  • Dễ tiếp cận, vì kiến thức nó không quá sâu. Bạn không cần phải rành mạch về Hệ điều hành, Cấu trúc dữ liệu gì cả, mà vẫn có thể làm nó. Chỉ cần biết lập trình. Vì khi bạn biết lập trình, bạn sẽ chính là người mắc vào những lỗi đó, cách học nhanh nhất và dai nhất là tự vấp và sửa sai lầm của chính mình.
  • Target rất nhiều, nói tới đây không phải cổ súy. Nhưng rõ ràng thế giới www (World-Wide-Web) ngày này cực kì to lớn, ai cũng có thể lập cho mình một website. Chính vì thế mà “bao cát” luyện tập cho mọi người cũng rất nhiều. Nhưng hãy nhớ, xây dựng mới khó, đập phá rất dễ. Hãy là những người trẻ có suy nghĩ và ý thức.
  • Công cụ/tài liệu rất rất nhiều, vì đây là mảng nhiều người tiếp cận nhất, sinh ra công cụ mà họ làm ra cũng tỉ lệ thuận. Hàng ngàn công cụ được tạo ra chỉ cho việc khai thác một lỗi duy nhất (điển hình: SQL Injection). Cho nên, việc script-kiddie , những người không hề biết tí nguyên lý về nó vẫn có thể khai thác thành công. Đây là điểm chí mạng, mình sẽ đề cập sau.
  • Các kĩ thuật / nguyên lý hoạt động của www ngày nay bạn cần biết, nó là rất nhiều, và thay đổi theo từng ngày, nhưng cũng chỉ xoay quanh những kiến thức nền tảng, nếu bạn nắm bắt tốt, việc tiếp thu một kĩ thuật hay nguyên lý mới cũng không quá khó. Bạn cũng nên cập nhật nguyên lý của các biện pháp bảo vệ (mitigation) trên trình duyệt hiện đại như: Chrome/Edge/Firefox/…
    • Các lỗi thường gặp: Injection (SQL/Command/Template/…), Cross-Site Scripting (XSS), Cross-Site Request Forgery (CSRF), Insecure Direct Object References (IDOR), XML External Entity (XXE),…
    • HTTPS
    • Content-Security-Policy (CSP)
    • Cross-Origin Resource sharing (CORs)
    • X-Frame
  • 📗 The Tangled Web: A Guide to Securing Modern Web Applications
    (Cuốn này bao xô gần hết www này, và được viết từ một hacker thuyền thoại 🙂 )
  • Ngôn ngữ nên thành thạo: HTML / Javascript / Java / PHP / ASPX / Ruby / Python
  • Tips: Một cách hay để cập nhật, thấy được cái hay và sáng tạo của các web ninja khác là theo dõi các report bug bounty trên hackerone / bugcrowd hoặc writeup của họ. Hãy tìm hiểu cách thức họ suy nghĩ, cách suy luận để ra được kết quả.

P/S: Trong phạm vi bài viết này, thay vì đưa chục cuốn sách cho bạn, mình sẽ đưa cho bạn ít nhất có thể, mình nghĩ các bạn nên cố gắng đọc hiểu kiên trì một cuốn nào đó, thay vì tải một đống về, mỗi thứ một chút, chẳng được gì (mình đã từng như vậy nên đây là lời khuyên). Một khi bạn biết mình đã thấu hiểu được lượng kiến thức nhất định, tự khắc lúc đó bạn sẽ biết mình cần làm, cần đọc cái gì tiếp theo thôi.

☯ Reverse Engineering (Dịch ngược)

  • Cần một lượng kiến thức nhất định, nôm na công việc dịch ngược sẽ giúp bạn thấu hiểu về cách thức hoạt động của một chương trình, chẳng hạn bằng cách nào mà từ một file mp3, khi được tải vào một chương trình chơi nhạc lại phát ra những âm thanh, cấu tạo của tệp mp3 đó là gì ? làm thế nào chương trình biết tới đoạn nào sẽ chơi nốt nhạc gì. Thậm chí ngày nay, việc nghe nhạc bản quyền đã trở nên nghiêm túc, chẳng hạn chương trình chơi nhạc như Spotify đã áp dụng cả mã hóa đối với những tệp nhạc đấy, để tránh người dùng tải, lưu giữ, phát tán trái phép. Nhiều người nghĩ rằng RE (Reverse Engineering) chỉ gom gọn trong việc bẻ khóa / crack phần mềm để xài “chùa”. Có lẽ bạn đã hiểu sai, mục đích của RE thậm chí có thể là phân tích cách thức hoạt động, thuật toán đẳng cấp đằng sau một chương trình nào đó của công ty đối thủ mà mình muốn “học hỏi”, hoặc thậm chí như ví dụ nêu trên, là việc phân tích cách giải mã một tệp nhạc của Spotify. Vậy cho nên, kiến thức để giúp bạn RE một chương trình, nó tùy thuộc vào độ phức tạp, loại đối tượng mà bạn đang làm. Ví dụ bạn phải dịch ngược một kernel module nào đó, tất nhiên bạn phải có kiến thức bổ sung về Filesystem/Device Control IO/System Calls/… Còn về kiến thức cơ bản sẽ xoay quanh:
    • Kiến thức về mã máy (machine code, opcode).
    • Đọc hiểu hợp ngữ (assembly) và có thể viết cả một hàm (ví dụ strlen ?) nào đó bằng ASM.
    •  Kiến thức về CPU/ thanh ghi (register).
    • Cách thức hoạt động chung và cơ bản của một hàm (buffer, calling convention, stack frame, call stack,…)
  • Song đó, cũng tồn tại những kĩ thuật chống lại quá trình dịch ngược/debug, các kĩ thuật/ thủ thuật rất rất nhiều, và hàng ngày hai phe vẫn cố gắng tìm cách ngăn chặn phe kia. Hơi giống với trò chơi mèo đuổi chuột, cứ chạy vòng vòng, ít nhất là tại thời điểm hiện tại.
    • Anti-VM / Anti-sandbox, chống lại việc chạy tệp nhị phân trong một môi trường máy ảo hoặc sandbox nào đấy, người viết ra tệp nhị phân sẽ tìm cách để phát hiện ra điều đó.
    • Anti-debug, sử dụng những kĩ thuật/ thủ thuật ngăn chặn người phân tích có thể dễ dàng chạy dưới hoặc đính vào debugger.
    • Obfuscation, làm rối các đoạn mã máy/hợp ngữ, làm cho những chương trình phân tích tư động cũng khó phân tích được.
    • Packing, nôm na như nghĩa của nó, kĩ thuật “đóng gói” một binary vào trong một cái hộp nào đó, quấn dây, băng keo lại, một cách rối rắm, mà chỉ người chế ra cách đóng gói nó mới có thể dễ dàng mở…nhưng đôi khi bạn chỉ cần dùng rọc giấy để mở nó… :hacknão:
    • Ngoài ra còn nhiều kĩ thuật khác, bạn có thể tìm hiểu trong cuốn sách bên dưới.
  • Ngoài ra có một cách học RE hay ho là, bạn hãy lập trình nhiều chương trình, hàm khác nhau, thuật toán khác nhau, compile nó và quăng vào các chương trình dịch ngược để thấy đoạn hợp ngữ được sinh ra, nếu bạn có đang dùng IDA Hex-rays hoặc chương trình Decompiler tương tự để sinh ra mã giả C thì…tạm thời quên nó đi mà hãy tập làm quen với việc đọc hợp ngữ, mã máy, cách thức các instruction hoạt động.
  • Hãy ráng học những nền tảng cơ bản thật vững chắc, vì để đi đường dài, bạn không thể nào chỉ phụ thuộc vào nó được, sẽ có những trường hợp bạn cần giải quyết bằng những kiến thức thật chắc bài, hoặc thậm chí phải tự làm ra công cụ của riêng mình dựa trên những kiến thức ấy.
  • Tutorial/Blog Tiếng Việt: kienmanowar / yeuchimse / …
  • 📗 Reversing: Secrets of Reverse Engineering

🕵 Software Exploitation (Phần mềm)

🔑 Cryptography (Mật mã học)

🔎 Forensics (Điều tra chứng cứ số)

Networking Security (An toàn mạng)

Theo l4w.io