OverTheWire: Bandit をCTF入門としてやってみた
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解凍
前提
私はある程度Linuxのコマンドを使うことができるが,学んだわけではなく必要に応じて調べては忘れてを繰り返すうちに覚えた程度である.
CTFは1度挑戦してみたことがある.
環境
WSL2 + fish sehll で行う.(ホストOSはWindows11)
このスクラップでの解法の体裁
適当.正攻法ではない(と明らかに思われる)解法もある.
より具体的な助けになる情報が欲しいならば,先行Writeup を参照すると幸せになれる.
URL
OverTheWire: Bandit:
先行Writeup: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'"
Bandit Level 0 → Level 1
ls
で readme
が見つかるので cat readme
で標準出力
Bandit Level 1 → Level 2
問題より - というファイル名であるという情報が与えられているので,
cat ./-
Bandit Level 2 → Level 3
ls
すると空白を持つファイル名が出るので,
cat spaces\ in\ this\ filename
のように,空白をエスケープする.
Tabキーで補完が聞くので押すだけでもあり.
Bandit Level 3 → Level 4
Tabで補完するだけ(おい
cat inhere/.hidden
題意としては隠しファイルがあるのでls -a
で見つけよう というものだと思われ.
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
すればよいと気づく.
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
コマンドを用いればよい.
Bandit Level 6 → Level 7
オプションで条件を指定して,2>/dev/null
でマッチしないものを標準出力から捨てる
find / -user bandit7 -group bandit6 -size 33c 2>/dev/null
Bandit Level 7 → Level 8
予想
find / -name data.txt | xargs grep millionth
解法
grep millionth ./data.txt
Bandit Level 8 → Level 9
予想
sort ./data.txt | uniq -u
解法
予想どおりだった.
Bandit Level 9 → Level 10
予想
strings ./data.txt | grep =
解法
予想どおりだった.もっとスマートな解法もありそう.
Bandit Level 10 → Level 11
予想
base64 -d ./data.txt
解法
予想通りだった.
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
大文字と小文字に対応する箇所をそれぞれずらす!
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手間くらい減る。