yyy

CTFつよくなりたい

OverTheWireの bandit0 から bandit26 までをやってみた

タイトルのとおり

昨日の21時、22時頃にふとやろうと思い立って完走するまでやっていた

(一応、期限を約1日と決めて)

自分のメモ代わりに writeup を残すので、これからやる人の参考にでもなれば

※いろいろ表示が汚い部分があります

※追記(2017/06/16):見てくれている人がいるみたいなので,見やすいように少し書き直しました.

Level 0

ホスト名 bandit.labs.overthewire.org にユーザ名:bandit0 パスワード:bandit0 で ssh して終わり

Level 1

bandit1@bandit.labs.overthewire.orgにsshするとreadmeがあるのでcatして終わり

boJ9jbbUNNfktd78OOpsqOltutMc3MY1

Level 2

sshすると、"-"というファイルがありそれにパスワードがあるらしい
"-"という名前だとオプションと認識されてしまいcatやlessできない
rm -- -testなどとすれば"-"のついたファイルを操作することができるらしいがcatやlessできなかった

よって、ディレクトリを一層上に移動して
そこからパスを指定してcatしたらいけた

$ cat ./bandit1/-

で終わり

CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9

Level 3

sshすると、spaces in this filenameというファイルがあり、それにパスワードがあるらしい

空白をどう処理するかを問いているのだろうが、bashの補完機能を使えば一発なのでtabで補完してcatでおわり

UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK

Level 4

sshすると、inhereというディレクトリがあるので、とりあえず移動

lsしてみるとなにもないので、どうせ隠しファイルだろうと-aオプションをつけてls

案の定「.hidden」というファイルがあったのでcatしておしまい

pIwrPrtPN36QITSp3EQaw936yaFoFgAB

Level 5

sshすると前回と同様、inhereディレクト

移動してlsしてみると、「-file00」から「-file09」までのファイルがある

"-"がついたファイルの処理はbandit2辺りで学んだので、file -- -file00としてみる
するとバイナリであったのでcatしても無駄
一応、--file09まで調べてみると、--file07だけがテキストファイルだったのでcatしておわり

koReBOKuIDDepwhWk7jZC0RTdopnAYKh

Level 6

ssh, inhereにcd するとmaybehere00〜maybehere19までのディレクトリがあり,恐らくfindして探すんだろうなと思ったが
findの指定がいまいちうまくいかず、結局量も少なかったため一からcdして怪しそうなファイルを探していく
ヒントにはサイズが1033とあったので、隠しファイルも表示するようにls -laで見ていく
すると、maybehere07にて .file2というファイルのサイズが1033であったのでcatしておしまい

DXjZPULLxYr17uwoI01bNLQbtFemEgo7

Level 7

sshするとなにもないので、問題文を見てみる
すると「このサーバーのどこかにあるよ、所有者はbandit7, group名はbandit6, ファイルサイズは33bytes」と丁寧にかかれていたので
ファイルサイズが33で, /からfindしてみると、/etc/bandit_pass/bandit7というファイルが目に入ったので、見ようとしてみるとpermission denied、引っかかった

もう一度findについて調べてみると、-user ユーザ名 で指定したユーザが保有しているファイル・ディレクトリを検索できるらしい find万歳!
ってことで/にて、

$ find ./ -user bandit7

としてみると、大量のPermission deniedが表示されて面倒だったので、2>/dev/nullで処理

$ find ./ -user bandit7 2>/dev/null

すると、先ほど見た/etc/bandit_pass/bandit7というファイルの他にもう一つ、./var/lib/dpkg/info/bandit7.passwordというファイルが見つかる

よって、ls -lしてみると、ファイルサイズは33bytes、所有者bandit7, group名はbandit6、とバッチリ一致したので、catしておしまい

HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs

以下のサイトが非常に参考になった。有難や・・・
findコマンドで覚えておきたい使い方12個(+1個) | 俺的備忘録 〜なんかいろいろ〜orebibou.com


Level 8

sshしてみると、data.txtというファイルがある
ファイルサイズも見ないでとりあえずcatしてみるとものすごい量の出力が十数秒止まらなかった
ようやく出力が終わり、ファイルサイズを見てみると4184396、つまり約4Mbyteのテキストファイルであった(安易なcatはダメだと学んだ)
問題文を見てみると、millionthの次のワードだよとあったので、grepして終わりやんけと思って、cat data.txt |grep millionth でおしまい

cvX2JJa4CFALtqS87jk27qwqGhBM9plV

問題文はしっかり読もうと思った

Level 9

sshするとまたもや,data.txt
今回はしっかりと最初に問題文に目を通してみると、一回しか出てこない一行がパスワードらしい
lessしてみると、確かに重複しているものばかり

uniqで重複を取り除くのだろうと考え、

$ cat data.txt |uniq -u

(オプションなしだと一つにまとめるだけ、uオプションはまとめるのではなく、削除する)

だが、uniqは”連続して重複している行”を1つにまとめるコマンド

よって、sortしてあげる必要があるので、uniqの前にsortを挟み、

$ cat data.txt |sort |uniq -u

でおしまい

UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR

Level 10

sshすると、data.txt
lessしようとしたら、binary fileですけどいいですか?と聞かれてバイナリファイルだと判明
バイナリファイルであれば、表示可能文字を出力してくれるstringsコマンドがある
よってstringsして、banditのパスワードは毎回32文字であり、それらしき文字列がすぐ見つかるのでおしまい

truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk

Level 11

sshすると、data.txt
ファイルサイズは明らかに小さかったので、cat
するとbase64らしきもので暗号化されている文字列が表示されたので、

$ echo "VGhlIHBhc3N3b3JkIGlzIElGdWt3S0dzRlc4TU9xM0lSRnFyeEUxaHhUTkViVVBSCg==" |base64 -d

としておしまい

'The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR\n'

よって、IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR

Level 12

またもやdata.txt

catすると、なにやらrot13らしき文字列

pythoは入っているようなので、pythonを起動して、

a = "Gur cnffjbeq vf 5Gr8L4qetPEsPk8htqjhRK8XSP6x2RHh"
a.decode("rot13")
u'The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu'

よって、5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu

Level 13

展開地獄の問題であった

まずsshすると16進ダンプされたテキストファイル,data.txtがある
/tmpの下にディレクトリを作って、作業していいよと問題文にあるので、tmp下にディレクトリを作り、data.txtも持ってくる

xxdコマンドを使えば元のデータに戻すことが可能なので、

$ xxd -r data.txt > hoge

として変換する(-pオプションはポストスクリプト形式のみつけるため今回はつけない)

取り出したバイナリファイルを見てみると、マジックナンバーが 1f 8b なのでgzipだとわかった

$ mv hoge hoge.gz

としてから

$ gzip -d hoge.gz

で展開

そしてfileコマンドで確認してみると、bzip2で圧縮されたファイルらしい

よって、

$ bzip2 -d hoge

とすると、hoge.outというファイルが出てくる

fileコマンドで確認→ gzipであった

$ mv hoge.out hoge.gz

としてから

$ gzip -d hoge.gz

で展開

そして展開したhogeをfileコマンドで確認すると、flg: POSIX tar archive (GNU)
どうやらアーカイブらしい

xfオプションでアーカイブファイルを展開できるので、

$ tar -xf hoge

すると、data5.binというファイルがでてきた

例によってfileコマンドで確認すると

data5.bin: POSIX tar archive (GNU)

またしてもアーカイブファイルなので、

$ tar -xf data5.bin

すると、今度はdata6.binがでてきた

今度はbzip2らしい

よって、

$ mv data6.bin data6.bz2

からの

$ bzip2 -d data6.bz2

するとdata6が取り出せるのだが、これもアーカイブファイル

よって、

$ tar -xf data6

すると、今度はdata8.binが出てきてこれはgzip

よって、

$ mv data8.bin data8.gz
$ gzip -d data8.gz

こうしてでてきた data8 がようやくテキストファイルなので、catしておしまい

The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL

  • tarについて

http://webkaru.net/linux/tar-command/webkaru.net

  • bzip2について

Linuxコマンド集 - 【 bzip2 】 ファイルを圧縮・展開する(拡張子.bz2):ITpro

  • xxdについて

https://manned.org/xxd/c27ae9e6https://manned.org/xxd/c27ae9e6

Level 14

sshすると、sshkey.privateというRSA秘密鍵が与えられている
問題文には、次のレベルへのパスワードは/etc/bandit_pass/bandit14にあり、これはbandit14しか読めないとなっている
よって、private SSH keyがあるから、これ使ってbandit14としてsshして、/etc/bandit_pass/bandit14を読んでね という問題

鍵を指定してsshする方法は知らなかったのでググった

すると、https://support.rackspace.com/how-to/logging-in-with-an-ssh-private-key-on-linuxmac/ のサイトが非常に役に立った

これを元に、

$ ssh -i sshkey.private bandit14@localhost

としてssh

するとbandit14としてアクセスすることができ、あとはパスワードを読むだけ

4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e

Level 15

sshすると、.sshがあり、その中にauthorized_keysがあり、sshの仕組みがまだよく理解できていない自分は試行錯誤していた

だが、authorized_keysというのは公開鍵を置いておく場所であり、前問でsshしたときにこの公開鍵があるためアクセスできたということだった(ほんと自分がアホだと・・)

問題文には、次のパスワードは現在のレベルのパスワードをlocalhostのport30000番に提出すればいいとあったが、「どうやって提出すんの・・・?」と少し考えた結果、「echoでええやん」という結論に至り、

$ echo "4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e" |nc localhost 30000

としたところ

Correct!
BfMYroe26WYalil77FoDi9qh59eK5xNr

と、レスポンスが返ってきた

よって、BfMYroe26WYalil77FoDi9qh59eK5xNr

Level 16

まず、最初に騙されてかなり時間を持ってかれた・・・

bandit15のパスワードはBfMYroe26WYalil77FoDi9qh59eK5xNrじゃないか!!

sshした先にあった .bandit14.passwordを使っており、全くできなかった・・・
(これ以前の問題で必要だから置いてあったのだろうが、すっかり騙されてしまった・・)

今回は前回と似ていて、現在のレベルのパスワードをlocalhostのport30001番に渡せば良いのだが、SSL encryption、つまりSSL暗号化で渡さなければならない

自分は最初、.bandit14.passwordファイル自体をssl暗号化して渡すのだろうかと

$ openssl aes-256-cbc -d -in .bandit14.password -pass file:.bandit14.password

とか無駄なことをやってしまっていた

途中でs_clientの存在に気づき、

$ echo "4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e" |openssl s_client -connect localhost:30001
↑ bandit14のパスワード

とやっていて、証明書情報とその下にDONEとレスポンスが返ってくるだけで、なんだこれは、と思っていた

そこで、確か/etc/bandit_pass/とかで自分のパスワードが見れるはずだったので、bandit15のパスワードを表示してみた

BfMYroe26WYalil77FoDi9qh59eK5xNr

違うやんけ

ってことで、

$ echo "BfMYroe26WYalil77FoDi9qh59eK5xNr" |openssl s_client -connect localhost:30001

として、これでいけるだろと思ったが、HEARTBEATINGというレスポンスが増えただけで、パスワードは貰えない

もう一度問題文を読んでみると、どうやらHEARTBEATINGとなる時は、-ign_eofというオプションを使えとある

よって、

$ echo "BfMYroe26WYalil77FoDi9qh59eK5xNr" |openssl s_client -ign_eof -connect localhost:30001

としてみたところ、

Correct!
cluFn7wTiGryunymYOu4RcffSxQluehd

read:errno=0

というレスポンスをいただくことができ万々歳だった

どうやら、s_clientの -ign_eof オプションというのは、EOF(end of file)がinputに達した時に接続を切断するのを禁止するらしい
ignore eof、ファイルの終わりを無視するという意味だった

https://www.openssl.org/docs/manmaster/apps/s_client.html

Level 17

まず、問題文には次のレベルへの証明書は現在のレベルのパスワードをlocalhostのポート番号31000から32000のどれかにSSLで提出すると、ゲットできるが、それは一つだけとあるので、ポートスキャンする

$ nmap -p 31000-32000 localhost

で31000番から32000までをポートスキャンした結果、

$ bandit16@melinda:~$ nmap -p 31000-32000 localhost
Starting Nmap 6.40 ( http://nmap.org ) at 2016-06-25 19:52 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00049s latency).
Not shown: 996 closed ports
PORT      STATE SERVICE
31046/tcp open  unknown
31518/tcp open  unknown
31691/tcp open  unknown
31790/tcp open  unknown
31960/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.08 seconds

となっていくつか開いているポートが見つかったので

$ echo "cluFn7wTiGryunymYOu4RcffSxQluehd" |openssl s_client -ign_eof -connect localhost:ポート番号

で5つすべてに送ってみる

すると、31790のみ、レスポンスとして

Correct!
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu
DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW
JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX
x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD
KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl
J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd
d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC
YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A
vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama
+TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT
8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx
SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd
HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt
SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A
R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi
Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg
R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu
L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
-----END RSA PRIVATE KEY-----

と、bandit17のprivate keyがゲットできたので、あとはこれを元にsshするだけ

だったのだが、リモート先の/tmp/に作成したディレクトリでやろうとしたが、作成できないため、どうやらこうではなく、ローカルで鍵を作成してsshするようだった

よって、sshkey.privateに上の鍵をコピペして

$ ssh -i sshkey.private bandit17@bandit.labs.overthewire.org

として、アクセスしようとしたのだが、sshkey.privateのPermissionで怒られてしまった

しっかりと、600に設定して

もう一度sshするとうまくいった

bandit17のパスワードは/etc/bandit_pass/で確認した

xLYVMN9WE5zQ5vHacb0sZEVqbrp7nBTn

  • nmapについて

Level 18

password.newとpassword.oldのdiffを取ったものがbandit18のパスワード(kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd)なのだが、これでsshしようとしてもByebye!と表示されてすぐ切断されてしまう

→ Level 19へ

Level 19

この問題で詰まって結局寝てしまった

起きてからもう一度問題文を読みなおしてみる

"bandit18にログインしようとするときByebye!と表示されるなら、それは次のレベルbandit19と関係しているよ"

ということで、bandit19の問題文を見てみる

"次のレベルのパスワードはホームディレクトリのreadmeファイルにあるよ、でも誰かが、.bashrcを修正してsshでログインするときにログアウトするようにしてしまった"らしい

なんて野郎だ、と思ったがsshするときにreadmeを読み出せればいいんじゃねと思いsshコマンドについてもう一度調べてみる

すると、

$ ssh hogehost ls -al

とかでコマンド実行できるらしい

https://hydrocul.github.io/wiki/commands/ssh.html

やった、ということで

$ ssh bandit18@bandit.labs.overthewire.org ls -al

としてみると readmeファイルが見つかったので

$ ssh bandit18@bandit.labs.overthewire.org cat readme

でおしまい

IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x

最初は眠気からか、"bandit18にログインしようとするとき"という英文をbandit18のログ、つまりsshのログを見るのか・・?とか思って
ローカルの/etc/ssh/ssh_configのLOGLEVELを設定したりと、変なことをやってしまっていた

できない時は寝るのが一番

Level 20

sshすると、bandit20-doというファイルがある

ls -lしてみると、どうやらsetuidが立っている

fileコマンドで調べると実行ファイルなので、実行してみると

bandit19@melinda:~$ ./bandit20-do
Run a command as another user.
  Example: ./bandit20-do id

こんな風に言われたので、./bandit20-do id と打ってみる

uid=11019(bandit19) gid=11019(bandit19) euid=11020(bandit20) groups=11020(bandit20),11019(bandit19)

すると、uidやらeuidが手に入る

結局これで何すんの・・?と思ったのだが、bandit20-doというファイル名から、引数に任意のコマンド渡してやればいけんじゃねと思いやってみる

bandit19@melinda:~$ ./bandit20-do cat /etc/bandit_pass/bandit20
GbKksEFF4yrVs6il55v6gwY5aVje5f0j

いけた

Level 21

恐らく今までで一番詰まった、3時間ぐらいやってようやくって感じだった

まず、sshした先にまたsetuidが立っているプログラムがあり、これを使ってなんかするらしい

問題文を読んでみると、このプログラムは引数に渡したポート番号のlocalhostへの接続を作ってくれるらしい
さらにその時、接続先からテキストのラインを読み、bandit20のパスワードと比べて合っていたら、次のレベルのパスワードを送ってくれるらしい

もうこの時点でよくわかっていなく、とりあえず実行したり、ncにパイプしたりといろいろやっていた

できないので、問題文にNOTEとNOTE2というヒントらしきものがあるので読んでみると、

NOTE: あなたは二度ログインする必要がある、一度はsetuid commandを走らせ、もう一度はsetuidが繋がるnetwork daemonをstartさせる

とあったがさっぱりわからない

NOTE2: まあとにかく自分自身のnetwork daemonに繋げてみろ

は、という感じでさっぱり分からない

使うコマンドはssh, nc ,catのどれかなので、恐らくncしかないだろうと、ncについてもう一度調べてみる

すると、http://www.ksknet.net/linux/nc_netcat.html のサイトに

「nc は -l オプションをつけることでリッスンモードとして起動でき、デーモンサービスとしても使用できる」

とあったので、これだ!とリッスンモードを使うのだろうと考える

二度ログインというのがいまいちわからず、ログアウトしてもう一度そこに繋ぐ・・・?とか散々考えた結果、いやいや二つの状態を作り出すんじゃね?という結論に至り

nc をリッスンモードで起動させてるshellと、もう一度sshしてリッスンモードで起動してるshellになにか送るshellを用意するのだろうと、2つのshellを用意した

ここからがまたよくわからず、とにかくウェルノウンポート以外のポート番号でncをリッスンモードで起動し、もう一つのshellでごにょごにょやっていた

そもそも、このプログラムがどういうプログラムなのかもう一度振り返ってみると、接続先からテキストのラインを読み、とあるので、

$ nc -l 3100

とかやって、リッスンモードで起動しているshellに、bandit20のパス"GbKksEFF4yrVs6il55v6gwY5aVje5f0j"を貼り付け、
もう片方のshellで

$ ./suconnect 3100

とやれば

Read: GbKksEFF4yrVs6il55v6gwY5aVje5f0j
Password matches, sending next password

という結果が表示され、ncの方を見てみると、bandit20のパスワードをペーストした下に、bandit21のパスワードが表示されていた

gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr

  • ポート番号一覧

TCPやUDPにおけるポート番号の一覧 - Wikipedia

Level 22

問題文には一つのプログラムが、ジョブスケジューラに従ったタイムのcronで動いている、とある
さらに、形式や何のコマンドが実行されているのかの為に/etc/cron.dを見ろとあったので、見てみる

ls -lしてみると、いろんなファイルがある

怪しそうな、cronjob_bandit22というものがあったのでcatしてみると

* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null

よって、/usr/bin/cronjob_bandit22.shというシェルスクリプトが常時動いているのがわかる

/usr/bin/cronjob_bandit22.shをcatしてみると、

#!/bin/bash
chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv

/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgvのパーミッションを変えてくれて、そこにbandit22のパスワードをリダイレクトしてくれているらしい

よって、/tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgvを cat しておしまい

Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI

Level 23

問題文を読んでみると、またcronの問題らしい

前問と同様/etc/cron.dにあるファイルをなんかするらしいので移動してls -lしてみる

cronjob_bandit23というものがあったので、cat してみる

* * * * * bandit23 /usr/bin/cronjob_bandit23.sh  &> /dev/null

このcronjob_bandit23がどういう処理をしているのか見てみる

$ cat /usr/bin/cronjob_bandit23.sh
#!/bin/bash

myname=$(whoami)
mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)

echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"

cat /etc/bandit_pass/$myname > /tmp/$mytarget

これをこのまま実行してしまっては、whoamiにbandit22が入ってしまい、得られるのは結局bandit22のパスワードなので、

$ echo I am user bandit23 |md5sum |cut -d ' ' -f 1

とすると、8ca319486bfbbc3663ea0fbe81326349 という文字列が手に入るので

あとは、tmpの下にあるこいつをcatするだけ

$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349

jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

Level 24

前回と同様、cronの問題

/etc/cron.d/cronjob_bandit24を見てみると

* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null

cronjob_bandit24.shが常時動いているらしい

$ cat /usr/bin/cronjob_bandit24.sh

として中身を見てみると、

#!/bin/bash

myname=$(whoami)

cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for i in * .*;
do
    if [ "$i" != "." -a "$i" != ".." ];
    then
        echo "Handling $i"
        timeout -s 9 60 "./$i"
        rm -f "./$i"
     fi
done

/var/spool/$mynameの中身を、実行して、削除しているらしい

つまりなんとかして、実行させて、/etc/bandit_pass/bandit24 辺りを読みだせば良いのではと思ったので(cronjob_bandit24はbandit24として実行されるため)

/var/spool/bandit24に移動して、tmp.shを作成する

tmp.sh

#!/bin/sh

cat /etc/bandit_pass/bandit24

としたが、うまくいかなかったので

cat /etc/bandit_pass/bandit24 > hoge

と、リダイレクトするようにする

保存して実行権限を与えようとしたらファイルが消されてしまっていたりして苦労したが、なんとかうまいタイミングで実行権限を与えて実行されるまで待つ

すると、hogeが生成されているので、cat hoge でおしまい

UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

Level 25

ポート番号30002で、デーモンがリッスンしているらしく、bandit24のパスワードと、4桁のピンコードを与えると、bandit25のパスワードをくれるらしい

さらに、ピンコードの取得方法はブルートフォースしかない、とある

最初は、どこかにシェルスクリプトなどを作成して、実行するのかと思ったが、どこかの回で使った/tmpの下のディレクトリではファイルを作成できず、どうするかと思っていたが、シェル芸的にワンライナーでいいんじゃね、と思いワンライナーで書いてみる

書き方がわからなかったので、ググって、以下のサイトが参考になった

http://qiita.com/yuya_presto/items/d1a50565f187c7c8ec76

これの、シェルだけで、forループのワンライナーの項目を参考にして

$ for i in {0001..9999}; do echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ" $i; done

と書いてみる、パスワードとピンコードの渡し方がわからなかったので、nc で繋いで確認してみる

$ nc localhost 30002

すると、

I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.

とレスポンスがきて、パスワードとピンコードを空白であければよいとわかる

$ for i in {0001..9999}; do echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ" $i; done |nc localhost 30002

としてみるが、どうにもうまくいかない

もしかして、echoだと改行が入っていないので、それが問題じゃないかと思い、

$ for i in {0001..9999}; do echo -e "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ" $i\\n; done |nc localhost 30002

(eオプションで\nが改行として扱われる、さらに\をエスケープして、\nとする)

  • echoについて

http://www.mazn.net/blog/2009/01/06/169.html

上のワンライナーを実行すると、

・・・・・・
Wrong! Please enter the correct pincode. Try again.
Fail! You did not supply enough data. Try again.
Wrong! Please enter the correct pincode. Try again.
Fail! You did not supply enough data. Try again.
Wrong! Please enter the correct pincode. Try again.
Fail! You did not supply enough data. Try again.
Correct!
The password of user bandit25 is uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG

Exiting.

よって、uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG

一番楽しかった

Level 26

最後の問題だけあって全然できなかった

ssh すると、ホームディレクトリにはbandit26の秘密鍵があるので、これを使って、bandit26にsshする

だが、すぐ切断されてしまって、なにもできない

前に似た問題があったなと、ssh して、任意のコマンド(ls)を実行してみたができない

前にコマンドを移し、パイプする形で実行してみると、

$ ls -al |ssh -i bandit26.sshkey bandit26@localhost

::::::::::::::
/home/bandit26/text.txt
::::::::::::::

text.txtがあるのがわかったがよくわからない

どういうことだと思い、問題文を読んでみると、どうやらbandit26では、shellがbashではない「何か」になっているらしい

/etc/shells を確認してみると、使えるshellが確認できるが、その中に、/usr/bin/showtext というshellが確認でき、cat してみると

#!/bin/sh

more ~/text.txt
exit 0

となっていて、先ほどのtext.txt を more しているらしい

ここで、このシェルを ssh するときにログインシェルにするのではないかとか考えてしまい

$ ssh -i bandit26.sshkey bandit26@localhost -t /usr/bin/showtext

などとしてしまっていた

もう一度考え直すと、これ向こうのシェルがshowtextなんだから、ログインした時点でtext.txtがmoreされている?と思ったのだが、

$ ssh -i bandit26.sshkey bandit26@localhost

としても全くできない

期限は今日の日曜日までとしていたので、ここまで来たがタイムアップ

ほんとにできている人いんのか・・とググってみて以下のサイトの
https://github.com/Cathon/mySolutions/blob/master/overthewire/Bandit/Level_25.md

Step1   before exec the command above the size of terminal should be small enough(util you can see 5 line)

ここで察した・・・

moreされている気配がなかったのは結局、moreするtext.txtが十分な長さがなかったので、普通に表示されている風に見えてしまっていた

よって、ターミナル自体を小さく、上にあるとおり5行ほどにする

そして、

$ ssh -i bandit26.sshkey bandit26@localhost

とすると、表示が途中で止まってくれる

manはviを起動することが出きるので、止まったところで v と打つと、viが起動できるので、あとは/etc/bandit_pass/bandit26にあるパスワードを

:e でファイルを開けるので

:e /etc/bandit_pass/bandit26

として、開いておわり

5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z

他の解答を参考する形になってしまって、非常に悔しかった・・・

頓知を働かせた解答で、思わずなるほど。。。と思った

途中飯も食わず、もくもくとやっていたため、とても疲れた。。。