#はじめに
大学の特別講義みたいなのでOverTheWireのBanditというCTFのような問題を解いているという話を耳にしたので、自分もやってみた。
#OverTheWire Bandit とは
あらかじめ用意された"bandit.labs.overthewire"というサーバーにユーザー"bandit0〜26"としてsshし、パスワードを探す。各ユーザーの数字は問題のレベルを表しており0から順に解いていく。パスワードは次のレベルのユーザーにsshするためのパスワードとなっている。
といった感じ!
#Level 0
"bandit.labs.overthewire" にユーザー名"bandit0"、ポート番号"2220",パスワード"bandit0"でsshして終わり。
$ ssh bandit0@bandit.labs.overthewire.org -p 2220
#Level 0〜1
ホームディレクトリに"readme"があるのを確認して、catなどで表示する。
$ ls
$ cat readme
#Level 1〜2
ホームディレクトリの"-"というファイルに次のレベルへのパスワードがあるらしい。
しかし$ cat -
などしても"-"がオプション扱いされて表示できない。
なので$ cat ./-
などでパスから指定して表示する。
#Level 2〜3
ホームディレクトリの"spaces in this filename"というファイルにパスワードがある。
ファイル名に空白が入っているので、ファイル名指定の際に空白を""(Windowsでは"¥")でエスケープする。
実際にはshの補完機能を使えば一発なのでtabで解決。
$ cat spaces\ in\ this\ filename
#Level 3〜4
ホームディレクリの"inhere"というディレクトリにパスワードがあるらしい。
$ cd inhere/
で移動して$ ls
でファイルを確認するも何も見つからない。
これはパスワードのあるファイルが"."から始まる隠しファイルになっているから。
lsで隠しファイルを表示する-aオプションをつけてファイル名を確認したら中身を確認して終わり。
$ ls -a
#Level 4〜5
ホームディレクリの"inhere"というディレクトリにパスワードがあるらしい。
inhereに移動してlsすると、-file00〜-file09までの10個のファイルがある。
それぞれのファイルについて"file"コマンドで調べる(先頭が"-"なのでLevel1〜2と同様にパスを指定する)と、"-file07"だけASCII textのファイルであることがわかる。
これをcatするとパスワードがわかる。
#level 5〜6
ホームディレクトリの"inhere"というディレクトリ以下にパスワードがあるらしい。
inhereに移動してlsすると、maybehere00〜19の20個のディレクトリがある。
試しに00に移動してls -aしてみると、9個のファイルがあることがわかる。
全ディレクトリにこの数あるとすると、全て調べるのはだるいのでfindコマンドを使っていい感じに探す。
パスワードファイルには、
- 人間が読める(今まででの問題からしてASCII text?)
- 1033byte
- 実行ファイルでない
という条件がある。
とりあえず1033byteという条件を使うことにする。
"inhere"ディレクトリで$ find -ls|grep 1033
を実行することで見つけられる。
コマンドの説明としては、"find"でカレントディレクトリ以下のファイル、ディレクトリを再帰的に検索、"-ls"オプションでls形式で表示、"grep 1033"でファイルサイズを指定 という感じ。
もっと他の方法もありそう。
#Level6〜7
このサーバのどこかにパスワードがあるらしい。
条件としては、
- 所有ユーザーは"bandit7"
- 所有グループは"bandit6"
- ファイルサイズは33byte
といった感じ。
とりあえずfindコマンドとgrepコマンドで条件を全部突っ込んで検索してみる。
$ find / -ls |grep -w 33|grep bandit7 |grep bandit6
すると、/var/lib/dpkg/info/bandit7.passwordというファイルがヒットする。
条件も全て満たすので、おそらくこのファイルで正解なのだが、"permission denide" が大量に出てきて五月蝿い。
このエラー出力は 2>/dev/nullで消すことができる。
これは標準エラー出力の番号である2を/dev/null(いわゆるブラックホールファイル)に入れることでエラーが出力されなくなるため。
最終的なコマンドは
$ find / -ls 2>/dev/null|grep -w 33|grep bandit7 |grep bandit6
#Level 7〜8
"data.txt"の中にパスワードがあるらしい。
とりあえずcatしてみるとものすごい量のテキストが、、、
wc -l data.txt
してみると98567行もあった:)
問題文をみると"next to the word millionth"とあるのでgrepで指定して終わり。
$ cat data.txt|grep millionth
#Level 8〜9
"data.txt"の中にパスワードがあるらしい。
とりあえずのcatで大量に文字が出てくるのも嫌なのでls -l data.txt
でサイズ確認。
やっぱりでかい、、、
問題分を見ると"is the only line of text that occurs only once"とのこと。
どうやらテキストの殆どの行は重複していて唯一重複していない行が本物のパスワードらしい。
"uniq"コマンドを使うと連続する行を削除することができるので、sortしたあとにuniqコマンドに-uオプション(重複していいない行のみを表示)をつけて終わり。
$ sort data.txt |uniq -u
#Level9〜10
"data.txt"の中にパスワードがあるらしい。
問題文を見ると
- human-readable strings
- beginning with several '=' characters
との条件があるのでそれにしたがって検索する。
stringsコマンドで表示可能な文字を出力。
なおかつ、"いくつかの'='で始まる"という条件をgrepで指定する。
$ strings data.txt |grep '=\+'
こんなコマンドで発見できた。(grepの'+'は直前の文字一個以上の繰り返しに一致という正規表現)
#終わりに
とりあえず今日はここまで。
忘れてたコマンドの使い方とか思い出せて結構楽しい。
Levelがまだ低いから割と易しい。
Level 10〜19はこちら