[CTF]OverTheWire Bandit  Level 10〜19

#はじめに
[前回](http://qiita.com/ketch/items/830fcad47113cb4e6764)の続きやっていこーーーー

#Level 10〜11
"data.txt"のなかにパスワードがあるらしい。
問題文を見るとbase64でエンコードされているらしいのでデコードして終わり。
`$ base64 -d data.txt`


#Level 11〜12
"data.txt"のなかにパスワードがあるらしい。
問題文をみると大文字小文字それぞれについて13文字づつずらしているらしい。
これはrot13という非常にポピュラーなシーザー暗号。
nkfコマンドとか使おうと思ったけどなかったので、trコマンドを使うことにした。

trコマンドは文字の置換や削除などを行うことのできるコマンドである。
置換の場合は、オプション無しで１つめの引数にある文字を、ふたつ目の引数の対応する位置にある文字に変換する。
よってコマンドはこんな感じ。
`$ cat data.txt|tr A-Z N-ZA-M|tr a-z n-za-m`
これによって、A〜MをN〜Zに、N〜ZをA~Mに変換することができる。

なんとなくコマンドでやったがpythonは入っているようなので、stringのencode("rot13")とか使ってもできるはず。

#Level 12〜13
"data.txt"のなかにパスワードがあるらしい。
どうやらこのファイルはhexdumpされたファイルらしい。
/tmp以下に作業ディレクトリを作ってもいい と書いてあったので、ディレクトリを作って"data.txt"をコピーして持ってくる。

catで見てみると、先頭のファイルの先頭から2バイトが"1F 8B"とある。これは、元ファイルがgzipであることを示すフォーマット識別子(いわゆるマジックナンバー)である。
というわけでxxdコマンドでバイナリファイルに戻し、ファイル名に".gz"をつける
`$ xxd -r data.txt > tmp.gz`
これを展開
`$ gzip -d tmp.gz`

展開したファイルをfileコマンドで見てみるとこんどはbzip2で圧縮されている。
ファイルをリネームして展開。
`$ mv tmp tmp.bz2`
`$ bzip2 -d tmp.bz2`

今度はgzip、、、またリネームして展開。
`$ mv tmp tmp.gz`
`$ gzip -d tmp.gz`

今度はtarファイル、、、いつまでやるの、、、
`$ tar -xvf tmp`

data5.binが出てきたので見てみるとまたまたtarファイル、、、
`$ tar -xvf data5.bin`

出てきたdata6.binを見てみるとbzip2ファイル、、、
`$ mv data6.bin data6.bz2`
`$ bzip2 -d data6.bz2`

出てきたdata6もどうせ違うんだろうなーと思いつつfileで確認するとtarファイル、、、
`$ tar -xvf data6`

淡い期待を寄せて確認したdata8.binもgzipファイル、、、
`$ mv data8.bin data8.gz`
`$ gzip -d data8.gz`

実はこのやり方が間違ってるんじゃないかと思い始めたころ、出てきたdata8はようやくASCII textでした。
もっとスマートなやり方があれば教えてください。。。

#Level 13〜14
"/etc/bandit_pass/bandit14"のなかにパスワードがあるらしい。
でもこのファイルは"bandit14"ユーザーでなければ読めないんだとか。
ホームディレクトリでlsしてみるとRSAキーがあるのでこれを使ってbandit14としてsshしてみる。
`$ nmap localhost`でポートスキャンしてみるとデフォルトの２２番ポートでsshが開いてるのでssh。パスワードを確認して終わり。
`$ ssh bandit14@bandit -i sshkey.private`

#Level 14〜15
次のレベルへのパスワードはlocalhostの30000番にbandit14のパスワードを送信すると手に入るらしい。telnetを使ってやってみる。
`$ telnet localhost 30000`
で接続してbandit14のパスワードを入力すると'Correct!'というメッセージとともにパスワードがもらえる。

#Level15〜16
次のレベルへのパスワードは、30001番にopensslで接続してbandit15のパスワードを送信すると手に入るらしい。
自分はopensslは鍵の生成などによく使うのだが、s-clientというコマンドを使えばopensslをクライアントとして使うことができる。echoでbandit15のパスワードを出力し、それをopensslのs-clientで30001番に渡してみる。
`$ echo BfMYroe26WYalil77FoDi9qh59eK5xNr|openssl s_client -connect localhost:30001`

しかし出てくるのは認証情報と"HEARTBEATING"という文字と"DONE"という文字だけ。
問題文を見てみると、このようなときは"-ign_eof"を使え と書いてある。
`$ echo BfMYroe26WYalil77FoDi9qh59eK5xNr|openssl s_client -connect localhost:30001 -ign_eof`
とするとパスワードをもらえた。
ちなみに-ign_epfというオプションがないと、'R'、'Q'、'B'などの文字がコマンドとして受け取られてしまうらしい。


#Level 16〜17
次のレベルへの認証情報は、31000〜32000のどこかのポートへbandit16のパスワードを送るともらえるらしい。
まずはnmapでどのポートが開いているのかを調べる。
`$ nmap localhost -p31000-32000`
すると、

* 31046/tcp open  unknown
* 31518/tcp open  unknown
* 31691/tcp open  unknown
* 31790/tcp open  unknown
* 31960/tcp open  unknown

という結果が得られる。
この各ポートに、
`$ echo cluFn7wTiGryunymYOu4RcffSxQluehd | openssl s_client -connect localhost:上記のポート番号 -ign_eof`
としてbandit16のパスワードを送ると、31790だけRSAキーが返ってくる。
作業ディレクトリにてこのRSAキーをファイルに書き込み、それを使ってbandit17へsshしようとする。
`$ ssh bandit17@bandit -i sshkey.private `
しかし以下のような警告が出てsshできなかった。
>
Permissions 0664 for 'sshkey.private' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: sshkey.private

どうやらRSAキーファイルのパーミッションが開きすぎていることが原因らしい。
ググったら600にすると良いらしいので
`$ chmod 600 sshkey.private`
してsshすると出来た。

#Level 17〜18
ホームディレクトリにある"passwords.old"と"password.new"の異なる１行が次のレベルへのパスワードらしい。
diffで一発じゃんと 思い
`$ diff passwords.old passwords.new`
とすると、一行だけ異なる行が出てきた。
今回は随分易しいな〜と思い、手に入れたパスワードを使ってbandit18にsshすると、、、
*Byebye !*
と出てログアウトさせられた。
はぁ？？？？？？？？？？？？？？？？？？？？？
とりあえずこのレベルはこれで終わり。続きは次のレベルで。

#Level 18〜19
どうやら先程のログアウトは、bandit18のシェルがそのような設定になっていることが原因らしい。
じゃあしょうがない！！！
というわけにもいかず悩む。
パスワード自体はホームディレクトリの"readme"にあるらしいのだが...

いろいろ調べていると、ssh接続時にコマンドを指定することで、ssh先にリモートでコマンドを実行できるらしいことを知る。
というわけでリモートで"readme"をcatして終わり。
`$ ssh bandit18@bandit.labs.overthewire.org -p 2220  cat readme`

#Level 19〜20
次のレベルのパスワード入手するには、setuidが設定されたバイナリファイルを使用するらしい。
ホームディレクトリには"bandit20-do"というバイナリファイルが。

setuidが設定されている実行ファイルは実行したユーザーのIDではなく、そのファイルの所有者(またはグループ)のユーザーIDを持って実行する。
このsetuidはpasswdやchpassなどにも設定されている。
これらのコマンドにはrootユーザーのIDが設定されており、これによって一般ユーザーに書き換えなどが許可されていないファイル(etc/passwd や /etc/master.passwd など)を触ることができるのだそう。

とりあえず"badit20-do"を実行してみる。
`$ ./bandit20-do`
すると
>
Run a command as another user.
  Example: ./bandit20-do id

との文面が。
どうやらこのバイナリファイルは "./bandit20-do" のあとにコマンドを指定することで、bandit20としてコマンドを実行できるらしい。
パスワードは"/etc/bandit_pass/ユーザー名"にあるので、
`$ ./bandit20-do cat /etc/bandit_pass/bandit20`
で終わり。

#終わりに
バイトや課題の息抜きにやっているけどなかなか楽しい。
banditが終わったら他のもやってみようと思います:)