Tôi bắt đầu với một cuốn sổ tay. Không phải là một trình soạn thảo văn bản hay một tệp markdown, mà là một cuốn sổ tay giấy đóng gáy lò xo chứa đầy những câu lệnh mà tôi không hề hiểu. Tôi viết xuống ls, grep, find, chmod, và nmap. Tôi chất chồng hết trang này đến trang khác với các cú pháp, coi Linux và an ninh mạng như những bài kiểm tra từ vựng, như thể việc biết nhiều flag hơn người khác sẽ khiến tôi trở nên giỏi giang. Tôi có thể sao chép cú pháp một cách trôi chảy. Tuy nhiên, nếu bảo tôi giải thích tại sao một câu lệnh lại trả về một kết quả cụ thể, tôi sẽ im lặng. Sự im lặng đó chính là vấn đề.

Cạm bẫy của cuốn sổ tay

Cuốn sổ tay trông có vẻ như là sự tiến bộ. Mỗi trang giấy lại thêm vào nhiều mực hơn: find / -name "*.conf", nmap -sV, grep với các đường ống (pipes) và biểu thức chính quy (regular expressions). Trong các bài hướng dẫn, cách tiếp cận này có vẻ hiệu quả. Người hướng dẫn gõ một câu lệnh, màn hình hiển thị kết quả mong đợi, và bạn gật đầu đồng ý. Bạn cảm thấy mình có năng lực vì terminal của bạn khớp chính xác với của họ. Nhưng năng lực này là đi mượn. Nó thuộc về người đã thiết kế lộ trình hướng dẫn đó.

Môi trường thực tế không tuân theo kịch bản. Một máy chủ từ chối kết nối SSH của bạn mặc dù cổng (port) đang mở. Một tập lệnh thất bại với lỗi "permission denied" sau khi bạn đã chạy chmod +x. Một bản quét báo cáo một cổng là "filtered" thay vì "open", và giờ bạn phải quyết định xem điều đó có nghĩa là một quy tắc tường lửa, một kiểm soát dựa trên máy chủ (host-based control), hay một hệ thống ngăn ngừa xâm nhập (IPS) đang âm thầm loại bỏ các gói tin thăm dò của bạn. Trong những khoảnh khắc đó, việc ghi nhớ cú pháp trở nên vô dụng vì vấn đề không nằm ở một câu lệnh bạn đã quên. Mà là ở một hệ thống mà bạn không hiểu.

Sao chép không phải là học tập

Có sự khác biệt giữa việc làm theo một bài hướng dẫn và việc giải quyết một vấn đề. Khi bạn sao chép, bạn đang di chuyển từ Bước A sang Bước B trên bản đồ của người khác. Khi có điều gì đó chệch hướng, bạn sẽ khựng lại vì mô hình tư duy (mental model) của bạn đang trống rỗng. Bạn biết rằng chmod 755 thay đổi quyền truy cập, nhưng bạn không thể giải thích tại sao hệ thống vẫn chặn quyền truy cập khi tệp nằm trên một phân vùng mount với flag noexec. Bạn biết nmap có thể quét các cổng, nhưng bạn không thể giải thích tại sao một bản quét SYN lại trả về kết quả khác với bản quét connect khi có sự tham gia của kiểm tra trạng thái (stateful inspection).

Bạn không hề học Linux hay mạng máy tính. Bạn chỉ đang học cách bắt chước.

Thay đổi câu hỏi

Tôi đã thay đổi một điều. Tôi ngừng hỏi "câu lệnh nào sẽ sửa lỗi này?" và bắt đầu hỏi "hệ thống thực sự đang làm gì?". Sự thay đổi này thật khó chịu vì nó khiến tôi chậm lại. Nhưng nó đã mang lại hiệu quả.

Hãy lấy ví dụ về quyền truy cập tệp. chmod không phải là một lời cầu nguyện bằng những con số thần kỳ. Nó chỉ là lớp bề mặt của cách mà kernel điều phối quyền truy cập vào các inode. Khi bạn hiểu rằng hệ điều hành kiểm tra effective user ID của bạn so với chủ sở hữu (owner), nhóm (group) và những người khác (others) của tệp, các con số sẽ trở nên có ý nghĩa. Khi bạn học được rằng quyền của thư mục kiểm soát việc bạn có thể đi xuyên qua một đường dẫn hay liệt kê nội dung của nó hay không, bạn sẽ ngừng thắc mắc tại sao mình có thể đọc một tệp nhưng lại không thể truy cập vào nó. Bạn nhận ra rằng quyền thực thi (execute permission) trên một thư mục không phải là để chạy các chương trình; mà là để được phép truy cập vào các inode bên trong. Đột nhiên, chmod không cần phải ghi nhớ nữa. Nó cần ngữ cảnh.

Các kiến thức nền tảng về mạng cũng tương tự đối với nmap. Một bản quét cổng không phải là một danh sách các cánh cửa đang mở; nó là một cuộc hội thoại được tạo thành từ các gói tin (packets). Khi bạn nắm vững quy trình bắt tay ba bước (three-way handshake) của TCP, bạn sẽ hiểu tại sao một bản quét SYN lại yêu cầu đặc quyền raw socket và tại sao một cổng đóng lại phản hồi bằng RST trong khi một cổng bị lọc (filtered) có thể không phản hồi gì cả. Bạn ngừng ghi nhớ các tổ hợp flag và bắt đầu suy luận về việc bạn đang gửi những gói tin gì, cũng như sự im lặng hay tiếng ồn đó có ý nghĩa gì.

Ngay cả các công cụ lớp ứng dụng như Burp Suite cũng trở nên dễ hiểu một khi bạn nắm vững HTTP. Nó chỉ là một proxy nằm giữa bạn và máy chủ web. Nếu bạn không hiểu các phương thức HTTP, header, mã trạng thái (status codes) và cách các yêu cầu (requests) ánh xạ tới logic phía máy chủ, Burp Suite sẽ chỉ là một bảng điều khiển đầy các nút bấm gây bối rối. Một khi bạn biết cách một yêu cầu di chuyển và cách máy chủ xây dựng một phản hồi, công cụ này sẽ trở nên hiển nhiên. Bạn không phải đang học Burp Suite. Bạn đang kiểm tra HTTP bằng Burp Suite.

Xây dựng nền tảng

Nếu bạn mới bắt đầu, hãy cưỡng lại sự thôi thúc thu thập các bảng tra cứu nhanh (cheatsheets). Hãy tập trung vào ba lĩnh vực không bao giờ lỗi thời.

Đối với kiến thức Linux cơ bản, hãy học cách kernel lập lịch cho các tiến trình (processes), cách shell phân tích các câu lệnh, và cách các biến môi trường ảnh hưởng đến hành vi của chương trình. Hãy hiểu stdin, stdout, và stderr không phải là những kiến thức vụn vặt mà là hệ thống đường ống giúp các lệnh pipe hoạt động.

Đối với các giao thức mạng, hãy nghiên cứu ngăn xếp TCP/IP mà không cần vội vã