OverTheWire Bandit
OverTheWire
BANDIT WRITEUP
Author:
Pham Quoc Trung
Used Language:
Python3
Problem Solving
Level 0
Des: https://overthewire.org/wargames/bandit/bandit0.html
Với challenge đầu tiên, mình chỉ cần sử dụng dòng lệnh sau: ssh bandit0@bandit.labs.overthewire.org -p 2220
Level 0 → Level 1
Des: https://overthewire.org/wargames/bandit/bandit1.html
Sử dụng lệnh ls để xem trong directory hiện tại có những file nào
Mình dùng lệnh cat để xem nội dung file readme và lấy được pass cho level tiếp theo
Level 1 → Level 2
Des: https://overthewire.org/wargames/bandit/bandit2.html
Ở đây khi ls ta thấy có một file tên là "-". Điều này làm cho khi ta chạy lệnh cat - bình thường sẽ không được vì dấu - thường dùng để xác định option.
Ở đây, mình có thể sử dụng "--" để chỉ định rằng các tham số sau đó không phải là tùy chọn. Nó sẽ hoạt động khi file có dạng "-abcxyz". Còn ở đây, mình sẽ dùng như sau:
Mình đã dùng "./-" để xác định "-" là 1 tệp nằm trong directory hiện tại.
Tham khảo: https://stackoverflow.com/questions/42187323/how-to-open-a-dashed-filename-using-terminal
Các cách khác như link tham khảo:
Level 2 → Level 3
Des: https://overthewire.org/wargames/bandit/bandit3.html
Ở đây thì file chứa password có chứa dấu cách, mình chỉ cần đặt tên file trong "" để xác định nó là một chuỗi là oke
Level 3 → Level 4
Des: https://overthewire.org/wargames/bandit/bandit4.html
Khi ls mình thấy có một folder tên "inhere". Sử dụng lệnh cd để truy cập vào nó
Khi ls bình thường sẽ không ra file gì. Ở đây mình sẽ sử dụng lệnh ls -a để hiển thị ra file ẩn. Trong linux, file ẩn sẽ có dấu "." ở đầu
Sử dụng cat để lấy password
Level 4 → Level 5
Des: https://overthewire.org/wargames/bandit/bandit5.html
Ở đây sau khi vào thư mục "inhere" ta sẽ thấy có 9 file
Các bạn có thể cat từng file để kiếm password, hoặc sử dụng cat -- -file0* để cat tất cả các file. Tuy nhiên có vẻ hơi rối.
Dựa vào việc file chứa password sẽ là các kí tự human-readable, mình chỉ cần tìm ra file chứa ASCII. Ở đây, mình có thể sử dụng lệnh file để thực hiện
Nhận thấy file "-file07" là ASCII text, mình cat và lấy được password
Level 5 → Level 6
Des: https://overthewire.org/wargames/bandit/bandit6.html
Ở đây, trong folder "inhere" chứa rất nhiều các folder khác, và trong từng folder có rất nhiều file
Dựa vào các tiêu chí của file cần tìm như sau:
human-readable
1033 bytes in size
not executable
Ở đây, mình sẽ sử dụng lệnh find. Do lệnh find có sẵn option về size, mình sẽ sử dụng dữ kiện đó trước.
Ở đây thì bài này chỉ có mỗi 1 file 1033 bytes nên mình không cần dựa vào các tiêu chí khác nữa. Tuy nhiên, nếu có nhiều file hiện ra thì mình sẽ làm như sau.
Thêm human-readable:
Note: "{}" sẽ được thay thế bằng tên từng file tìm bởi lệnh find, "\;"" đánh dấu kết thúc của mệnh đề -exec
Thêm not executable
Lấy password:
Level 6 → Level 7
Des: https://overthewire.org/wargames/bandit/bandit7.html
Do folder hiện tại có vẻ không có gì, thử cd .. để lùi về directory cha. Và ta lại thấy rất nhiều folder
Dựa trên 3 tiêu chí của file cần tìm
owned by user bandit7
owned by group bandit6
33 bytes in size
Các thông số trên có thể được xem thông qua lệnh ls -l. Ví dụ:
Ở đây, root thứ nhất là user, root thứ hai là group, 4096 bytes là size.
Để tìm file có các tiêu chí trên, các bạn có thể dùng find kết hợp exec ls -l, tuy nhiên trong find đã có sẵn các tùy chọn về user và group nên mình sẽ dùng luôn
Mình sử dụng 2>/dev/null để không hiện các error message. Tuy nhiên có vẻ không tìm ra trong folder này. Thử tìm toàn bộ coi sao.
Và mình ra được pass:
Level 7 → Level 8
Des: https://overthewire.org/wargames/bandit/bandit8.html
Ở đây ta có file "data.txt" chứa rất nhiều user và password. Việc cần tìm là password của "millionth".
Sử dụng grep:
Level 8 → Level 9
Des: https://overthewire.org/wargames/bandit/bandit9.html
Ở đây, ta có thể sử dụng uniq -u để lọc ra dòng không có duplicate. Tuy nhiên, dữ liệu đưa vào uniq phải được sắp xếp nên ta sẽ sử dụng thêm sort
Level 9 → Level 10
Des: https://overthewire.org/wargames/bandit/bandit10.html
Ở đây, mình sẽ sử dụng grep để tìm các dấu "=" liền nhau, và sử dụng strings thay vì cat vì grep không dùng được nếu stdin có chứa dữ liệu không phải ASCII.
Level 10 → Level 11
Des: https://overthewire.org/wargames/bandit/bandit11.html
Ở đây, khi đọc file "data.txt" ta được 1 đoạn mã base64:
Có thể sử dụng các tool online như CyberChef để decode. Tuy nhiên, có thể sử dụng lệnh trên linux luôn như sau:
Level 11 → Level 12
Des: https://overthewire.org/wargames/bandit/bandit12.html
Sau khi đọc file "data.txt"ta được 1 đoạn mã ROT13:
Sử dụng bất kì tool nào trên mạng hoặc decode bằng tay, ta được:
Level 12 → Level 13
Des: https://overthewire.org/wargames/bandit/bandit13.html
Ở đây, khi xem file "data.txt" mình thấy được dữ liệu hexdump
Đây có thể được gen ra bằng xxd. Mình sẽ sử dụng xxd -r để biến nó về dạng ban đầu.
Sau khi phục hồi, mình thu được một file gzip. Để giải nén, mình sử dụng lệnh gzip -d. Để làm được thì mình phải thêm đuôi .gz đã
Sau khi giải nén mình thu được 1 file bzip2. Sử dụng bzip2 -d để giải nén
Tiếp tục thu được một file gzip. Làm tương tự
Lần này thì thu được một file tar. Sử dụng tar -xvf để giải nén nó:
Lặp lại quá trình trên vài lần, ta sẽ ra được password
Level 13 → Level 14
Des: https://overthewire.org/wargames/bandit/bandit14.html
Ở đây, ta có private key để ssh vào level tiếp theo. Thử với ssh -i
Ta đã thành công vào được level tiếp theo. Giờ chỉ việc lấy pass ở nơi trong đề bài.
Level 14 → Level 15
Des: https://overthewire.org/wargames/bandit/bandit15.html
Đơn giản chỉ là nộp pass vào cổng 30000. Mình đã thử với các giao thức khác nhau và kết quả là telnet
Level 15 → Level 16
Des: https://overthewire.org/wargames/bandit/bandit16.html
Tham khảo: https://superuser.com/questions/346958/can-the-telnet-or-netcat-clients-communicate-over-ssl
Mình sẽ sử dụng openssl để làm bài này:
Level 16 → Level 17
Des: https://overthewire.org/wargames/bandit/bandit17.html
Mình sẽ sử dụng nmap -sV -p để quét các cổng
Dựa vào kết quả nmap có thể nhận ra port mình cần là 31790. Kết nôi tới, mình ra được private ssh key của level tiếp theo
Do thư mục hiện tại không được phép ghi gì nên mình sẽ lưu private key này vào tmp và ssh tới level tiếp theo
Lúc này sẽ xảy ra lỗi như vậy. Mình thử chmod 400 cho key.private và ssh thành công
Giống như level nào đó, mình có thể lấy pass bằng cách
Level 17 → Level 18
Des: https://overthewire.org/wargames/bandit/bandit18.html
Sử dụng diff, ta ra được password:
Level 18 → Level 19
Des: https://overthewire.org/wargames/bandit/bandit19.html
Ở challenge này, khi ta ssh tới sẽ bị log out ra. Đề bài nói do file .bashrc đã được sửa đổi (.bashrc là tệp cấu hình cho môi trường dòng lệnh Bash của một người dùng trên hệ thống Linux hoặc Unix)
Để giải quyết vấn đề, ta có thể không sử dụng bash để ssh tới mà sử dụng một shell khác với tham số -t khi ssh. ssh bandit18@bandit.labs.overthewire.org -p 2220 -t "/bin/sh"
Và ta có được pass
Level 19 → Level 20
Des: https://overthewire.org/wargames/bandit/bandit20.html
Này là minh họa cho setuid. Trong linux, nó cho phép một tệp thực thi chạy với quyền của người sở hữu (owner) của tệp thay vì với quyền của người dùng thực hiện tệp. Khi ls -l sẽ thấy có chữ "s"
File bandit20-do sẽ giúp chúng ta thực thi lệnh dưới quyền bandit20. Lấy password bằng cách sau:
Level 20 → Level 21
Des: https://overthewire.org/wargames/bandit/bandit21.html
File "suconnect" sẽ kết nối tới cổng người dùng nhập và lấy dữ liệu trả về. Nếu trùng với password của level trước thì sẽ trả về password của level sau
Vậy ta có thể tạo 1 server mà khi kết nối tới sẽ trả về password cũ. Các bạn có thể viết code hoặc sử dụng netcat như sau:
Giờ chỉ cần chạy file
Level 21 → Level 22
Des: https://overthewire.org/wargames/bandit/bandit22.html
Thử cd vào folder cron.d ta có các file
Mở file có chữ bandit22, ta thấy công việc đc thực hiện khi chạy level.
Thử xem file xem điều gì được thực thi, mình tìm đc nơi lưu password:
Việc còn lại chỉ là lấy pass
Level 22 → Level 23
Des: https://overthewire.org/wargames/bandit/bandit23.html
Tương tự level trước, ở đây mình có nội dung file "cronjob_bandit23.sh" như sau
Có thể thấy pass đc lưu vào file "/tmp/$mytarget" với mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1). Chúng ta hoàn toàn có thể tính được giá trị mytarget vì đã biết $myname là bandit23 bằng cách nhập vào terminal:
Cat để lấy password:
Level 23 → Level 24
Des: https://overthewire.org/wargames/bandit/bandit24.html
Cũng tương tự, đây là nội dung file "cronjob_bandit24.sh"
Script này đơn thuần là kiểm tra tất cả các file trong /var/spool/bandit24/foo và xóa các file có owner là bandit23. Tuy nhiên, trước khi xóa, nó lại thực thi file đó. Vì vậy, ta có thể viết script để lấy pass của bandit24.
Viết trong tmp và đáp nó vào trong thư mục "foo". Chúng ta sẽ ngồi chờ chương trình được thực thi và mở file trungpqt ra xem pass
Level 24 → Level 25
Des: https://overthewire.org/wargames/bandit/bandit25.html
Đề bài yêu cầu kết nối tới cổng 30002. Chương trình sẽ bắt chúng ta nhập vào pass của bandit24 và 1 pincode gồm 4 chữ số. Ta có thể viết bashscript để thực hiện gen ra payload như sau
Sau đó ta chạy lệnh:
Các bạn có thể viết code python pwntools nhưng nó sẽ rất lâu
Level 25 → Level 26
Des: https://overthewire.org/wargames/bandit/bandit26.html
Ở đây, ta có được private key để ssh tới bandit26. Tuy nhiên, khi ssh tới thì bị diss lun
Đọc kĩ lại đề bài, ở đây ta được biết bandit26 không dùng /bin/bash. Vậy nó dùng cái gì? Có thể kiểm tra bằng cách xem trong /etc/passwd
Ở đây, ta thấy user này sử dụng /usr/bin/showtext. Thử đọc nội dung của nó
Ta thấy nó thực hiện lệnh more để đọc file text.txt, khi đọc xong sẽ exit luôn. Điều thú vị ở lệnh more là nếu màn hình không đủ lớn để đọc hết 1 đoạn text thì nó sẽ cho mình hiển thị dần chứ không như lệnh cat. Trong lúc như vậy, ta có thể gọi ra shell để lấy được password.
Vậy đầu tiên là ta phải thu nhỏ màn hình terminal lại hết cỡ có thể, rồi sau đó ssh. Ta sẽ vào được more. Khi bạn đã không bị diss, hãy ấn nút V. Khi ấn V trong more, ta sẽ được nhảy sang vim
Khi này, ta có thể lấy pass bằng cách gõ lệnh sau trong vim
hoặc ta có thể làm như sau để lấy được shell của bandit26:
Từ 2 cách trên đều sẽ lấy được pass là c7GvcKlw9mC7aUQaPx7nwFstuAIBw1o1
Level 26 → Level 27
Des: https://overthewire.org/wargames/bandit/bandit27.html
Này thì lại là setuid
Level 27 → Level 28
Des: https://overthewire.org/wargames/bandit/bandit28.html
Như đề bài chỉ, đầu tiên ta git clone repo qua cổng 2220
Mở repo và đọc file, ta ra password
Level 28 → Level 29
Des: https://overthewire.org/wargames/bandit/bandit29.html
Tương tự level trước, ta git clone repo về và đọc file. Tuy nhiên lần này thì không có luôn password
Mình sẽ thử dùng git log -p để xem lịch sử commit
Và ta đã thấy password
Level 29 → Level 30
Des: https://overthewire.org/wargames/bandit/bandit30.html
Tương tự, nội dung file README lần này là
Last updated