Wednesday, February 27, 2019

[Writeup] OverTheWire - Bandit

Level 1:

Thử thách này sau khi kết nối đến server dùng lệnh ls, chúng ta thấy một file readme cat file đó chúng ta có được password cho level tiếp theo.

Password: boJ9jbbUNNfktd78OOpsqOltutMc3MY1

Level 2:

Dùng lệnh ls -lia kiểm tra, chúng ta thấy có 1 file -, vì là special character nên khi dùng lệnh cat - chúng ta không thể đọc được. Để bypass chúng ta dùng cat ./- 

Password: CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

Level 3:

Chúng ta cần file cat file spaces in this filename tuy nhiên vì trong tên file có dấu cách nếu chúng ta chỉ đơn thuần dùng lệnh cat spaces in this filename thì sẽ sai vì câu lệnh này tương đương với cat 4 file: spaces, in, this, filename. Thay vào đó ta cần thêm dấu \ vào cuối kết thúc mối từ hoặc đơn giản hơn là dùng phím tab ta sẽ có lệnh hoàn chỉnh: cat spaces\ in\ this\ filename

Password: UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

Level 4:

Vẫn tiếp tục dùng lệnh ls -lia mình thấy có file .hidden, cat .hidden và chúng ta có được password truy cập level 5:

Password: pIwrPrtPN36QITSp3EQaw936yaFoFgAB

Level 5:

Chúng ta có 10 file cả thẩy, thì mình nghĩ cat lần lượt từng file sẽ ra được password cho level 6, tuy nhiên có một cách nhanh hơn đó là dùng lệnh file để xem file nào đọc được. Thử file00 với lệnh file ./-file00 mình nhận được kết quả là file data, đối với tất cả các file mình dùng lệnh: file ./* dễ dàng nhìn thấy file07 là file chứa chuỗi ascii có thể đọc được. cat ./-file07 mình có được password.

Password: koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Level 6:

Bài này trong thư mục inhere có rất nhiều file và folder và rất nhiều file dạng ascii nên mình không biết được file nào là file cần tìm. Tuy nhiên để ý description của bài này thì chúng ta có gợi ý là file có thể đọc được size là 1033 byte và không thể thực thi. Mình thử tìm xem có bao nhiêu file có kích thước là 1033 byte với lệnh find -size 1033c  (chữ c trong find là dùng cho đơn vị byte) thì chỉ có đúng một file ở đường dẫn thỏa điều kiện là maybehere07/.file2

Password: DXjZPULLxYr17uwoI01bNLQbtFemEgo7

Level 7:

Tương tự level 6 mình dùng lệnh find và thêm các hint ở phần description, mình out ra cây thư mục với lệnh cd../../ sau đó kiếm file bằng lệnh find -size 33c -user bandit7 -group bandit6 , tuy nhiên thì lúc đầu mình bị stuck vì nhìn chỉ toàn thấy permision denied, chỉ khi làm lại một lần nữa và bình tĩnh hơn mình mới thấy file ./var/lib/dpkg/info/bandit7.password là không bị permision denied, cat file và lấy flag cho bài sau thôi.

Password: HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs

Level 8:

Ở phần description cho mình biết cần phải lấy mật khẩu ở bên cạnh từ millionth. Lúc đầu mình cũng không hiểu lắm nhưng thử dùng lệnh strings data.txt thì mình mới hiểu. File chia có 2 cột vì vậy mình chỉ cần kiếm được dòng có chứa từ millionth thì sẽ có được password cho level sau, sử dụng strings và grep strings data.txt | grep millionth mình có được password.

Password: cvX2JJa4CFALtqS87jk27qwqGhBM9plV



Level 9:

Nhiệm vụ của mình là tìm dòng không lặp lại, ban đầu thì mình dùng sort nhưng nếu chỉ dùng sort không thôi thì mình sẽ tốn thời gian làm thủ công, thử search trên google mình tìm được trang Wikipeida nói về lệnh uniq. Và thế là mình áp dụng strings data.txt | sort | uniq -u và lấy password

Password: UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR

Level 10:

Trong phần description cho mình biết password bắt đầu bằng dấu = nên mình tiếp tục dùng strings và grep strings data.txt | grep "="

Password: truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk

Level 11:

Strings data.txt mình thấy có một chuỗi base64,nên mình dùng lệnh base64 để decode. strings data.txt | base64 --decode

Password: IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR

Level 12:

Tương tự như level 11 tuy nhiên lần này trong linux không có lệnh decode mã ROT 13 nên mình dùng trang này

Password: 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu

Level 13:

Dùng lệnh strings mình thấy có một file hexdump, để dump một file sang hex thì mình dùng lệnh xxd còn để từ hexdump sang file thì mình dùng xxd -r. Tuy nhiên thì mình cần phải tạo một file trong thư mục tmp và copy file data.txt vào như trong description. Sau khi dùng xxd để reverse lại thì mình dùng lệnh file và biết đó là file gunzip. Đổi tên và giải nén mình lại có thêm một file nữa, lúc này mình cũng muốn follow theo hướng của đề bài nhưng là người làm forensics nên mình đã copy toàn bộ file hexdump về máy và tạo thành file nén dùng 7zip để mở, click chuột vài cái và có được password 😂😂

Password: 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

Level 14:

Bài này cần chúng ta connect ssh đến local dựa vào file private key đã cho sẵn rồi cat password theo đường dẫn đã cho trước. Đầu tiên mình connect ssh ssh bandit14@localhost -i sshkey.private  sau đó cat  /etc/bandit_pass/bandit14

Password: 4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

Level 15:

Trong bài này mình nc dến port 30000 của locahost và nhập vào password của level 14. nc 127.0.0.1 30000

Password: BfMYroe26WYalil77FoDi9qh59eK5xNr

Level 16:

Tương tự level 15, tuy nhiên nc lại không hỗ trợ ssl, nên thay vào đó mình sử dụng ncat của nmap để connect locahost ncat --ssl localhost 30001

Password: cluFn7wTiGryunymYOu4RcffSxQluehd

Level 17:

Theo như phần description, mình dùng nmap để scan các port để xem port nào đang mở nmap localhost -p 31000-32000 thì các 3, 5 port đang mở (trong lúc mình scan thì những lần đầu là 5 ports nhưng lúc mình scan lại thì chỉ có 3). Connect lần lượt tất cả các port mình biết được port 31790 là port chính xác vì nó trả về file private key và in chữ correct.

Password:

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----


Level 18:

Sử dụng file key lấy dược từ level 17 và connect tuy nhiên trước khi connect chúng ta cần thêm quyền excute cho file key bằng lệnh chmod 700 lv18.key.
Sau đó mình dùng lệnh diff để so sánh 2 file password.new và password.old diff password.new password.old kết quả trả về cho mình tận 2 password, nhưng trong phần description có nói rằng password của level tiếp theo nằm trong file new nên mình dùng string & grep để xem cái nào đúng.

Password: kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd

Level 19:

Sử dụng password có được ở level 18 mình không thể đăng nhập à không đúng hơn là đăng nhập được nhưng bị kick. Theo phần description thì password ở file read me và lệnh ssh cho phép chúng ta gửi kèm câu lệnh muốn sử dụng đầu tiên đến máy khách. Không biết mình nói đúng không nhưng có vài giải CTF mình bypass cũng bằng cách này và level này cũng tương tự. ssh bandit18@bandit.labs.overthewire.org -p 2220 cat readme

Password: IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x

Level 20:

Sau khi chạy thử file ./bandit20-do mình được gợi ý ./bandit20-do id lúc đầu mình bị lú tưởng là gõ id của người dùng nên khá là bí. Sau khi dùng đúng như theo ví dụ mình hiểu ra, binary này chạy command line dưới quyền của user bandit20. Sau khi vào thư mục password được cung cấp ở phần description ./bandit20-do ls /etc/bandit_pass mình thấy được password của user bandit sở hữu bởi user bandit 20. Ok cat password cho level tiếp thôi. ./bandit20-do cat /etc/bandit_pass/bandit20

Password: GbKksEFF4yrVs6il55v6gwY5aVje5f0j

Level 21:

Sau khi kết nối đến server và chạy thử file subconnect, chương trình cho mình biết được nó sẽ kết nối với port chỉ định sẵn với đối số chúng ta nhập vào. Vì vậy mình dùng netcat để listen trên port chỉ định là 50000 nc -lp 50000 với -l là dùng netcat ở chế độ listen còn -p là số port cần dùng (tạm gọi đây là terminal 1). Sau đó connect thêm 1 ssh client tới server và kết nối binary cho trước tới port 50000 (terminal 2) ./suconnect 50000. Chuyển về terminal 1 và nhập password của level 20, binary sẽ gửi lại cho chúng ta password của level này và ở terminal 2 chúng ta sẽ thấy dòng chữ Password matches, sending next password.

Password: gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr

Level 22:

Theo hint từ description mình thử file /etc/cron.d/ thì biết được nó là một folder, sau đó mình thử list ra xem có các thư mục con nào trong thư mục này thì biết được có ba file cronjob dành cho ba level 22, 23, 24 nhưng chúng ta đang ở level 22 nên mình sẽ xem nội dung file cronjob_bandit22. Nhìn vào nội dung mình biết được cứ mỗi phút hoặc mỗi lần restart thì server sẽ tự chạy một bash script ở đường dẫn /usr/bin/cronjob_bandit22.sh. OK vậy thử xem câu lệnh của file bash script đó là gì cat /usr/bin/cronjob_bandit22.sh, chỉ có 2 câu lệnh với câu lệnh thứ nhất là thêm quyền cho file /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv và câu lệnh thứ 2 là truyền password của bandit22 vào file ở dòng lệnh thứ nhất. Vậy mình chỉ cần đọc file đã chỉ sẵn là sẽ có được password cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv.

Password: Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI

Level 23:

Phần đầu tương tự như level 22 tuy nhiên có một điều khá stuck mình đó là đoạn bash script. Sau khi chạy hết các câu lệnh mình khá chắc là mình đã làm đúng nhưng thư mục trong /tmp lại rỗng. Mất một lúc mình mới nhận ra mình đang ở user bandit22. Còn file sẽ chạy ở user bandit23, /etc/bandit_pass/$myname, trong câu lệnh này biền $myname bắt buộc phải có giá trị bandit23 nếu không thì sẽ không có quyền read password để truyền vào file ở thư mục /tmp. OK vậy chỉ cần chạy câu lại câu lệnh và chỉnh sửa một chút mình sẽ có được thư mục lưu password ở tmp echo I am user bandit23 | md5sum | cut -d ' ' -f 1 chúng ta có tên file là 8ca319486bfbbc3663ea0fbe81326349. Read password và qua level kế tiếp nào.

Password: jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

Level 24:

Đọc source file bash script mình biết được, cứ mỗi một phút bash script sẽ chạy tất cả các script có trong thư mục /var/spool/bandit24, vậy nhiệm vụ của chúng ta là cần viết một bash shell sau đó copy nó vào thư mục /var/spool/bandit24. Việc đầu tiên là tạo 1 thư mục ở tmp, mkdir /tmp/binhhuynh2727 dùng vi để chứa bash script, thêm quyền cho thư mục vừa tạo chmod 777 /tmp/binhhuynh2727. Nếu các bạn lần đầu sử dụng vi thì sau khi vi binhh.sh các bạn nhấn phím i để ghi bash script sau khi viết bash script xong nhấn esc tiếp theo nhấn :wq để lưu và thoát.
Bash script của mình:


1
2
3
#!/bin/bash

cat /etc/bandit_pass/bandit24 > /tmp/binhhuynh2727/pass.txt

Sau đó thêm quyền chmod 777 binhh.sh và copy vào thư mục /var/spool/bandit24 cp /tmp/binhhuynh2727/binhh.sh /var/spool/bandit24 và chờ trong vòng 1 phút sau đó cat /tmp/binhhuynh2727/pass.txt 

Password: UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

Level 25:

Bài này chủ yếu là brute force sao cho đúng với mã pin của chương trình. Source code của mình:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
import itertools
r = remote("localhost", 30002)

password = "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ"
r.recvuntil("space.\n")
#for i in itertools.product("0123456789",repeat=4):
    #payload = password+" "+"".join(i)
    #print "".join(i)
for i in range(4828,10000):
    payload = password+" "+str(i)
    r.sendline(payload)
    print payload
    d = r.recv(1024)
    if "Wrong!" in d:
        #print "wrong "
        #print i
        continue
    else:
        #print i
        print d


Lúc đầu mình dùng itertools nhưng mà chạy đến 4828 thì bị server drop nên mình chạy lại vòng for và convert từ kiểu int sang str

Password: uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG

Level 26:

Connect tới server bandit 26 bằng file key có sẵn mình không nhận được gì ngoài chữ và chữ sau đó drop connect. Theo như description, level này không dùng bash shell nên mình thử nó dùng shell gì  cat /etc/passwd | grep bandit26  và mình thấy được /usr/bin/showtext thay vì /bin/bash. Thử read xem showtext có những function gì strings /usr/bin/showtext mình thu được


1
2
3
4
#!/bin/sh
export TERM=linux
more ~/text.txt
exit 0

Để bypass thì kết nối bằng putty sau đó kéo thanh cửa sổ theo chiều dọc sau đó kết nối ssh bằng file key có sẵn. Vì là lệnh more nên khi màn hình không thể in ra hết thì sẽ xuất hiện lệnh more và bấm mũi tên xuống cho đến hết, nên khi màn hình chưa in hết thì mình bấm "v" để vào vim. Để mở file và edit mình dùng :e /etc/bandit_pass/bandit26 để mở file password của level tiếp theo.

Password: 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z

Level 27:

Tương tự như level trước, mình phải minimize cửa sổ ssh của putty để có thể dùng vim. Nhưng mình không thể làm tương tự như level trước và trong phần description, mình cần phải truy cập được shell và lệnh ls có thể giúp mình. Ok vậy trước hết cần phải gán bash shell, :set shell=/bin/bash enter sau đó :shell và mình đã có thể sử dụng bash như bình thường. Thử ls như trong hint của description mình có được 2 file. Thử chạy file binary với argument id mình thấy nó có euid là user bandit27, vậy thì mình có thể cat được password của user 27.

Password: 3ba3118a22e93127a4ed485be72ef5ea

Level 28:

Git file repo về git clone ssh://bandit27-git@localhost/home/bandit27-git/repo mình có được một file README. Read file và mình có được password.

Password: 0ef186ac70e04ea33b4c1853d2526fa2

Level 29:

Tương tự như level 28 tuy nhiên khi mình đọc file README.md thì password đã bị che mất. Thử dùng lệnh ls -lia thì mình thấy có folder .git và folder này có chứa folder log. Dùng lệnh git log để xem thử lịch sử của repo, mình thấy có 3 lần thay đổi. Dùng lệnh git show <commit's number> mình có được password đã bị che đi. git show 186a1038cc54d1358d42d468cdc8e3cc28a93fcb

Password: bbc96594b4e001778eee9975372716b2

Level 30: 

Giống hệt level 29 nhưng lần này mình không thể thấy được password đã bị che bởi git log. Sau khi google và tìm thêm câu lệnh của git. Mình dùng git branch -a để xem các nhánh của thư mục git. Và mình thấy có 4 remote branch, cái đầu tiên là thư mục git chúng ta đã clone về, nên mình bắt đầu từ cái thứ hai. git checkout remotes/origin/dev sau đó mình dùng git log để xem sự thay đổi, và đúng là có thay đổi thật. git show 33ce2e95d9c5d6fb0a40e5ee9a2926903646b4e3

Password: 5b90576bedb2cc04c86a9e924ce42faf

Level 31:

Sau khi thử các kiểu của 2 level trước mình không thể làm được gì, thử google và xem tất cả các lệnh của git bằng git help -a, sau một lúc test thì mình dùng git tag và mình có tag: secret. Thử git show secret mình có được password.

Password: 47e603bb428404d265f59c42920d81e5

Level 32:

Nội dung file README.md yêu cầu chúng ta phải push một file key.txt có nội dung: "May I come in?". Trước khi push mình cần phải tạo file key.txt, vi key.txt và nhập nội dung ở trên. Sau đó thêm file vừa tạo vào git, git add key.txt -f. Lưu lại bằng git commit -m "123", và cuối cùng là git push và lấy password.

Password: 56a9bf19c63d650ce78e6ec0354ee45e

Lelvel 33:

Sau khi connect vào server thì mình không thể sử dụng những lệnh bình thường được, để ý thấy nếu chúng ta nhập sai, server luôn trả về sh:...: not found. Nhìn quen quá, bình thường dùng bash shell hay zsh shell sẽ trả về bash(zsh): command not found. Thử google thì mình biết được đó là bourne shell. Và để sử dụng bourne shell giống bash shell, mình cần gõ $0 sau đó thì lấy password thôi.

Password: c9c3199ddf4121b10cf581a98d51caee

0 comments:

Post a Comment