Open16

OverTheWire: Bandit をCTF入門としてやってみた

ピン留めされたアイテム
rayfiyorayfiyo

find

ファイル探す

  • -size 引数 : ファイルサイズ{一致/より大きい/より小さい}を指定できる
  • -executable: 実行可能形式だと指定できる
  • -user 引数: 所有者を指定できる
  • -group 引数: 所有グループを指定できる
  • -name 引数: ファイル名を指定できる

xargs

標準入力の文字列を,空白や改行区切りでリストにし パイプする

sort

引数に指定されたものを行単位区切りで並び替える

  • - r: 逆順に並び替える
  • -u: 重複は1度のみ表示

uniq

並び替え済みの文字列に対して重複を削除し1度のみ表示する

  • -c: 行頭に出現回数も表示
  • -u: 重複していない行だけ出力

base64

base64のエンコード・デコードを行う

  • -d: デコード

tr

文字の置換、文字列、削除

  • 大文字小文字を逆転
tr A-Za-z a-zA-Z
  • 1文字手前のシーザー暗号
tr B-Za-zA A-Za-z

xxd

16進数2進数でダンプ、16進数ダンプを復元

  • -g バイト数: 何バイト区切りにするか(デフォルト 2)
  • -u: 16進数を大文字で表記
  • -s 開始位置: 表示を開始する位置を指定(標準入力を使った場合は「+」「-」を使った指定も可能)
  • -r: 16進ダンプをバイナリに変換
  • -seek 開始位置: -rの後に使用、16進ダンプを出力するファイルの位置(オフセット)を指定

圧縮系

  • gzip ファイル名: gzip圧縮(.gz作成)
  • gunzip ファ名.gz: gzip解凍
  • bzip2 ファ名: bzip圧縮(.bz2作成)
  • bunzip2 ファ名.bz2: bzip解凍
  • tar -cvf ファ名.tar directory: tar圧縮(.tar作成)
  • tar -xvf ファ名.tar: tar解凍
rayfiyorayfiyo

前提

私はある程度Linuxのコマンドを使うことができるが,学んだわけではなく必要に応じて調べては忘れてを繰り返すうちに覚えた程度である.
CTFは1度挑戦してみたことがある.

環境

WSL2 + fish sehll で行う.(ホストOSはWindows11)

このスクラップでの解法の体裁

適当.正攻法ではない(と明らかに思われる)解法もある.
より具体的な助けになる情報が欲しいならば,先行Writeup を参照すると幸せになれる.

URL

OverTheWire: Bandit:
https://overthewire.org/wargames/bandit/
先行Writeup:
https://www.bioerrorlog.work/entry/ctf-beginner-overthewire-bandit

rayfiyorayfiyo

Bandit Level 0

解法

問題を読むと以下の情報が得られる

ホスト名: bandit.labs.overthewire.org
ポート番号: 2220
ユーザー: bandit0
パスワード: bandit0

そこで,

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

とした.
また,中断すると忘れてしまうので,banditでこのコマンドを標準出力するエイリアスも作った

alias bandit "echo 'ssh -p 2220 bandit0@bandit.labs.overthewire.org'"
rayfiyorayfiyo

Bandit Level 1 → Level 2

問題より - というファイル名であるという情報が与えられているので,

cat ./-
rayfiyorayfiyo

Bandit Level 2 → Level 3

lsすると空白を持つファイル名が出るので,

cat spaces\ in\ this\ filename

のように,空白をエスケープする.
Tabキーで補完が聞くので押すだけでもあり.

rayfiyorayfiyo

Bandit Level 3 → Level 4

Tabで補完するだけ(おい

cat inhere/.hidden

題意としては隠しファイルがあるのでls -aで見つけよう というものだと思われ.

rayfiyorayfiyo

Bandit Level 4 → Level 5

ls inhereでファイルがいっぱいあることがわかるので,

cd inhere
cat ./*

色々でるが,最後の方に回答っぽい文字列が見られるので,後ろから総当り

cat ./-file09
cat ./-file08
cat ./-file07

みごと07でみつかる.

正攻法

file コマンドで,そのファイルが data や ASCII text などであるかの情報を得られる.

file ./*

07だけが ASCII text なので,これだけcatすればよいと気づく.

rayfiyorayfiyo

Bandit Level 5 → Level 6

findコマンドには,

human-readable
1033 bytes in size
not executable
のうち,1033 bytes in size と not executable を絞れるオプションが存在するので,それを使う.

find -size 1033c ! -executable

これにヒットしたものに,一つ前の問題と同じようにfileコマンドを用いればよい.

rayfiyorayfiyo

Bandit Level 6 → Level 7

オプションで条件を指定して,2>/dev/nullでマッチしないものを標準出力から捨てる

find / -user bandit7 -group bandit6 -size 33c  2>/dev/null
rayfiyorayfiyo

Bandit Level 7 → Level 8

予想

find / -name data.txt | xargs grep millionth

解法

grep millionth ./data.txt
rayfiyorayfiyo

Bandit Level 8 → Level 9

予想

sort ./data.txt | uniq -u

解法

予想どおりだった.

rayfiyorayfiyo

Bandit Level 9 → Level 10

予想

strings ./data.txt | grep =

解法

予想どおりだった.もっとスマートな解法もありそう.

rayfiyorayfiyo

Bandit Level 10 → Level 11

予想

base64 -d ./data.txt

解法

予想通りだった.

rayfiyorayfiyo

Bandit Level 11 → Level 12

13ズレのシーザー暗号だと思われる

予想

cat ./data.txt | tr N-Za-zA-M A-Za-z

解答

cat ./data.txt | tr A-Za-z N-ZA-Mn-za-m

大文字と小文字に対応する箇所をそれぞれずらす!

rayfiyorayfiyo

Bandit Level 12 → Level 13

予想

xxd -r ./data.txt

解答

1

mkdir /tmp/wdir
xxd -r ~/data.txt > /tmp/wdir/hoge
file -i /tmp/wdir/hoge

すると、ダンプファイルの元が gzip だと分かる。

2

mv /tmp/wdir/hoge /tmp/wdir/hoge.gz
gunzip /tmp/wdir/hoge.gz
file -i /tmp/wdir/hoge

すると、gzipの元が bzip2 だと分かる。

3

mv /tmp/wdir/hoge /tmp/wdir/hoge.bz2
bunzip2 /tmp/wdir/hoge.bz2
file -i /tmp/wdir/hoge

すると、bzip2 の元が gzip だと分かる。

4

mv /tmp/wdir/hoge /tmp/wdir/hoge.gz
gunzip /tmp/wdir/hoge.gz
file -i /tmp/wdir/hoge

すると、gzipの元が tar だと分かる。

5

mv /tmp/wdir/hoge /tmp/wdir/hoge.tar
tar -xvf /tmp/wdir/hoge.tar
file -i /tmp/wdir/data5.bin

すると、tarの元が data5.bin という tar だと分かる。

6

mv /tmp/wdir/data5.bin /tmp/wdir/data5.bin.tar
tar -xvf /tmp/wdir/data5.bin.tar
file -i /tmp/wdir/data6.bin

すると、data5.bin の元が data6.bin という bzip2 だと分かる。

7

mv /tmp/wdir/data6.bin /tmp/wdir/data6.bin.bz2
bunzip2 /tmp/wdir/data6.bin.bz2
file -i /tmp/wdir/data6.bin

すると、data5.bin の元が 同じ名前のという tar だと分かる。

8

mv /tmp/wdir/data6.bin /tmp/wdir/data6.bin.tar
tar -xvf /tmp/wdir/data6.bin.tar
file -i /tmp/wdir/data8.bin

すると、data5.bin の元が data8.bin のという gzip だと分かる。

9

mv /tmp/wdir/data8.bin  /tmp/wdir/data8.bin.gz
gunzip /tmp/wdir/data8.bin.gz
file -i /tmp/wdir/data8.bin

すると、data8.bin の元が プレーンテキスト(us-ascii) だと分かり、漸くおしまい。

10

cat /tmp/wdir/data8.bin

まとめると、
16進数ダンプ→gzip→bzip2→gzip→tar→tar→bzip2→tar→gzip
と解凍していく。
一度tarが出た後は、tar.bzip2→tar.gzipでやると2手間くらい減る。