Tôi là một người hâm mộ lớn của phương pháp học tập được game hóa. Điều đó đã thôi thúc tôi thử một trò chơi học Linux nổi tiếng: OverTheWire. Từ sự tò mò ban đầu, nó nhanh chóng biến thành hàng giờ say mê giải đố, “phù phép” trên terminal, và những khoảnh khắc “à-ha!” mà bạn chỉ có thể có được khi tự mình tìm ra lời giải cho một vấn đề thực sự. Đối với những ai đang tìm kiếm một phương pháp học Linux hiệu quả, thú vị và mang tính thử thách cao, OverTheWire chắc chắn là một cái tên không thể bỏ qua. Nó không chỉ cung cấp kiến thức mà còn rèn luyện tư duy giải quyết vấn đề, một kỹ năng cốt lõi trong mọi lĩnh vực công nghệ.
Lý Do OverTheWire Thu Hút Đến Vậy
Giao diện trang chủ trò chơi OverTheWire Bandit, nơi người dùng bắt đầu thử thách học Linux thông qua các bài tập thực tế.
OverTheWire là một bộ sưu tập các wargame (trò chơi chiến tranh). Wargame về cơ bản là những thử thách theo phong cách CTF (Capture The Flag) nơi bạn cần thực hiện một tác vụ cụ thể để nhận được một “mã thông báo” đặc biệt làm bằng chứng đã hoàn thành cấp độ đó. Trong ngữ cảnh của OverTheWire Bandit, trò chơi mà tôi sẽ nói đến chủ yếu, bạn cần tìm một mật khẩu bí mật để tiến lên cấp độ tiếp theo.
Tôi đã khám phá nhiều trò chơi dạy Linux cho đến nay. Nhưng OverTheWire thực sự nổi bật nhờ cách môi trường của nó được thiết lập và cách nó thử thách kiến thức của bạn trong các kịch bản thực tế. Bạn được “ném” vào các hệ thống Linux thực để khám phá. Dù bạn là người mới làm quen với Linux hay người dùng trung cấp, OverTheWire đều có điều gì đó dành cho bạn.
Các cấp độ được thiết kế để tăng dần độ khó một cách mượt mà. Một điều tôi rất ngưỡng mộ là một cấp độ cụ thể cũng có thể yêu cầu các lệnh và kỹ thuật từ các cấp độ trước đó. Điều này giúp bạn ghi nhớ kiến thức lâu hơn và củng cố chúng.
Điều tôi yêu thích nhất ở OverTheWire là cách nó coi bạn như một người học có năng lực. Nó không cố gắng biến bạn thành một con robot ghi nhớ các lệnh và kỹ thuật. Thay vào đó, nó giúp bạn trở thành một người có thể điều tra, giải quyết vấn đề và suy luận qua những lãnh địa chưa quen thuộc. Đây là những kỹ năng vượt ra ngoài khuôn khổ terminal và xuất hiện ở khắp mọi nơi trong lĩnh vực công nghệ.
Kỹ Năng Quan Trọng Nhất OverTheWire Truyền Tải
Hình ảnh biểu tượng Tux đang tìm kiếm trên màn hình terminal Linux, thể hiện kỹ năng tự giải quyết vấn đề khi học các lệnh và công cụ Linux.
Nếu có một điều mà OverTheWire dạy tốt hơn bất kỳ hướng dẫn hay video YouTube nào, đó chính là khả năng tự mình tìm ra mọi thứ.
Khi bạn chơi Bandit, trò chơi không “cầm tay chỉ việc” cho bạn. Bạn được cho biết mục tiêu của mình là gì, và có thể nhận được một hoặc hai gợi ý về các lệnh có thể hữu ích. Nhưng chỉ vậy thôi. Không có hướng dẫn chi tiết được nhúng vào cấp độ, không có chú giải công cụ giải thích cách lệnh xyz hoạt động, và chắc chắn không có cửa sổ bật lên hiển thị cú pháp chính xác để sử dụng. Bạn phải tự mình tìm kiếm. Bạn phải thử, thất bại, điều chỉnh phương pháp và thử lại. Và đó chính xác là điều khiến nó trở nên tuyệt vời.
Với tôi, đây là kỹ năng Linux thiết yếu. Sẵn sàng chấp nhận việc không biết điều gì đó, và sau đó tự mình tìm ra thông qua việc tìm kiếm, đọc các trang manpage, và thử nghiệm. Đó là loại kỹ năng phân biệt một người chỉ sao chép các lệnh từ Stack Overflow với một người thực sự hiểu những gì họ đang làm.
Học Hỏi Đa Dạng Hơn Chỉ Các Lệnh Linux Cơ Bản
OverTheWire không chỉ xoay quanh các lệnh Linux. Mặc dù Bandit về mặt kỹ thuật là về điều đó, nhưng sự thật là bạn sẽ học được nhiều hơn chỉ cú pháp.
Ví dụ, bạn sẽ được tiếp xúc với các khái niệm như quyền truy cập tệp (file permissions), giao thức mạng, công nghệ Internet và mã hóa văn bản. Tôi đã phải giải mã các chuỗi hex, xem xét bên trong các tệp nhị phân lạ, kết nối tới các cổng không rõ, và hiểu cách hệ thống tệp Linux được cấu trúc ở một cấp độ sâu hơn.
Một khi bạn hoàn thành Bandit, OverTheWire mở ra nhiều điều hơn nữa. Leviathan đi sâu vào leo thang đặc quyền (privilege escalation). Có Narnia, tập trung vào khai thác bộ nhớ và tràn bộ đệm (buffer overflows). Krypton tập trung vào các kiến thức cơ bản về mật mã học. Maze chứa các thử thách kỹ thuật đảo ngược (reverse engineering) và khai thác (exploitation). Mỗi wargame đều xây dựng trên một khía cạnh khác nhau của bảo mật, lập trình hoặc các khái niệm khoa học máy tính khác.
Các Lệnh Linux Nổi Bật Được Củng Cố
Tôi sẽ không nói OverTheWire là nơi đầu tiên tôi thấy những lệnh này, nhưng đây là lần đầu tiên tôi thực sự phải sử dụng chúng một cách có mục đích. Một số lệnh tôi đã quên cách dùng một phần, số khác tôi chỉ từng dùng với cú pháp copy-paste và một ý niệm mơ hồ về những gì đang xảy ra. Chơi Bandit đã buộc tôi phải chậm lại và học cách mỗi lệnh thực sự hoạt động, và cách sử dụng chúng một cách thông minh, có chủ đích hơn. Dưới đây là sáu lệnh đã thực sự nổi bật.
SSH
SSH là viết tắt của Secure Shell (Vỏ bảo mật). Đây là cách chuẩn để kết nối từ xa đến terminal của một máy khác, đặc biệt là qua Internet. Nó giống như việc “dịch chuyển tức thời” phiên dòng lệnh của bạn sang một máy tính khác, một cách an toàn và được mã hóa, để dữ liệu và mật khẩu của bạn không bị lộ trong quá trình truyền tải. Dưới đây là cú pháp cơ bản nhất của lệnh ssh
:
ssh username@hostname
ssh
là lệnh đầu tiên bạn sẽ sử dụng trong OverTheWire Bandit. Trên thực tế, bạn phải sử dụng nó để bắt đầu chơi, vì bạn phải kết nối với máy chủ của họ. Bạn phải sử dụng nó ở mọi cấp độ, vì vậy nó gần như trở thành bản năng thứ hai của bạn. Đây là cách thực hiện:
ssh [email protected] -p 2220
Quá trình kết nối thành công đến máy chủ OverTheWire Bandit thông qua lệnh SSH trên Terminal Linux, bước đầu tiên để bắt đầu trò chơi.
Ở đây, bạn đang kết nối đến máy chủ bandit.labs.overthewire.org
với tư cách người dùng bandit0
qua cổng 2220
. Sau khi kết nối, bạn sẽ có một shell trên máy tính từ xa đó và có quyền truy cập vào hệ thống.
Find
find
là một công cụ dòng lệnh để tìm kiếm trong các thư mục và định vị các tệp khớp với các tiêu chí cụ thể như tên, kích thước, quyền, thời gian sửa đổi, và nhiều hơn nữa. Nó giống như phiên bản Linux của chức năng tìm kiếm, nhưng mạnh mẽ hơn nhiều. Cú pháp cơ bản:
find [path] [options]
Ví dụ, giả sử bạn muốn tìm một tệp có tên ‘password.txt’. Đây là lệnh để làm điều đó:
find . -name "password.txt"
Lệnh này cho find
biết tìm trong thư mục hiện tại (.) và tất cả các thư mục con của nó một tệp có tên chính xác là password.txt
. Trong một trong những cấp độ đầu tiên của Bandit, bạn phải tìm kiếm một tệp có thể đọc được bởi con người, kích thước 1033 byte và không thể thực thi. Lệnh find
phù hợp với kịch bản này.
find dir_name -type f -size 1033c ! -executable
Lệnh này tìm kiếm các tệp trong thư mục cụ thể có kích thước chính xác là 1033 byte (c
là viết tắt của byte) và loại trừ các tệp không thể thực thi.
Sort
Tiện ích dòng lệnh sort
sắp xếp các dòng văn bản theo một thứ tự cụ thể. Nó có thể là theo thứ tự bảng chữ cái, số, hoặc dựa trên các quy tắc khác mà bạn định nghĩa. Nó đơn giản một cách đáng ngạc nhiên, nhưng khi kết hợp với các công cụ khác như uniq, cut
, hoặc awk, nó trở thành một công cụ mạnh mẽ để xử lý dữ liệu văn bản. Cú pháp cơ bản như sau:
sort [options] [filename]
Ví dụ:
sort file.txt
Lệnh này sẽ sắp xếp các dòng trong file.txt
theo thứ tự bảng chữ cái và in chúng ra terminal của bạn. Trong một trong các cấp độ, bạn gặp một tệp chứa nhiều mật khẩu. Để tìm mật khẩu chính xác một cách nhanh chóng, bạn phải sắp xếp tệp theo thứ tự bảng chữ cái và lọc các giá trị duy nhất. Lệnh sort
rất hữu ích cho điều đó:
sort data.txt | uniq -u
Vì uniq
chỉ hoạt động trên các dòng trùng lặp liên tiếp, chúng ta cần sắp xếp trước. Bây giờ nó sẽ chỉ xuất ra các dòng xuất hiện chính xác một lần.
xxd
Lệnh xxd
tạo một hex dump của một tệp hoặc chuyển đổi một hex dump trở lại dạng nhị phân gốc của nó. Đây là một tiện ích khá chuyên biệt, nhưng cực kỳ hữu ích khi bạn đang xử lý dữ liệu ẩn, tệp được mã hóa hoặc cố gắng kiểm tra nội dung thô của một thứ gì đó. Ở dạng cơ bản nhất, bạn truyền tên tệp cho nó.
xxd [filename]
Vì vậy, nếu bạn có một tệp secret.txt
:
xxd secret.txt
Lệnh này sẽ xuất nội dung của secret.txt
ở dạng hệ thập lục phân cùng với biểu diễn ASCII. Bạn cũng có thể truyền cờ -r
để chuyển đổi một hex dump trở lại tệp nhị phân. Ở một cấp độ, bạn được cung cấp hex dump của một tệp nhị phân. Sử dụng xxd
, bạn phải biến nó trở lại thành một tệp ZIP.
xxd -r data.txt data
Lệnh này chuyển đổi tệp văn bản trở lại thành tệp nhị phân, với điều kiện hex dump ở định dạng chính xác.
strings
strings
là một công cụ dòng lệnh trích xuất văn bản có thể in được từ các tệp nhị phân. Nếu bạn từng mở một tệp trông lạ và thấy một “bức tường” các ký tự vô nghĩa, strings
sẽ giúp bạn tìm ra các đoạn có thể đọc được như mật khẩu, gợi ý, hoặc thông điệp ẩn. Nó đặc biệt hữu ích khi một tệp về mặt kỹ thuật không phải là tệp văn bản, nhưng vẫn chứa văn bản có thể đọc được ở đâu đó bên trong.
strings secret_file
Lệnh này sẽ quét qua secret_file
và in ra bất kỳ chuỗi ký tự có thể in được nào mà nó tìm thấy. Ở một trong các cấp độ, có một tệp chứa văn bản có thể đọc được bởi con người bị ẩn giữa một khối lớn các ký tự vô nghĩa. Để lọc ra văn bản thực, bạn phải sử dụng lệnh strings
trên tệp đó.
nc
nc
, viết tắt của netcat, là một tiện ích mạng đa năng có thể đọc và ghi dữ liệu qua các kết nối mạng bằng TCP hoặc UDP. Nó thường được gọi là “con dao quân đội Thụy Sĩ” của các công cụ mạng vì nó có thể làm rất nhiều thứ, chẳng hạn như thiết lập một máy chủ đơn giản, gỡ lỗi cổng, hoặc đọc dữ liệu từ một socket.
nc host_ip port_number
Lệnh này kết nối máy của bạn với cổng 1234
trên localhost
, cho phép bạn gửi và nhận văn bản hoặc dữ liệu thô. Ở một cấp độ, bạn được yêu cầu gửi mật khẩu đến cổng 30000
của localhost
. Bạn có thể thực hiện điều đó bằng cách sử dụng lệnh nc
.
nc localhost 30000
Sau khi gõ lệnh này và nhấn Enter, bạn sẽ được nhắc nhập mật khẩu, sau đó mật khẩu hoặc bất kỳ dữ liệu nào khác sẽ được gửi đến cổng và máy chủ được chọn.
Lời Khuyên Để Tối Ưu Trải Nghiệm OverTheWire
Không phải ai cũng học theo cùng một cách. Và điều đó hoàn toàn ổn. Nếu ai đó hoàn toàn mới với Linux, họ có thể thấy OverTheWire hơi khó khăn lúc đầu. Tuy nhiên, có một cách bạn có thể làm cho nó dễ dàng hơn một chút. Nó cũng sẽ giúp bạn tận dụng tối đa trò chơi này.
Mỗi cấp độ có một danh sách các lệnh và một số khái niệm cơ bản bạn có thể cần để vượt qua cấp độ đó. Lời khuyên của tôi cho bạn là đừng vội vàng ở bất kỳ cấp độ nào chỉ vì muốn hoàn thành nó. Thay vào đó, hãy dành thời gian để đọc về từng khái niệm để hiểu rõ nó. Các cấp độ đã liên kết các tài nguyên. Nếu bạn vẫn còn nghi ngờ, hãy tìm hiểu thêm.
Điều tương tự cũng áp dụng cho các lệnh Linux. Đọc các trang manpage để nắm vững từng lệnh và thử nghiệm với chúng để hiểu hành vi của chúng. Sau đó, hãy bắt đầu cấp độ đầu tiên và bắt đầu hành trình của bạn từ đó.
Dù bạn là người mới làm quen với Linux hay đã yêu thích nó, bạn chắc chắn nên thử OverTheWire. Dù kỹ năng của bạn ở mức nào, bạn cũng sẽ học được điều gì đó mới mẻ. Có rất nhiều tài nguyên tuyệt vời khác để học Linux đáng để khám phá, nhưng OverTheWire mang lại một trải nghiệm học tập độc đáo và hiệu quả, đặc biệt trong việc xây dựng khả năng tự tìm tòi và giải quyết vấn đề. Hãy bắt đầu hành trình chinh phục Linux của bạn với OverTheWire ngay hôm nay!