# Bandit series:
### `một series học về linux căn bản của overthewire.org`
###### tags: Linux
---
## Level 0:
>https://overthewire.org/wargames/bandit/bandit0.html
>https://overthewire.org/wargames/bandit/bandit1.html
**Ở level 0 challenge sẽ giúp mình hiểu mình kết nối remote với một server thông qua giao thức ssh.**

Khi đang nhập thông qua giao thức ssh ta sẽ được hỏi password để có thể truy cập vào server.
Sau khi vào được server là dùng lệnh ==ls== để liệt kê các file đang có sẵn trong folder và lệnh ==cat== để thể hiện nội dung file ta cần đọc.

## Level 1:
>https://overthewire.org/wargames/bandit/bandit2.html
Sau khi có password ta dùng password để đăng nhập vào bandit01.
`ssh -p 2220 bandit1@bandit.labs.overthewire.org`
**Challenge giúp ta đọc một file với kí tự đặc biệt ở đầu tên file**

## Level 2:
>https://overthewire.org/wargames/bandit/bandit3.html
`ssh -p 2220 bandit2@bandit.labs.overthewire.org`
**Challenge này giúp ta đọc file với tên file có dấu space**

## Level 3:
>https://overthewire.org/wargames/bandit/bandit4.html
`ssh -p 2220 bandit3@bandit.labs.overthewire.org`
**Challenge này giúp ta đọc những file bị ẩn trong folder và đọc file có kí tự đặc biệt trong tên như ở Level 1**

Trong folder inhere khi sử dụng lệnh ==ls== ta không thấy bất kì file hay folder nào hiện lên do đó ta sử dụng lênh ==ls -a== để xem những file bị ẩn.
Sau đó ta thấy file ==.hidden== có kí tự đặc biệt ta dùng cú pháp ==-- .hidden== để đọc file.
## Level 4:
>https://overthewire.org/wargames/bandit/bandit5.html
`ssh -p 2220 bandit4@bandit.labs.overthewire.org`
**Challenge này giúp ta đọc file với tag human-readable**

khi sử dụng ==ls== trong folder inhere ta thấy có rất nhiều file nếu ==cat== từng file thì rất mất thời gian.
Do đó ta sử dụng lệnh ==file== để xem loại file. Cú pháp ==*== sẽ duyệt qua tất cả file trong folder.
Ta thấy ở file `-file07 :ASCII text` là file có thể đọc được.
Sử dụng ==cat== để đọc file.
## Level 5:
>https://overthewire.org/wargames/bandit/bandit6.html
`ssh -p 2220 bandit5@bandit.labs.overthewire.org`
**Challenge yêu cầu ta đọc file với tag human-readable, 1033 byte và not executable**

Tương tự như level 4 ở đây chúng ta có rất nhiều folder do đó không thể ==cd== từng folder mà kiếm được.
Chúng ta sử dụng lệnh ==find==.
Cú pháp ==./== là ta sẽ duyệt qua tất cả cả folder trong folder hiện tại, ==-size== là kích thước file ta cần tìm, ==-readble== là loại file có `ASCII text` và ==-not -executable== là file không thực thi được.
Sau khi có được đường dẫn thì ==cd== và ==cat==, cú pháp ==&&== cho phép ta thực thi 2 lệnh sau khi lệnh đầu đã được hoàn thành.
## Level 6:
>https://overthewire.org/wargames/bandit/bandit7.html
`ssh -p 2220 bandit6@bandit.labs.overthewire.org`
**Challenge giúp ta biết về đặc quyền của user và group trên từng file**

Chúng ta sử dụng lệnh ==find== để tìm file mà ta cần tìm với cú pháp ==/== chúng ta sẽ duyệt toàn bộ folder trên toàn server do đó khi xuất ra màn hình sẽ có rất nhiều dòng command báo lỗi.
Để khác phục ta sử dụng ==2>/dev/null== để bỏ qua những command báo lỗi.
>https://linuxhint.com/two-dev-null-command-purpose/
Với ==-user== và ==-group== ta sử dụng để tìm user và group cần tìm.
Sau đó sử dụng ==cd== và ==cat==.
## Level 7:
>https://overthewire.org/wargames/bandit/bandit8.html
`ssh -p 2220 bandit7@bandit.labs.overthewire.org`
**Challenge này yêu cầu ta tìm dòng có chữ cho trước trong một file**

Sử dụng lệnh ==grep== với cú pháp ==-w== để tìm từ mà ta cần tìm trong file.
## Level 8:
>https://overthewire.org/wargames/bandit/bandit9.html
`ssh -p 2220 bandit8@bandit.labs.overthewire.org`
**Challenge này yêu cầu ta tìm dòng chỉ xuất hiện duy nhất 1 lần trong file**

Ở đây ta sử dụng lệnh ==sort== để sắp xếp lại các dòng giống nhau.
Sau đó sử dụng lệnh ==uniq -u== lệnh này sẽ xuất ra màn hình dòng chỉ xuất hiện một lần duy nhất.
Ở đây có cú pháp ==|== cú pháp này sẽ lấy kết quả mà command 1 đã thực hiện sau đó thực hiện command 2.
## Level 9:
>https://overthewire.org/wargames/bandit/bandit10.html
`ssh -p 2220 bandit9@bandit.labs.overthewire.org`
**Challenge này yêu cầu ta xuất chuỗi human-readable strings và đứng trước có kí tự đặc biệt**

Ta sử dụng lệnh ==strings== để lọc ra các `human-readable strings` là các chuỗi có `ASCII text` sau đó sử dụng ==grep== để tìm các string có kí tự `==`.
## Level 10:
>https://overthewire.org/wargames/bandit/bandit11.html
`ssh -p 2220 bandit10@bandit.labs.overthewire.org`
**Challenge này yêu cầu ta decode một đoạn mã đã bị encode bằng base64**

Ta sử dụng lệnh ==base64 -d== để giải mã đoạn mã đã bị mã hóa để lấy password.
## Level 11:
>https://overthewire.org/wargames/bandit/bandit12.html
`ssh -p 2220 bandit11@bandit.labs.overthewire.org`
**Challenge này yêu cầu ta decode một đoạn mã bị encode bằng rot13**

Sau khi ==cat== file `data.txt` chúng ta sẽ thấy một đoạn mã bị encode, ta có đem nó decode bằng tool trên google.
Với Linux thì không có lệnh rot13 sẵn như base64.
Chúng ta sẽ sử dụng lệnh ==tr== lệnh này cho chúng ta dịch chuyển hoặc xóa các kí tự theo quy luật mà ta sắp xếp.
## Level 12:
>https://overthewire.org/wargames/bandit/bandit13.html
`ssh -p 2220 bandit12@bandit.labs.overthewire.org`
- [ ] Đây là một trong những level theo mình là khá khó cho beginner ở mức độ easy.
**Challenge này giúp ta hiểu được các dạng file nén trên Linux, cách phân biệt giữa chúng, cách nén và giải nén những loại file đó**

Đầu tiên đề kêu ta tạo một thư mực trong đường dẫn ==/tmp== ở đây ta sử dụng lệnh ==mkdir== để tạo folder có tên là ==baigiai== trong folder ==/tmp==.
Sử dụng lệnh ==cp== để copy file `data.txt` vào đường dẫn vừa tạo, sau đó sử dụng ==cd== để vào đường dẫn.

Sau khi ==cat== file `data.txt` ra chúng ta sẽ thấy như hình ở trên đây là một file hexdump. Lệnh ==head== sẽ xuất ra 10 dòng đầu tiên của một file do đó sẽ dễ nhìn hơn.

Lệnh ==xxd -r== sẽ trả về giá trị binary của file hex. Ở đây ta lưu giá trị trả về vào file tên là `data`.
Ta sử dụng lệnh ==file== để xem loại file. Ta sẽ thấy dòng chữ `gzip compressed data` do đó đây là file có data được nén theo định dạng `gzip`.

Sử dụng ==mv== để chuyển từ file `data` sang tệp `data.gz`
Lệnh ==gzip -d== sẽ giải nén tệp `data.gz`, sử dụng lệnh ==ls== ta sẽ thấy lại file `data`, nhưng khi sài ==file== ta sẽ thấy dòng thông báo mới `bzip2 compressed data`--> Data dạng bị nén dưới định dạng `bzip2`.

Tương tự như với gzip ta lặp lại các thao tác cũ.

Sau khi lặp lại các thao tác thì lúc này sau khi sử dụng ==file== ta gặp một dòng thông báo mới. Data dạng bị nén trong định dạng `tar`.

Sau khi đổi file `data` thành tệp tar. Ta sử dụng lệnh ==tar xf== để giải nén file `tar`.

Lặp lại các quá trình như trên.

Sau khi hoàn tất thì khi sử dụng lệnh ==file== sẽ gặp lại dòng `ASCII text` sử dụng ==cat== để đọc file.
## Level 13:
>https://overthewire.org/wargames/bandit/bandit14.html
`ssh -p 2220 bandit13@bandit.labs.overthewire.org`
**Challenge này cho ta biết ngoài cách nhập password để đăng nhập thì còn cách là sử dụng sshkey để xác thực thay cho password**

Ta sẽ copy sshkey lại lưu vào một file trong máy.

Sử dụng sskey vừa lưu để đăng nhập vào Level 14.
## Level 14:
>https://overthewire.org/wargames/bandit/bandit15.html
`ssh -p 2220 bandit14@bandit.labs.overthewire.org -i ...`
**Challenge này giúp ta biết về localhost trên server**

Sử dụng sshkey vừa nãy để đăng nhập vào server thay cho password, cú pháp ==-i== để xác thực sshkey.

Quay lại Level 13 chúng ta vẫn còn một dữ liệu chưa xài đó là `/etc/bandit_pass/bandit14 and can only be read by user bandit14`. Chỉ khi nào đăng nhập vào bằng user của bandit14 chúng ta mới chạy được dữ liệu này. Sau khi truy cập và ==cat== được file `bandit14`.
Ta quay lại mục đích của Level này là kết nối vào localhost trên server.

Ở đây chúng ta sử dụng ==nc== để kết nối với `localhost` thông qua port `30000` sau đó đưa vào password của `bandit14` máy chủ sẽ trả về cho ta password của `bandit15`.
- nc hay netcat là một kết nối tới host từ xa thông qua giao thức TCP/UDP
## Level 15:
>https://overthewire.org/wargames/bandit/bandit16.html
- [ ] Theo mình từ đây mức độ của các challenge sẽ bắt đầu ở mức medium.
`ssh -p 2220 bandit15@bandit.labs.overthewire.org`
**Challenge này sẽ giúp ta biết một cách kết nối thay cho netcat là openssl**

Cú pháp ==s_client== sẽ tạo một cái nối từ xa tới host thông qua SSL/TLS với mục đích truyền dữ liệu.
Cú pháp ==-connect== sẽ kết nối tới host và port cần truy cập.

Sau khi đã kết nối, kéo đến dòng cuối ta sẽ thấy dòng chữ `Read R BLOCK` ta nhập đúng password tới server thì server sẽ trả về password mới cho chúng ta.
## Level 16:
>https://overthewire.org/wargames/bandit/bandit17.html
`ssh -p 2220 bandit16@bandit.labs.overthewire.org`
**Challenge này giúp ta cách xem các port đang chạy trên một server và các service trên các port đó**

Sử dụng ==nmap== để quét các port trên server ở đây ta sẽ quét từ dãy `31000-32000`, ==-sV== cho ta biết các service đang chạy trên các port đó.
Ở đây ta thấy 2 service đang chạy ssl do đó ta sẽ sử dụng openssl.
Ở port `31518` khi ta kết nối nếu truyền vào một giá trị nó sẽ trả về đúng giá trị đó, nguyên nhân là có lệnh ==echo== lệnh này sẽ in những dòng ta ==echo== ra màn hình.

Ta sẽ kết nói với port `31790`.

Sau khi nhập đúng password, 1 sshkey sẽ trả về như ở Level 13.
Ta làm tương tự như Level 13 để lấy sshkey.
## Level 17:
>https://overthewire.org/wargames/bandit/bandit18.html
`ssh -p 2220 bandit17@bandit.labs.overthewire.org -i ...`
**Challenge này cho ta biết so sánh về kí tự giữa 2 file khác nhau**

Một vấn đề mà mình gặp phải khi kết nối với bài này là server không nhận sshkey của mình do mình để đặc quyền file này `too open`.

Vì thế mình phải sử dụng lệnh ==chmod== để chỉnh sửa lại đặc quyền của file. Ở đây là `400` là chỉ `read` bởi `owner`.

Sau khi vào được ta sẽ thấy 2 file.
Sử dụng lệnh ==diff== với cú pháp ==-normal== output sẽ được xuất ra theo kiểu thông thường. Dòng trên là của file `passwords.new` và dòng dưới là của file `passwords.old`
- https://chmod-calculator.com/ một trang tính toán về đặc quyền trên Linux.
## Level 18:
>https://overthewire.org/wargames/bandit/bandit19.html
`ssh -p 2220 bandit18@bandit.labs.overthewire.org ...`
**Challenge này cho ta biết không cần phải truy cập trực tiếp vào host thông qua ssh mà có thể kết hợp với một lệnh khác**

Nếu chúng ta kết nối trực tiếp theo cách thông thường thì khi nhập xong password kết nối sẽ bị ngắt.
Nguyên nhân là với file `.bashrc` đoạn script sẽ được thực thì khi một người dùng đăng nhập. Ở đây là ngắt kết nối với host.

Thay vì dùng ==ssh== để truy cập trực tiếp vào server ta có thể thông qua ==ssh== để sử dụng lệnh ==cat== để đọc file trên server mà không phải đăng nhập trực tiếp vào.
## Level 19:
>https://overthewire.org/wargames/bandit/bandit20.html
`ssh -p 2220 bandit19@bandit.labs.overthewire.org`
**Challenge này cho ta thấy cách thực thi một file đặc nguyền là như thế nào**

Khi ta gõ ==./bandit20-do== nó sẽ chạy như một câu lệnh xác định người dùng và hiển thị `run a command as another user` nghĩa là nó chạy 1 câu lệnh như một người dùng khác.

Sử dụng lệnh ==ls -la== để kiểm tra đặc quyền của từng file hay folder.
Ta thấy `bandit20-do` nằm ở `group bandit19` và `owner bandit20` do đó lệnh có thể được thực thi ở user bandit19 nhưng file sẽ được chạy dưới quyền của bandit20.

Do ==./bandidt20-do== chạy như một người dùng nên ta có thể thêm lệnh vào để chạy ra password.
## Level 20:
>https://overthewire.org/wargames/bandit/bandit21.html
`ssh -p 2220 bandit20@bandit.labs.overthewire.org`
**Challenge giúp ta cách tạo một port trên localhost**

Đầu tiên ta sẽ lệnh ==./suconnect== lệnh này sẽ sẽ so sánh mật khẩu mà ta truyền vào ở trên port mà ta kết nối với mật khẩu ở Level 19. Nếu đúng sẽ trả về một password mới.

Ta sẽ cho input trên port là password của của Level 19, cú pháp ==/n== sẽ không cho xuất hiện một dòng mới ở cuối output. Sử dụng ==|== để thêm lệnh, ==-l== port sẽ lắng nghe khi ta kết nói, ==-p== port mà ta muốn tạo ra.
Dấu ==&== sẽ cho lệnh chạy ở phía background nghĩa là khi ta không chủ động tắt thì lệnh sẽ được chạy ngầm. Chạy một lệnh khác sẽ không ảnh hưởng đến lệnh đang chạy.

Sử dụng lệnh ==./suconnect== để kết nối với port mà ta đã tạo. Sau khi kiểm tra đúng sẽ trả về mật khẩu mới.