Linux: chuỗi thử thách đầu tiên để tự kiểm tra việc học Linux cơ bản.
Đây là bài viết - mà chính xác hơn thì là solution - của 1 chuỗi các bài thực hành kiểm nghiệm lại việc học Linux cơ bản. Chuỗi bài thực hành này được cung cấp bởi Overthewire. Yêu cầu của các bài tập trong chuỗi này đều là yêu cầu người làm phải lấy được Password (mật khẩu) để giúp Login (đăng nhập) vào Level tiếp theo. Có 1 số Level ko yêu cầu lấy Password mà chỉ cần thực hiện đăng nhập theo yêu cầu.
Solution này được mình tổng hợp lại sau khi đã hoàn thành Level 33 (Level cuối cùng hiện tại) của chuỗi bài thực hành này. Bản thân mình thấy chuỗi bài thực hành cơ bản này khá có ích với những ai đang tìm hiểu về Linux cơ bản. Do đó mình viết lại vào đây để lưu trữ cũng như sau này cho em trai mình tham khảo.
Lưu ý, toàn bộ đề bài ở trong link của Overthewire, do đó mình sẽ ko nhắc lại đề bài ở mỗi Level; nhưng sẽ diễn giải lại yêu cầu của đề bài để có thể dễ hiểu hơn.
Level 0
Level này yêu cầu bạn phải SSH (Secure Shell) vào 1 Host (máy chủ) với các yêu cầu:
- User: bandit0 (sử dụng user bandit0 để đăng nhập)
- Host: http://bandit.labs.overthewire.org (đăng nhập vào host này)
- Password: bandit0 (Password của user bandit0 là bandit0)
- Port: 2220 (Chỉ được phép đăng nhập vào port (cổng) 2220 này)
Như ta được biết, port 22 là port mặc định của kết nối SSH. Tuy nhiên ta có thể tùy chỉnh lại port khi thực hiện kết nối. Do đó, ở Level này, ta chỉ cần sử dụng lệnh ssh trên Linux là xong.
ssh bandit0@bandit.labs.overthewire.org -p 2220 |
Lưu ý thêm dành cho toàn bộ Level như sau. Để login vào Level thứ i thì ta phải thoát khỏi Level hiện tại và sử dụng username bandit + $i. Ví dụ để đăng nhập vào Level 1 thì sẽ phải sử dụng username bandit1, ...
Sau khi ấn Enter, bạn sẽ phải khai báo thêm password để login. Hãy nhập "bandit0" như đề bài đã cho và hoàn thành Level thô sơ này.
Level 0 → Level 1
Trong Level này, password được lưu trong 1 file có tên readme. Hãy xem hình để thấy các câu lệnh tôi sử dụng.
Level 0 |
Để lấy được nội dụng file readme, ta có rất nhiều cách. Ngoài cat, ra còn có tac, more, head, tail, ... Các bạn tự tìm hiểu thêm.
Level 1 → Level 2
Trong Level này, password được lưu trong 1 file có tên là -. Đây là 1 file khác lạ. Để đọc nội dung file này, ta vẫn có thể sử dụng cat, nhưng ko thể cat theo cách thông thường được.
Level 1 |
Với 1 số file đặc biệt, ta phải thêm dấu thực thi "./" vào đầu file trước khi đọc, như trường hợp trên là 1 ví dụ.
Level 2 → Level 3
Trong Level này, password cần lấy nằm ở 1 file có dấu space trong tên file. Ta cũng vẫn dùng cat được như sau:
Level 2 |
Ta thấy có 2 cách có thể cat được nội dung của file đó ra như trong hình. Để đơn giản, bạn chỉ cần sử dụng phím Tab để Terminal tự gợi ý cho chúng ta.
Level 3 → Level 4
Trong Level này, password cần lấy được lưu trong 1 file ẩn. Do đó, thay vì dùng ls, bạn nên sử dụng ls -a như 1 thói quen!
Level 3 |
Level 4 → Level 5
Trong Level này, password được lưu trong 1 file mà con người có thể đọc được (tức là ko có những ký tự đặc biệt. Bạn chỉ việc cat thử cả 8 file thôi.
Level 4 |
Level 5 → Level 6
Trong level này, password cần lấy được lưu trong 1 file có các đặc điểm:
Dấu "." sau find nghĩa là tìm trong thư mục hiện tại.
- con người có thể đọc.
- kích thước 1033 bytes.
- ko phải file thực thi (ko có quyền x)
Vấn đề ở Level này là ta chỉ biết file đó nằm đâu đó trong thư mục inhere, chứ ko biết nó nằm cụ thể ở thư mục nào. Do đó ta phải dùng lệnh find kết hợp cùng các tùy chọn để tìm ra những file thỏa mãn 3 yêu cầu trên.
Level 5 |
Level 6 → Level 7
Trong Level này, password cần tìm được lưu trong 1 file nằm đâu đó trên server (đâu đó trên server nhé, ko phải đâu đó trong thư mục hiện tại như Level 5 đâu), và thỏa mãn 3 điều kiện:
- Được sở hữu bởi user bandit7
- Được sở hữu bởi group bandit6
- Kích thước 33 bytes.
Level 6 |
Vì sao lại có 2>/dev/null ở kia? Lý do là vì ta phải tìm kiếm trong root, nên sẽ có những file mà ta ko có quyền đọc! Ở đây sẽ xuất hiện kết quả lỗi là "Permisson denied" rất nhiều! Ko tin bạn có thể bỏ 2>/dev/null khỏi câu lệnh mà xem!
/dev/null là 1 hố đen trong Linux, bạn muốn vất bao nhiêu vào đó cũng OK. Còn 2> là luồng các kết quả lỗi; do đó 2>/dev/null có nghĩa là bạn quẳng tất cả các kết quả lỗi vào trong cái hố đen /dev/null, còn lại các kết quả ko lỗi thì được giữ lại và hiển thị lên console.
Level 7 → Level 8
Trong level này, password cần lấy nằm trong file data.txt, và nó nằm ở cạnh từ millionth. Ta sẽ dùng grep để trích xuất ra những dòng có chứa từ millionth sau khi cat file data.txt.
Level 7 |
Trong câu lệnh trên, ta đã sử dụng kỹ thuật pipe (đường ống |) để lọc toàn bộ kết quả sau khi cat ra rồi so khớp bằng lệnh grep với từ khóa millionth.
Level 8 → Level 9
Trong Level này, password cần lấy lại chỉ là 1 dòng tồn tại duy nhất trong file text.txt. Do đó, ta sẽ phải sắp xếp lại kết quả thu được sau cat bằng sort; rồi tìm kiếm phần tử tồn tại duy nhất bằng uniq. Nếu ko sort, uniq ko thể tìm kiếm được kết quả tồn tại duy nhất.
Level 8 |
Level 9 → Level 10
Trong Level này, password nằm trong 1 string (chuỗi) mà con người có thể đọc được, và bắt đầu bằng 1 vài dấu =. Do đó, ta có thể sử dụng lệnh strings để in ra tất cả các chuỗi có thể in ra trong 1 file và sử dụng grep chỉ lấy ra các chuỗi có bắt đầu bằng dấu =.
Level 9 |
Level 10 → Level 11
Trong Level này, nội dung của file data.txt đã được mã hóa theo base64 (chuẩn base64). Do đó khi cat file này ra, ta sẽ ko hiểu được kết quả đâu. Vì vậy ta phải decode (giải mã) nó bằng tùy chọn -d trong lệnh base64.
Level 10 |
Chuẩn mã hóa base64 là 1 chuẩn mã hóa cổ điển. Khi có thời gian, mình sẽ viết bài trình bày rõ về chuẩn mã hóa này sau.
Nhận xét
Đăng nhận xét