世紀末の墓

お気持ち.log

IT系寄りの雑記

【write-up】OverTheWire bandit Level0~10 を解いてみた

OverTheWire banditとは

用意されたサーバにsshで入って、その中からflagを探すCTF用のサイト
bandit0にはbandit1にloginするためのpassが隠れていて、bandit1にはbandit2にloginするためのpassが隠れているっていう感じ。

それぞれのLevelにbanditが対応している。
Level2ならbandit2のユーザが使えるみたいな感じ。

一応、各番号のサイトにはflagの特徴や条件等いろいろなヒントが書かれていたりなかったりする。

今回はbandit0~10を復習がてらやってみたので解説
OverTheWire: Bandit

環境

host: windows10
VirtualBox:Ubuntu16.04 LTS
仮想マシンUbuntu環境です。

Level0

書かれている文章を読むとsshして繋げたらおkらしい。
ちなみにアドレスはbandit.labs.overthewire.orgでポートは2220、アカウント名とパスワードは両方 bandit0 でいいらしい。
よって

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

で入って

bandit0@bandit.labs.overthewire.org's password:

って聞かれるから

bandit0

を打って完了です。

Level0 → Level1

ホームディレクトreadmeっていうファイルの中に次のレベルのパスワード入ってるよ
って書かれてるので、念のため

$ ls

してみると、readmeっていうファイルがある。

そしたら

$ cat readme

で、ファイルの中身を見る。
するとなんかすごい文字列がでてくるが、これがキーらしい。
これを次のbandit1のパスワードにするとbandit1に入ることができる。

Level1 → Level2

ホームディレクト- って名前のファイルにキーがあるで。って書かれてる。

愚直に

$ cat -

をすると、- がオプション記号(?)として扱われてしまうのでうまくいかない。

最初に - が来ないようにpath指定してあげればよさそうなので

$ cat ./-

で無事中身を見ることができた。

Level2 → Level3

スペースを含むファイル名のファイルの中にキーがあるで。って書かれてる。

愚直に

$ cat space in this filename

をすると、空白区切りで別のファイル名として扱われてしまう(space というファイル、in というファイル、thisという...)。

これを避けるためにエスケープ文字というものを使う
スペースの前に \ (バックスラッシュ)を付けることで、スペースをファイル名に含まれる空白として認識してくれる。

$ cat space\ in\ this\ filename

ちなみに、Tabキーでファイル名を補完する機能があるため、Tabキー押してあげると自動で入力される。

Level3 → Level4

inhere っていうディレクトリの中にあるよ。って書かれてる。

とりあえず、inhere/に移動してみる

$ cd inhere/

そして中身を確認

$ ls 

あれ、なにも表示されない。

でも問題文にinhere/にあると書かれているので、嘘ではないだろう。
なら隠しファイルの可能性を疑って全表示してみる。(lsだけでは通常隠しファイルは見えない)

$ ls -a

すると、.hiddenというファイルが見える。
中身を見てみる

$ cat .hidden

と、無事キーを入手することができた。

ちなみに、移動せず

$ cat inhere/,hidden

でもOK

Level4 → Level5

inhere/の中の一つだけ読めるファイルにキーが書かれてるよ。とある。

inhere/の中身を見てみると-file00~-file09が格納されている。
この中から読めるものを探すわけだが、読めるということはASCIIで書かれていそう。
なので、ファイルの形式を調べてみようと思う。

$ file inhere/*

で全ファイルの形式がわかる。
すると、-file07だけASCII Textだとわかるので、

$ cat inhere/-file07

でキーが入手できる。

ちなみに

$ cat inhere/*

で全部の中身表示して読めるとこだけ取り出してもいいけど、前ファイルの末尾が偶然アルファベットとかありそうだから非推奨

Level5 → Level6

inhere/の中にあるファイルで、

  • 人間が読める
  • ファイルサイズが1033byte
  • 実行ファイルじゃない

の条件に当てはまるファイルだよ。って書いてある。

実際inhere/をlsしてみるとめっちゃファイルある。これを一つ一つ見ていくのは嫌だし、効率悪い。
ので、一番それっぽいファイルサイズを使ってみる。

#findコマンドを用いる場合
$ find -size 1033c

#find, grepを用いる場合
$ find -ls | grep 1033

すると./inhere/maybehere07/.file02が当てはまってるのでそれの中身みてキー入手。

find -ls
findで見つけたファイルをls -lの形式で出力する
| (パイプ)
左のコマンドの出力を右のコマンドの入力とする

Level6 → Level7

このサーバの全場所から

  • 所有ユーザがbandit7
  • 所有グループがbandit6
  • ファイルサイズが33byte

の条件に合うファイル探してねって書いてある。

これはさっきと同じ感じで、

#find
$ find / -group bandit6 -user bandit7 -size 33c

#find and grep
$ find / -ls | grep bandit7 | grep bandit6 | grep 33

でいける。
find / -lsはこのサーバ内の全ファイルをls -lの形式で列挙。
ls -lの形式には所有グループ、所有ユーザ、ファイルサイズ、権限情報などいろいろな情報が載っている。
それをみてgrepで絞り込む感じ。

Level7 → Level8

data.txtっていファイルのmillionthって単語の次にキーがあるぜ。って書かれてる。

これはもう

$ cat data.txt | grep millionth

しかないね

Level8 → Level9

data.txtの中のものは被りばっかで、被らないものは1つしかないらしい。
その被りないやつがキーらしい。


被りを消してくれるuniqコマンドを使いたいんだけど、連続してないといけないから先にsortしよう。

$ sort data.txt | uniq -u

uniq -u は重複を非表示にしてくれる。

するとキーが出てくると思う。

Level9 → Level10

何個かの'='の後にある読める文字列みたいな感じで書いてある。

中身を見てみるとバイナリで読めない。
でも人間が読める文字列って書いてあるのでstringsコマンドを使って可読部分を表示してもらう。

$ strings data.txt

これでもたくさんあって大変。
grepを使うんだ。

$ strings data.txt | grep '='

すると3つくらい出てくるけど、今までキーになってたみたいなやつがキーになる。

まとめ

一応、Level0~10まで書きました。
ここはまだ全然簡単で、uniqやstringsコマンドを久しぶりに使ったくらいの難易度でした。

気が向いたら11以降も書きます。