到處施工

攻城獅正在偷懶!

Wargame 其實是駭客競賽的一種遊戲,勝利方式有闖關累積積分或者取得主機最高權限等等,而要達到這些目標必須善用各種駭客技巧。

這些駭客技巧通常是在終端機環境下運作,所以我們可以透過簡單的 Wargame 來練習 Linux 指令的操作。

Bandit是給完完全全的初學者玩的一種 Wargame,遊戲進行方式很簡單:

  1. 取得密碼
  2. 進入下一關
  3. 不斷重複

密碼通常會藏在遠端主機的某個地方,所以要透過各種 Linux 指令把它找出來,當然也會給一些提示協助通關。

如果真的卡關了,或者遇到不了解的指令,可以使用以下方法:

  • man <command>
    查看已知指令的手冊,裡面會說明指令並介紹用法

  • help <X>
    如果沒有手冊頁面,試試看這個指令

  • 搜尋引擎
    Google 不用多介紹了吧XD


Level 0

因為遊戲進行方式需要到遠端主機找密碼,所以要先學會遠端連線的方式。

遠端連線可以使用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可以關閉目前執行的命令,所以不知道怎麼辦、想回到最初的命令列就一直按它吧!


Level 0 - Level 1

根據說明,密碼藏在readme檔案中,因此我們要先找到檔案位置,再把它輸出到螢幕上。

ls可以看到當前目錄中的所有檔案

$ ls

cat標準輸出檔案到螢幕上

$ cat readme
補充

指令可以透過Tab將剩餘的指令自動補齊,像是檔名太長可以只打前面幾個字母然後按下 Tab 就會自動補齊。

進入下一關之前先用$ exit離開目前連線的主機。


Level 1 - Level 2

$ ssh bandit1@bandit.labs.overthewire.org

密碼在檔名叫做-的檔案中。

我們沒辦法跟 Level 0 一樣直接使用$ cat [FILE],因為-符號在 cat 中代表標準輸入。

我們必須加上路徑,讓電腦知道這是個檔案名稱,因此指令要改成:

$ cat ./-
補充

./代表當前目錄
../代表前一個目錄


Level 2 - Level 3

$ ssh bandit2@bandit.labs.overthewire.org

密碼在spaces in this filename檔案中。

這關的關鍵在於空格在一般情況下是有特殊意義的,但是我們只想讓它成為檔名的一部份,因此需要使用跳脫字元\來除去空格的特殊意義。

$ cat spaces\ in\ this\ filename

Level 3 - Level 4

$ ssh bandit3@bandit.labs.overthewire.org

密碼藏在inhere目錄中,但是是隱藏的

透過-a參數,將所有檔案都顯示。

$ cd inhere
$ ls -a
$ cat .hidden

Level 4 - Level 5

$ 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

Level 5 - Level 6

$ ssh bandit5@bandit.labs.overthewire.org

密碼在inhere目錄中,檔案是人類看得懂且大小為1033 bytes

利用find指令的參數來過濾條件。

$ cd inhere
$ find -type f -size 1033c
$ cat ./maybehere07/.file2

Level 6 - Level 7

$ 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)重新定向後過濾掉


Level 7 - Level 8

$ ssh bandit7@bandit.labs.overthewire.org

密碼在data.txt中,而且是在millionth單字的後面。

透過grep搜尋文本,參數-e找出符合字串的部分

$ grep -e millionth data.txt

Level 8 - Level 9

$ ssh bandit8@bandit.labs.overthewire.org

密碼在data.txt中,而且是只出現一次

先利用sort將資料排序,再透過uniq過濾掉重複的,-u表示只印出唯一的那行。

|符號是指將一個命令的輸出傳給另一個命令執行。

$ sort data.txt | uniq -u

Level 9 - Level 10

$ ssh bandit9@bandit.labs.overthewire.org

密碼在data.txt中,在一段human-readable字串中,開頭有數個=

strings可以在二進位文件中印出字符串(也就是 human-readable 的文字符號)。

$ strings data.txt | grep =

Level 10 - Level 11

$ ssh bandit10@bandit.labs.overthewire.org

密碼在data.txt中,而且內容是透過base64編碼。

因此我們必須解碼才看得出的內容是什麼。

$ base64 -d data.txt

Level 11 - Level 12

$ 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]'

Level 12 - Level 13

$ 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

Level 13 - Level 14

$ ssh bandit13@bandit.labs.overthewire.org

密碼存在/etc/bandit_pass/bandit14,而且只有bandit14使用者有權限讀取,但是這次我們不是透過輸入密碼進入下一關,而是利用私鑰進行遠端連線。

$ ssh -i sshkey.private bandit14@localhost
...
...(yes/no) yes

Level 14 - Level 15

這關的密碼需要透過提交 /etc/bandit_pass/bandit14 內的密碼到本機port 30000才會回傳給我們

$ cat /etc/bandit_pass/bandit14 | nc localhost 30000

Level 15 - Level 16

$ ssh bandit15@bandit.labs.overthewire.org

跟上一關一樣,但是這次要透過SSL加密的方式傳送

cat /etc/bandit_pass/bandit15 | openssl s_client -connect localhost:30001 -ign_eof

Level 16 - Level 17

$ 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

Level 17 - Level 18

有兩個檔案分別為passwords.oldpasswords.new,這兩個檔案中只有一行不一樣,不一樣的那一行且在passwords.new中就是密碼。

$ diff passwords.new passwords.old

Level 18 - Level 19

$ ssh bandit18@bandit.labs.overthewire.org

密碼在readme中,但是一連線就會看到訊息Byebye !,因為有人修改了.bashrc,使得我們一使用遠端連線就讓我們登出。

我們可以在ssh後加上附加指令cat readme

$ ssh bandit18@bandit.labs.overthewire.org cat readme

--

Level 19 - Level 20

$ ssh bandit19@bandit.labs.overthewire.org

未完待續 >>