OverTheWire: Bandit 筆記 Part 1

我在 freeCodeCamp 部落格文章 How to Improve Your Hacking Skills by Playing OverTheWire Wargames 發現 OverTheWire 網站會教你如何藉由動手做,來理解駭客做的事情。我不禁好奇起來、然後陷進去了。

我這邊 Bandit 作到 "Bandit Level 14 → Level 15" 這邊。就講講目前為止的一些東西吧。

Bandit 簡介

Bandit 是個教你如何以 Linux 完成各種操作的遊戲。

Level 0

很簡單,用 bandit0 的身份、加上 bandit0 這密碼,連上 bandit.labs.overthewire.org 網站,並以 2220 port 登入。預設 port 是 22,需要改為 2220

$ ssh bandit0@bandit.labs.overthewire.org -p 2220

Level 0 → Level 1

這裡要會用 cat 看文字檔,然後用裡面提供的密碼登入。

$ cat readme
Congratulations on your first steps into the bandit game!!
(省略)
The password you are looking for is: <PASSWORD>

$ exit
$ ssh bandit1@bandit.labs.overthewire.org -p 2220

Level 1 → Level 2

要查 - 這檔案的話不能直接用 cat - 這指令,Bash 會誤會。請使用 cat ./-

有點出乎意料了吧。

Level 2 → Level 3

要處理並閱覽有空白的檔案有點棘手。我以前第一次用 Linux 時也採過坑。

不過答案很簡單:只要在輸入 "spaces" 後按 Tab 鍵,程式就能自己補全合適的 "spaces\ in\ this\ filename" 啦。

Level 3 → Level 4

cd inhere 後下 ls -a 會發現一個以 . 為開頭的檔案。在 Linux 中 . 是隱藏檔案。

Level 4 → Level 5

這裡要學會 file 指令怎麼用。

bandit4@bandit:~/inhere$ file ./-file06 ./-file06: data bandit4@bandit:~/inhere$ file ./-file07 ./-file07: ASCII text bandit4@bandit:~/inhere$ cat ./-file07

$ file ./-fileXX
./-fileXX: data
$ file ./-fileXY
./-fileXY: ASCII text

不要懷疑。被標為 ASCII text 的 -fileXY 就是我們要的文字檔。

Level 5 → Level 6

本來想說要用 du 的……不過試了好久,最後用 find . -size -1033c 把所有 1033 bytes 的檔案都列出來,然後看看哪些合我要的。

-size n

True if the file's size, rounded up, in 512-byte blocks is n. If n is followed by a c, then the primary is true if the file's size is n bytes (characters).

Level 6 → Level 7

The password for the next level is stored somewhere on the server and has all of the following properties:

  1. owned by user bandit7
  2. owned by group bandit6
  3. 33 bytes in size

這很簡單。首先用 find / -user bandit7 -group bandit6 -exec ls -lsad {} \; 列出所有符合 1 與 2 的檔案後,再從裡面找到 33 就成。

Level 7 → Level 8

這裡使用 vim 完成工作。使用 vim data.txt 進去裡面後,打 / 會進入延伸指令列命令模式的搜尋功能,再把 millionth 貼進搜尋功能後即成。

Level 8 → Level 9

向 ChatGPT 求助,回說用 tr -c '[:alnum:]' '[\n*]' < data.txt | sort | uniq -u 就能找到需要的檔案。試了下,還真是如此。再問那些東西做什麼的,回答:

  1. -c '[:alnum:]' 抓到所有不是文數(alphanumeric)的文字:[:alnum:] 是文數;而 -ccomplement,也就是互補、對立。
  2. '[\n*]' 換行。還記得 \n 就是換行嗎?
  3. | sort 會把前面的 tr -c '[:alnum:]' '[\n*]' < data.txt 指令保留下來,然後用 sort 指令排列起來。
  4. | uniq -u 同樣地會把前面的 tr -c '[:alnum:]' '[\n*]' < data.txt | sort 指令保留下來,然後 uniq -u 指令會移掉所有重複的單字。

Level 9 → Level 10

同 "Level 7 → Level 8" 章節,打 / 進入搜尋功能,再把 === 貼進搜尋功能後找一下。

Level 10 → Level 11

base64 -d data.txt 把檔案內的 base64 文字解碼,答案就出現了。

Level 11 → Level 12

這是我第一次感覺很困難的 Level。

首先,我發現 data.txt 隱約有某種規律,用 xxd data.txt 發現第一行是這樣:

00000000: 4775 7220 636e 6666 6a62 6571 2076 6620  Gur cnffjbeq vf

與 cnffjbeq 對應的 hexdump 是 636e 6666 6a62 6571 這串數字。查了下 ASCII 資料後,發現 ASCII Hex 值會按照順序排列英文字母。看來能從修改 Hex 值下手。

題目有說單字移動了 13 個單位。13 對應 HEX 就是 D。那試試看如何用 HEX 運算操縱 63 , 66, 6e 這三個數字,看看 63 6e 66 66 會有什麼結果吧。

運算結果 運算結果對應字母
63 + D = 70 p
63 - D = 56 V
6e + D = 7B {
6e - D = 61 a
66 + D = 73 s
66 - D = 59 Y

p, V, {, a, s, y 這六個單字解 cnff 這文字,最後發現是 pass 這單字。


可是問題來了──到底題目所言「移動了 13 個單位」是怎麼移動的?為什麼 63 會是 D 對應 70 而不是 D 對應 56 呢?我不明白這個規律。

經過痛苦的程式撰寫後,問題還是沒有進展。沒辦法,詢問 ChatGPT 後,發現原來我要找的「規律」是 ROT13,而且可以用程式完成。藉著 ChatGPT 的程式,總算完成了。

Level 12 → Level 13

另一個麻煩。似乎扯到 HEX 的都是麻煩。

總之步驟如下:

  1. 把 Hex dump 檔案變成被無限壓縮的二進制程式。
  2. 用 file 查看檔案是什麼。
  3. 按照 file 的顯示結果,處理對應的壓縮程序。注意 gzip 檔案需要把檔名改為 .gz
  4. 只要 file 程式最後顯示 ASCII text,那就是密碼了。

裡面可能用 gzip, tar, 或其他壓縮演算法。反正 file 說是什麼,上網搜搜怎麼給那個檔案解壓縮就好。

最困難的問題,大概是如何了把 Hex dump 變成二進制程式吧。我把檔案前幾行餵給 ChatGPT 吃:

00000000: 1f8b 0808 dfcd eb66 0203 6461 7461 322e  .......f..data2.
00000010: 6269 6e00 013e 02c1 fd42 5a68 3931 4159  bin..>...BZh91AY

然後 ChatGPT 回答說這是個 gzip 檔案,因為最前面兩個數字 1f8b 是 gzip 的魔術數字。接著建議我用 xxd 把檔案弄出來:xxd -r -p data.txt output.gz

可是我用了很久,發現 xxd 弄出來的檔案有問題。無奈,只好直接輸入 HEX 值:

$ xxd -r -p <<"EOF" > myfile.gz
> 1f8b 0800 3416 1259 0003 edcf 310e...
> EOF
$ file myfile.gz
myfile.gz: gzip compressed data

然後開始無盡的解壓縮之旅。

《全面啟動》中,因為困在被無限壓縮的夢中時光,而垂垂老矣的齋藤。 Warner Bros. Pictures. All rights reserved.

直到變成老頭為止。

Level 13 → Level 14

很簡單,在使用 shh 登入時,把檔案中的 sshkey.private 放進去:ssh -i sshkey.private bandit14@localhost -p 2220

題外話,據說编程随想用做了幾個 KeyFiles 檔案,然後瞞過了中國監控好幾年。真的厲害。參見扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品以獲取詳細資訊。

結語

好的,暫時先說到這邊。看起來有33關耶,那就下次見吧。

附檔

參考資料