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 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:

  • 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
Dấu "." sau find nghĩa là tìm trong thư mục hiện tại.

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.
Do đó, thay vì tìm trong thư mục hiện tại (.) như Level 5, ở Level này, ta phải tìm ở trong toàn bộ server, tức là thư mục root
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.

Level 11 → Level 12

Level 12 → Level 13

Level 13 → Level 14

Level 14 → Level 15

Level 15 → Level 16

Level 16 → Level 17

Level 17 → Level 18

Level 18 → Level 19

Level 19 → Level 20

Level 20 → Level 21

Level 21 → Level 22

Level 22 → Level 23

Level 23 → Level 24

Level 24 → Level 25

Level 25 → Level 26

Level 26 → Level 27

Level 27 → Level 28

Level 28 → Level 29

Level 29 → Level 30

Level 30 → Level 31

Level 31 → Level 32

Level 32 → Level 33

Level 33 → Level 34

Nhận xét

Bài đăng phổ biến từ blog này

Trên con đường tu đạo luôn cực kỳ theo đuổi!

C++ Con trỏ (Pointer) toàn thư: Phần 4: Con trỏ "đa cấp". Đánh nhau bằng con trỏ.

Quan hệ giữa các phân phối xác suất thông dụng nhất: Beta và Dirichlet không giống Gaussian!