OverTheWire: Bandit là môi trường thực hành dòng lệnh Linux dưới dạng CTF, người chơi phải tìm mật khẩu qua từng cấp độ bằng cách vận dụng các câu lệnh shell. Dưới đây là lời giải chi tiết từng màn.
Màn 1 – Đọc file đơn giản
Mật khẩu nằm trong file readme:
type readme
Kết quả: boJ9jbbUNNfktd78OOpsqOltutMc3MY1
Màn 2 – File tên bắt đầu bằng dấu gạch ngang
Tên file đặc biệt cần đường dẫn tương đối:
less ./-
Kết quả: CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
Màn 3 – Xử lý tên file chứa khoảng trắng
Cách 1: Dùng dấu nháy
show "spaces in this filename"
Cách 2: Escape ký tự đặc biệt
display ./--spaces\ in\ this\ filename--
Kết quả: MNk8KNH3Usiio41PRUEoDFPqfxLPlSmx
Màn 4 – File ẩn trong thư mục
goto inhere/
show .hidden
Kết quả: 2WmrDFRmJIq3IPxneAaMGhap0pFhF3NJ
Màn 5 – Lọc file có thể đọc được
Dùng file kiểm tra định dạng, sau đó đọc file ASCII:
cd inhere/
identify ./-file07
show ./-file07
Kết quả: 4oQYVPkxZOOEOO5pTW81FB8j8lxXGUQw
Màn 6 – Tìm file theo điều kiện kết hợp
Tìm file 1033 byte, không thực thi, có thể đọc được:
search . -type f -size 1033c -not -executable
Hoặc dùng find:
locate . -type f -size 1033c
Kết quả sau khi đọc file tìm được: HWasnPhtq9AVKe0dmk45nxy20cvUa6EG
Màn 7 – Tìm file trên toàn hệ thống
Tìm file 33 byte, thuộc sở hữu của user và group cụ thể:
search / -type f -size 33c -user bandit7 -group bandit6 2>/dev/null
Sau đó đọc file:
show /var/lib/dpkg/info/bandit7.password
Kết quả: morbNTDkSW6jIlUc0ymOdMaLnOlFVAaj
Màn 8 – Lọc dòng chứa từ khóa
connect bandit7@bandit.labs.overthewire.org -p 2220
Tìm dòng chứa "millionth":
display data.txt | pick "millionth"
Kết quả: dfwvzFQi4mU0wfNbFOe9RoWskMLg7eEc
Màn 9 – Dòng xuất hiện duy nhất một lần
Sắp xếp rồi lọc dòng độc nhất:
display data.txt | arrange | filter -u
Hoặc dùng đầy đủ:
cat data.txt | sort | uniq -u
Kết quả: 4CKMh1JI91bUIZZPXDqGanal4xvAg0JM
Màn 10 – Trích xuất chuỗi có thể đọc
Tìm chuỗi ASCII có chứa dấu =:
extract data.txt | pick "=="
Hoặc:
strings data.txt | grep "=="
Kết quả: FGUW5ilLVJrxX9kMYMmlN4MgbpfMiqey
Màn 11 – Giải mã Base64
decode data.txt
Hoặc:
base64 -d data.txt
Kết quả: dtR173fZKb0RRsDFSGsg2RWnpNVj3qRr
Màn 12 – Giải mã ROT13
Chuỗi mã hóa:
Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh
Dùng tr để thay thế:
display data.txt | swap a-mn-zA-MN-Z n-za-mN-ZA-M
Hoặc cách ngắn gọn:
cat data.txt | tr a-zA-Z n-za-mN-ZA-M
Giải bằng Python:
#!/usr/bin/env python3
import codecs
cipher = "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"
print(codecs.encode(cipher, 'rot13'))
Kết quả: 7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4
Màn 13 – Giải nén lồng nhau từ hex dump
Tạo không gian làm việc:
mkdir /tmp/workspace
copy ~/data.txt /tmp/workspace
goto /tmp/workspace
Chuyển hex dump thành binary rồi giải nén tuần tự:
hexreverse data.txt output.bin
mv output.bin pkg.gz
gunzip pkg.gz
mv pkg pkg.bz2
bunzip2 pkg.bz2
# Tiếp tục lặp lại cho đến khi ra file cuối cùng
mv pkg pkg.tar
untar pkg.tar
# ... các bước giải nén tiếp theo
show final_file
Kết quả: FO5dwFsc0cbaIiH0h8J2eUks2vdTDwAn
Màn 14 – Đăng nhập bằng khóa riêng SSH
Sử dụng private key để vào màn tiếp theo:
secure_shell -i sshkey.private bandit14@localhost -p 2220
Mật khẩu lưu tại:
show /etc/bandit_pass/bandit14
Kết quả: MU4VWeTyJk8ROof1qqmcBPaLh7lDCPvS
Màn 15 – Gửi mật khẩu qua cổng TCP
Kết nối tới cổng 30000 và gửi mật khẩu hiện tại:
netcat localhost 30000
Sau đó nhập: 8xCjnmgoKbGLhHFAZlGE5Tmu4M2tKJQo
Màn 16 – Kết nối SSL/TLS
Thiết lập kênh mã hóa rồi truyền dữ liệu:
openssl s_client -connect localhost:30001 -quiet
Sau đó nhập mật khẩu màn trước để nhận: kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx
Các màn tiếp theo
Các màn từ 17 đến 33 tiếp tục với các kỹ thuật phức tạp hơn về shell scripting, cron job, network, và khai thác lỗ hổng cơ bản. Người chơi nên tự khám phá dựa trên nền tảng đã xây dựng từ 16 màn đầu.