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:
- owned by user bandit7
- owned by group bandit6
- 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
就能找到需要的檔案。試了下,還真是如此。再問那些東西做什麼的,回答:
-c '[:alnum:]'
抓到所有不是文數(alphanumeric)的文字:[:alnum:]
是文數;而-c
是 complement,也就是互補、對立。'[\n*]'
換行。還記得\n
就是換行嗎?| sort
會把前面的tr -c '[:alnum:]' '[\n*]' < data.txt
指令保留下來,然後用sort
指令排列起來。| 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 的都是麻煩。
總之步驟如下:
- 把 Hex dump 檔案變成被無限壓縮的二進制程式。
- 用 file 查看檔案是什麼。
- 按照 file 的顯示結果,處理對應的壓縮程序。注意 gzip 檔案需要把檔名改為
.gz
。 - 只要 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
然後開始無盡的解壓縮之旅。
直到變成老頭為止。
Level 13 → Level 14
很簡單,在使用 shh 登入時,把檔案中的 sshkey.private 放進去:ssh -i sshkey.private bandit14@localhost -p 2220
。
題外話,據說编程随想用做了幾個 KeyFiles 檔案,然後瞞過了中國監控好幾年。真的厲害。參見扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品以獲取詳細資訊。
結語
好的,暫時先說到這邊。看起來有33關耶,那就下次見吧。
附檔
參考資料
- Bandit Level 4 → Level 5
- Bandit Level 5 → Level 6
- Bandit Level 6 → Level 7
- Bandit Level 7 → Level 8
- Bandit Level 8 → Level 9
- Bandit Level 11 → Level 12
- Bandit Level 12 → Level 13
- Bandit Level 13 → Level 14