バグハンターに憧れた人間の日記

バグハンターに憧れた学生がバグハンターになるためにやってきたことについて、書いていくブログです。もし、筆者がバグを見つけれるようになった時にこれからバグハンターになってみたいと思う人の道導になればと思います。

はじめに

初めまして、Wa1m3imです。 筆者はバグハンターに憧れている情報系の専門学生です。 この記事は、バグハンターに憧れた筆者がバグハンターになるためにはどう言ったことが必要なのかを自分なりに考えたり、実際にバグハントを行なっている人に質問したことを元に行動に移したことをブログとして書き残したいと思っています。 内容に誤りがありましたらDMにてご連絡いただけると幸いです。

Hack This Site!

f:id:wa1m3im:20190130211800p:plain 筆者はまずバグハンターになるにはどのような技術が必要なのか様々なブログを読んだり、実際にバグハンターに聞いてみたりしました。 その回答の中で、最も多かった答えが「実際に検証すること」でした。「習うより慣れろ」ってことですね。 とういうことで実際に自分で環境を立てることももちろん大切だと思っているのですが、今回はもともと脆弱性が含まれているサイトを見つけたのでそれを取り組んでみました。 それが、Hack This Site!です。 このサイトはWebに関する脆弱性が多くあるのでとても多いことや、話に流れがあることからとても取り組みやすかったです。

今日はこのサイトの基本的な問題であるBasicMissionについてのライトアップを書きたいと思います。 ちなみにこのサイトの製作者はFireFoxでの動作確認はしているようなので何か不具合があった場合にはブラウザを切り替えるといいのかもしれないですね。

Basic Mission

Basic 1

f:id:wa1m3im:20190130152711p:plain

HTMLのスキルが必要とされるようですね。

f:id:wa1m3im:20190130153203p:plain

とりあえず困ったら開発者ツールを開くのが一番ですよね。 このページのHTMLをみてみてワード検索で「pass」と検索した答えが出てきました。

f:id:wa1m3im:20190130153326p:plain

Basic 2

f:id:wa1m3im:20190130154116p:plain

こちらは常識が必要らしいのですが、筆者には常識が足りなかったので少し手こずりました。

f:id:wa1m3im:20190131204155p:plain

サム君はパスワードファイルのアップロードを忘れてしまったらしいですね。 なんてお茶目なミスでしょう.... 筆者は何をしていいのかわからなく、開発者ツールを色々いじっていたわけですが適当に何も入れずにsubmitボタンを押したら当たっていました。 パスワードファイルをアップロードしていないならばパスワードがないのは当たり前なのですが深く考えすぎたみたいです。

Basic3

f:id:wa1m3im:20190130155629p:plain

またもやHTMLのみの知識が求められるようです。

f:id:wa1m3im:20190131204336p:plain

サム君はパスワードファイルをアップロードした様なのですが、他にもっと大きな問題がある様です。

f:id:wa1m3im:20190131204606p:plain

パスワードのサブミットボタンのHTMLを見てみると、inputタグのvalueの値がpassword.phpとなっていました。 もしやと思いながらpassword.phpにアクセスしてみると普通にアクセス出来てしまいました。 アクセス制御の不備ですね。

f:id:wa1m3im:20190131204658p:plain

Basic4

f:id:wa1m3im:20190131204811p:plain

この問題はHTMLの知識とemailアドレスが必要なようです。

f:id:wa1m3im:20190131205442p:plain

サム君はパスワードを忘れた時用にメールアドレスにパスワードを送ってくれるような機能を作ったみたいです。 今回もHTMLを見て見てると、サム君の作っていた機能のinputタグのvalueにメールアドレスが生で書いてありました。 これを任意のメールアドレスに書き換える事によってパスワードを盗むことができるみたいですね。

f:id:wa1m3im:20190131210035p:plain

試しに自分のメールアドレスにHTMLを書き換えてsubmitボタンを押したところサム君からメールが届きました。

f:id:wa1m3im:20190131210157p:plain

Basic5

f:id:wa1m3im:20190131205622p:plain

次はHTMLの他にもJSかFFの知識が必要になるみたいです。

f:id:wa1m3im:20190131205712p:plain

しかし、先ほどと同じようにHTMLのinputタグの値を書き換えたら上手く行ってしまいました。 なぜjsの知識を今問われたかは少し謎です。

f:id:wa1m3im:20190131210302p:plain

Basic6

f:id:wa1m3im:20190131210404p:plain

次は暗号に関する知識を必要としているようです。

f:id:wa1m3im:20190131210505p:plain

暗号化した後の文章が乗っていてそれを復号してパスワードを出す形式ですね。

最初に「AAAAAA」を入力して暗号化してました。

f:id:wa1m3im:20190131210605p:plain

結果は「ABCDEF」が返ってきました。 次に「12345」と入力値を与えると

f:id:wa1m3im:20190131210723p:plain

そうすると「13579」という結果が返ってきました。 よってこの暗号はn文字目をn-1個文字ずらすようです。

この法則に従って与えられた文字列を戻していくと正解することが出来ました。

Basic7

f:id:wa1m3im:20190131211007p:plain

次はUNIXのコマンドの知識が必要なようです。 viewと入力するとカレンダーのみが表示されるプログラムのようです。

f:id:wa1m3im:20190131211057p:plain

UNIXのコマンドでは最後に&&を付けることで続けて&&以降に指定したコマンドを実行することが出来るため 入力欄に

&& ls

と入力した結果カレンダーの後に現在のディレクトリの中身をみることが出来ました。 出力された怪しいphpファイルにアクセスするとパスワードを獲得することが出来ました。

f:id:wa1m3im:20190131211253p:plain

Basic8

f:id:wa1m3im:20190131211527p:plain

この問題ではSSIの知識が必要となるようです。 今回SSIという単語を初めて聞いたので少し調べたのですが、HTMLに動きをつけるために使われていたようですね。 SSI injectionもあるようなのでこの記事とは別にまとめて書きたいと思います。

f:id:wa1m3im:20190131211538p:plain

とりあえず筆者の名前を入れてみると自分の名前とその文字数が出力されました。

f:id:wa1m3im:20190131212353p:plain

SSIについての知識が必要とのことなのでSSIの脆弱性について調べているとなんとSSIはOSコマンドも実行することが可能なようなので、SSI injectionについて書いてあった記事のペイロードをそのまま投げて見たところ

<!--#exec cmd="cat /etc/passwd" -->

f:id:wa1m3im:20190131211826p:plain

SSI injectionを使うのはいいけど、コマンドは制限しているようです(そりゃそうだ)

なので今度はこのようなペイロードを投げてみた。

<!--#exec cmd="ls" -->

f:id:wa1m3im:20190131212108p:plain

その結果はこのようにディレクトリの中身をみることが出来た。 しかし、パスワードを書いてあるPHPファイルは見当たりませんでした。

f:id:wa1m3im:20190131212240p:plain

階層が違うと思ったのでコマンドを少し変えて見ました。

<!--#exec cmd="ls .." -->

f:id:wa1m3im:20190131212506p:plain

その結果怪しいファイルを見つけたのでアクセスして見たところ無事パスワードを手に入れることが出来た。

f:id:wa1m3im:20190131212555p:plain

Basic9

f:id:wa1m3im:20190131212903p:plain

この問題はSSIとディレクトリの階層について理解していなければいけないらしい。

f:id:wa1m3im:20190131212911p:plain

問題文が書いてあるところを見ても何も出来そうなことがないのでダメもとで先ほどのBasic8の入力フォームに

<!--#exec cmd="ls ../../9" -->

f:id:wa1m3im:20190131213246p:plain

と入力した結果先Basic9のディレクトリをみることが出来ました。

f:id:wa1m3im:20190131213202p:plain

怪しいPHPファイルがあったのでアクセスしたところパスワードを獲得することが出来ました。

f:id:wa1m3im:20190131213308p:plain

Basic10

f:id:wa1m3im:20190131213528p:plain

なんとかしてJavaScriptを回避すればいいようです。

f:id:wa1m3im:20190131213656p:plain

何も入力せずにsubmitボタンを押すとnot authorizedと表示されました。

f:id:wa1m3im:20190131233413p:plain

開発者ツールを色々試して見てもさっぱりだったのでアプローチの仕方を変えてみるべく「Burp suite」を使って通信を見てみる事にしました。

f:id:wa1m3im:20190131233049p:plain

cookieの値に見慣れない「level10_authorized=no」という値があった。 これの値を「level10_authorized=yes」に変えてリクエストを送ったところレベルクリアをすることが出来た。

Basic11

残念ながらこの問題は筆者の実力では解くことが出来なかった。 Writeupを読んでみたものの自分で実際に手を動かすと途中までは上手くいくのですが

f:id:wa1m3im:20190201133923p:plain

.htaccess」にアクセスしようとしたらNotFoundが出てしまいました。

f:id:wa1m3im:20190201114623p:plain

なのでライトアップどうりには解くことが出来ませんでした。

おわりに

筆者はここ1週間インフルエンザに感染してなかなか記事が書けませんでした。 Basic11が解けなかったのは悔しいです。 今回は初めの記事ということでライトアップの記事を書いたのですが、色々検証の記事をこれから書いていきたいと思っています。

これからもバグを見つけれるようになる為、日々精進していきたいと思います。