ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

【Hack The Box二十五番勝負 Advent Calendar 2020】9日目 vs Help(●)

f:id:befs_anne:20201212183558p:plain

はじめに

これは、Hack The Box二十五番勝負 Advent Calendar 2020 9日目の記事です。

adventar.org

サマリ

  • 対戦相手:Help
  • 対戦日時:2020年12月10日 18:00 - 23:59
  • 結果:敗北
  • 主な敗因:
    • GraphQLのエッセンスを時間中に習得できなかった
    • エクスプロイトの中身を理解できなかった
  • 通算成績:9戦1勝8敗

対戦相手

今回の対戦相手は「Help」です。 www.hackthebox.eu

Walkthrough

※以下、解法に関するネタバレです。

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • SSH(22)
      • HTTP(80)
        • Apache、利用できそうな脆弱性は特になし。
        • ブラウザで閲覧するとApacheのデフォルトページが表示される。
      • HTTP(3000)
        • ブラウザでアクセスするとJSONが返ってきた。この時点で「GraphQLというやつでは」と思ったが、クエリの書き方も分からず、なすすべなし。早くも敗北を悟る。
  • Dirbuster
    • ディレクトリ列挙をSmallサイズの辞書で実行し、/support/ を発見した。
    • /support/ 配下はHelpDeskZというオープンソースの問い合わせ管理システム的なソフトウェアだった。
    • ポート3000に対しても実行したが、何も見つからず。

侵入

  • HelpDeskZ
    • searchsploit で調べるとエクスプロイトが2件。現時点でクレデンシャルは判明していないので、クレデンシャルが不要な Arbitrary File Upload (チケットに添付したファイルをログインせずに閲覧・実行できるという脆弱性。チケットを切る行為はログインしていなくても可能)を実行しようとしたが、そもそもPHPスクリプトファイルのアップロードが禁止されていたため実施する意味がなく、断念。

Writeupの冒頭を確認 - 1

やはりポート3000はGraphQLでした。しかし /graphql に対してクエリを投げなければならず、これは事前のディレクトリ列挙で見つかりませんでした。パラメータのキーも含め、常識なのか、guessingなのか……。とりあえず、以下のリクエストを投げることでユーザー情報が1件返ってきました。

curl -s -G http://10.10.10.121:3000/graphql --data-urlencode 'query={user{username, password}}'

memo: -G-XGET の違い

これらは同じ挙動をするのだと思っていましたが、どうやら以下の違いがあるみたいです。 man の記述と、WireSharkで実際に両パターンのパケットをみて確認しました。

  • -G: --data-urlencode で指定したデータを、 クエリストリングとして 送信する。
  • -XGET: --data-urlencode で指定したデータを、 ボディとして(ポストパラメータのように) 送信する。

侵入

  • GraphQLで手に入ったクレデンシャルで、HelpDeskZにログインした。
  • searchsploit で出てきたもうひとつのエクスプロイト((Authenticated) SQL Injection / Unauthorized File Download)を実行するも発動せず。

Writeupの冒頭を確認 - 2

Writeupでも同じ脆弱性を利用していて、エクスプロイトのコードに誤りがあったようです。微調整を重ねてようやく成功。admin という管理者名とそのパスワードハッシュを入手し、ハッシュはCrackStationで平文を見つけました。

これまで入手したクレデンシャルを組み合わせてSSHログインを試みましたがどれも失敗。再びWriteupを確認すると、ユーザー名が help ……。サーバー名がヒントになっていることはあれど、こういうケースもあるんですね。この時点でown userです。

memo: ブラインドSQLインジェクション

SQLの結果をそのまま受け取れないまでも、アプリケーションの挙動からクエリ結果の判定ができる場合(HelpDeskZの場合、クエリの結果がtrueの場合200が、falseの場合404が返ってくる)、それを利用してDB内の情報を知ることができます。

権限昇格

  • /home/help/.bash_history にrootのパスワードらしき痕跡があったが、昇格できず。
  • linpeas.sh をローカルから持ってきて実行すると、 /usr/lib/s-nail-s-nail-privsep という見慣れないファイルがリストアップされていることを確認した。
  • searchsploit で調べると、1件だけLCEのエクスプロイトを発見した。
  • 上記をローカルから持ってきて実行するとrootに権限昇格できた。own root。

KPT(Keep-Problem-Try)

Keep

  • 列挙がうまくいってよかった。列挙モチベーションが維持できた。
  • ブラインドSQLインジェクションの仕組みが理解できてよかった。
  • curl-G-XGET の違いが分かってよかった(Keepは果たしてよかったことを書くんだったか)。

Problem

  • 時間内に新技術を要領良く学ぶことができなかった。
    • 「GraphQLを知らない」ことは大した問題ではなくて、戦闘中に見知った技術を短時間でラーニングしなければならない。
    • とはいえ、それが苦手だからこそ、事前に数こなしてそういうシチュエーションを減らそうとしている、というのもある。
  • サーバー名を甘くみていた。最大のヒント。

Try

  • 知らない技術に出くわしたら、Qiitaでもなんでもいいからざっと読んで動かしてみる。
  • サーバー名 = ユーザー名の可能性は常にあるものと心得る。