攻城獅正在偷懶!
Wargame 其實是駭客競賽的一種遊戲,勝利方式有闖關累積積分或者取得主機最高權限等等,而要達到這些目標必須善用各種駭客技巧。
這些駭客技巧通常是在終端機環境下運作,所以我們可以透過簡單的 Wargame 來練習 Linux 指令的操作。
Bandit是給完完全全的初學者玩的一種 Wargame,遊戲進行方式很簡單:
密碼通常會藏在遠端主機的某個地方,所以要透過各種 Linux 指令把它找出來,當然也會給一些提示協助通關。
如果真的卡關了,或者遇到不了解的指令,可以使用以下方法:
man <command>
查看已知指令的手冊,裡面會說明指令並介紹用法
help <X>
如果沒有手冊頁面,試試看這個指令
搜尋引擎
Google 不用多介紹了吧XD
因為遊戲進行方式需要到遠端主機找密碼,所以要先學會遠端連線的方式。
遠端連線可以使用SSH
,在 Linux 和 Mac 環境中都有內建,可以直接在終端環境下達指令。
Windows 雖然沒有內建 SSH,但是 Win 10 有內建 Linux 子系統,所以可以間接的使用 SSH。
$ ssh bandit0@bandit.labs.overthewire.org
bandit0
代表使用者,要進入每個關卡就必須切換相對應的使用者。
bandit.labs.overthewire.org
代表要連線的遠端主機位置。
這時候會要我們輸入密碼,這個密碼就是我們之後會一直尋找的目標。
由於是 Level 0 ,所以直接給提供密碼bandit0
讓我們進入尋找下一關的密碼。
Ctrl + c
可以關閉目前執行的命令,所以不知道怎麼辦、想回到最初的命令列就一直按它吧!
根據說明,密碼藏在readme
檔案中,因此我們要先找到檔案位置,再把它輸出到螢幕上。
ls
可以看到當前目錄中的所有檔案
$ ls
cat
標準輸出檔案到螢幕上
$ cat readme
指令可以透過Tab
將剩餘的指令自動補齊,像是檔名太長可以只打前面幾個字母然後按下 Tab 就會自動補齊。
進入下一關之前先用$ exit
離開目前連線的主機。
$ ssh bandit1@bandit.labs.overthewire.org
密碼在檔名叫做-
的檔案中。
我們沒辦法跟 Level 0 一樣直接使用$ cat [FILE]
,因為-
符號在 cat 中代表標準輸入。
我們必須加上路徑,讓電腦知道這是個檔案名稱,因此指令要改成:
$ cat ./-
./
代表當前目錄
../
代表前一個目錄
$ ssh bandit2@bandit.labs.overthewire.org
密碼在spaces in this filename
檔案中。
這關的關鍵在於空格
在一般情況下是有特殊意義的,但是我們只想讓它成為檔名的一部份,因此需要使用跳脫字元\
來除去空格的特殊意義。
$ cat spaces\ in\ this\ filename
$ ssh bandit3@bandit.labs.overthewire.org
密碼藏在inhere
目錄中,但是是隱藏的
。
透過-a
參數,將所有檔案都顯示。
$ cd inhere
$ ls -a
$ cat .hidden
$ ssh bandit4@bandit.labs.overthewire.org
密碼在inhere
目錄中,目錄中只有一個檔案是人類看得懂
的,密碼就在這。
關鍵是編碼
,人類看得懂的就是 abc ... 123 ... 這些字母、數字,而字母數字要透過一定的編碼方式才能呈現出來,因此透過file
來檢查每個檔案的類型。
不要忘記-
符號在檔名的時候要怎麼處理 :))
$ cd inhere
$ file ./-file00 ./-file01 ./-file02 ./-file03 ./-file04 ./-file05 ./-file06 ./-file07 ./-file08 ./-file09
$ cat ./-file07
$ ssh bandit5@bandit.labs.overthewire.org
密碼在inhere
目錄中,檔案是人類看得懂
且大小為1033 bytes
。
利用find
指令的參數來過濾條件。
$ cd inhere
$ find -type f -size 1033c
$ cat ./maybehere07/.file2
$ ssh bandit6@bandit.labs.overthewire.org
密碼在某個地方
,它的 user 是bandit7
、group 是 bandit6
、size是33 bytes
。
一樣利用find
的參數來過濾。
$ find -user bandit7 -group bandit6 -size 33c
$ cat /var/lib/dpkg/info/bandit7.password
find指令中可以加上2>/dev/null
將錯誤訊息(Permission denied)重新定向後過濾掉
$ ssh bandit7@bandit.labs.overthewire.org
密碼在data.txt
中,而且是在millionth
單字的後面。
透過grep
搜尋文本,參數-e
找出符合字串的部分
$ grep -e millionth data.txt
$ ssh bandit8@bandit.labs.overthewire.org
密碼在data.txt
中,而且是只出現一次
。
先利用sort
將資料排序,再透過uniq
過濾掉重複的,-u
表示只印出唯一的那行。
|
符號是指將一個命令的輸出傳給另一個命令執行。
$ sort data.txt | uniq -u
$ ssh bandit9@bandit.labs.overthewire.org
密碼在data.txt
中,在一段human-readable
字串中,開頭有數個=
strings
可以在二進位文件中印出字符串(也就是 human-readable 的文字符號)。
$ strings data.txt | grep =
$ ssh bandit10@bandit.labs.overthewire.org
密碼在data.txt
中,而且內容是透過base64
編碼。
因此我們必須解碼
才看得出的內容是什麼。
$ base64 -d data.txt
$ ssh bandit11@bandit.labs.overthewire.org
密碼在data.txt
中,但是所有的大小寫字母都經過ROT13
轉換。
ROT13 就是將字母位移 13 位交換,例如:第 1 個字母與第 14 個字母交換,以此類推。
我們可以透過tr
將字母替換回來達到解碼的效果。
$ cat data.txt | tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
$ ssh bandit12@bandit.labs.overthewire.org
密碼在data.txt
中,內容被重複壓縮過並以十六進位形式顯示。
首先要把檔案轉回原本的二進位檔,但是為了避免玩家弄壞data.txt
,所以我們沒有權限直接轉換檔案,需要先複製一份到暫存區再進行其他的操作。
$ mkdir /tmp/mylevel12
$ cp data.txt /tmp/mylevel12
$ cd /tmp/mylevel12
轉換回二進位檔
$ xxd -r data.txt data.bin
透過file
查看檔案是用什麼方式壓縮,我們就依照對應的方式進行解壓縮
$ file data.bin
data.bin: gzip compressed data, was "data2.bin", from Unix, last modified: Fri Nov 14 10:32:20 2014, max compression
得知是用gzip
,接下來利用zcat
解壓縮
$ zcat data.bin | file -
/dev/stdin: bzip2 compressed data, block size = 900k
bzip2
,用bzcat
解壓縮
$ zcat data.bin | bzcat | file -
以此類推。
如果遇到/dev/stdin: POSIX tar archive (GNU)
表示檔案還有用tar
打包,使用tar -xO
解開並繼續輸出
$ zcat data.bin | bzcat | zcat | tar -xO | file -
最後
$ zcat data.bin | bzcat | zcat | tar -xO | tar -xO | bzcat | tar -xO | zcat | file -
/dev/stdin: ASCII text
$ zcat data.bin | bzcat | zcat | tar -xO | tar -xO | bzcat | tar -xO | zcat
$ ssh bandit13@bandit.labs.overthewire.org
密碼存在/etc/bandit_pass/bandit14
,而且只有bandit14
使用者有權限讀取,但是這次我們不是透過輸入密碼進入下一關,而是利用私鑰
進行遠端連線。
$ ssh -i sshkey.private bandit14@localhost
...
...(yes/no) yes
這關的密碼需要透過提交 /etc/bandit_pass/bandit14 內的密碼
到本機port 30000
才會回傳給我們
$ cat /etc/bandit_pass/bandit14 | nc localhost 30000
$ ssh bandit15@bandit.labs.overthewire.org
跟上一關一樣,但是這次要透過SSL
加密的方式傳送
cat /etc/bandit_pass/bandit15 | openssl s_client -connect localhost:30001 -ign_eof
$ ssh bandit16@bandit.labs.overthewire.org
與上一關相同,但是 port 的範圍是31000 to 32000
,首先要先確認哪些 port 有在 listen
,這些 port 我們才能連線過去,然後再找要用SSL
的 port。只有一個 port 符合以上條件。
$ nmap -p 31000-32000 localhost -sV
$ cat /etc/bandit_pass/bandit16 | openssl s_client -connect localhost:31790 -ign_eof
# 將 key 儲存成 sshkey.private
$ ssh -i sshkey.private bandit17@localhost
有兩個檔案分別為passwords.old
和passwords.new
,這兩個檔案中只有一行不一樣,不一樣的那一行且在passwords.new
中就是密碼。
$ diff passwords.new passwords.old
$ ssh bandit18@bandit.labs.overthewire.org
密碼在readme
中,但是一連線就會看到訊息Byebye !
,因為有人修改了.bashrc
,使得我們一使用遠端連線就讓我們登出。
我們可以在ssh
後加上附加指令cat readme
$ ssh bandit18@bandit.labs.overthewire.org cat readme
--
$ ssh bandit19@bandit.labs.overthewire.org
未完待續 >>