shinobe179の日記

@shinobe179 の技術メモ・やらかし録

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

f:id:befs_anne:20201209012745p:plain

はじめに

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

adventar.org

サマリ

  • 対戦相手:Blocky
  • 対戦日時:2020年12月8日 20:50 - 23:59
  • 結果:敗北
  • 主な敗因:
    • 不自然だと感じたことの確認を放置した
    • MySQLの出力結果をちゃんと検証しなかった
  • 通算成績:7戦1勝6敗

対戦相手

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

Walkthrough

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

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • HTTP(80)
  • Dirbuster
    • midiumサイズの辞書を実行し、 /phpmyadmin (403)や /Moodle (200)を発見した。
  • Firefox
    • "Giovanni" という教師が作成したコースがあることを確認した。
    • /gallery.html で画像が1つ欠けていることを確認した。
      • /images の当該ファイルを確認すると、.jpg として読み込めないファイルだった。
      • 当該ファイルを wget して file コマンドした結果テキストファイルであることが判明(これをやったのが23:00ぐらい)。
      • 内容は「Giovanniがパスワードの最後の1文字を忘れた、覚えているのはTh4C00lTheacha までだから、あとはなんとかして欲しい」とのこと。

侵入

  • Hydra
    • giovanniGiovanni を含むユーザーリストと rockyou.txt-u オプションでパスワードスプレー方式(?)によるブルートフォースを試行していた。
    • 画像ファイルに見せかけたテキストファイルの件を受けて、Pythonstring.printable を使用してパスワードリストを作って実行した。
    • しかし、Hydraの出力では全て試行失敗。おそらくコマンドのどこかが誤っていた。
      • ログインボタンをクリックすると一度303リダイレクトされるような動きをしていたので、ここが考慮されていなかった可能性が高い。
  • Pythonスクリプト
    • Pythonでログイン試行スクリプトを作成しレスポンスサイズを確認しつつ、Wiresharkでパケットをチェックした。
    • たまたま成功時らしきレスポンスを発見した。パスワードが Th4C00lTheacha# であることが分かった。
  • エクスプロイト
    • searchsploitMoodleのRCEエクスプロイトを発見し実行。 www-data ユーザーでのリバースシェルを確立した。

このあたりでタイムアップしました。以降は時間切れ後(だがWriteupは見ていない)のトライです。

権限昇格(一般ユーザー)

  • ss -atn | grep LISTEN で、MySQLが動作していることを確認した。
  • /etc/passwd の内容から、 giovanni というユーザーが存在することを確認した。
  • /var/www/html/moodle/config.php 内に、MySQLのクレデンシャルがあることを確認した。
  • MySQL
    • SELECT * FROM moodle.mdl_user など確認するも特段の情報は得られず。
  • LinPEAS
    • wget でLinPEASを持ち込んで実行するも、特段の情報は得られず。

その他、PHPMyAdmin周りを確認するもめぼしいものは見つからず、ギブアップしました。

残りの手順

Writeupは公式のものを参考にしています。

権限昇格(一般ユーザー)

  • MySQL
    • mdl_user テーブルの内容をよく確認すると、 Giovannibak ユーザーのパスワードのみMD5だった。
  • デハッシュ(と言うとおこられることがあるらしいが)
    • hashcatjohn が正しく使えなかったので)外部のMD5レインボーテーブルで確認したところ、平文は expelled であるようだった。
  • giovanni での権限昇格
    • su giovanni してパスワードは expelled でログイン試行したところ成功した。own user。

権限昇格(rootユーザー)

  • giovanni のホームディレクトリ内にある work/tmp にバックアップを作成するスクリプト/usr/bin/backup.shroot ユーザーのcronジョブで作成されているらしい(Writeup中には具体的な確認方法について記載がなかったが、 pyps64 などで分かりそうだ)。
  • /usr/bin/backup.sh の中身を見ると、バックアップ元は courses/* と指定されているため、 courses という名前の /root へのシンボリックリンクファイルを作ってしまえば、/root/* がバックアップされる ということになる(悪いことを考える人がいるものだ、と思った)。
  • この方法で root.txt が生成され、own root。

KPT(Keep-Problem-Try)

Keep

Problem

  • 画像の欠けについて、もっと早く確認するべきだった。
  • MySQLの出力を見逃した。

Try

  • 気づいた不自然な点はあらゆる確認をおこなう。具体的には、表示できない画像ファイルはその形式を確認する。
  • MySQLのテーブルは、めぼしいフィールドに絞って出力する( SELECT * としていたために見逃したふしがある)。