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ì catgrep 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