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

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

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

f:id:befs_anne:20201214003747p:plain

はじめに

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

adventar.org

サマリ

  • 対戦相手:Tabby
  • 対戦日時:2020年12月12日 18:00 - 23:59
  • 結果:敗北
  • 主な敗因:
    • Tomcatについて無知であったがために、LFIを有効に使えなかった
  • 通算成績:10戦1勝9敗

対戦相手

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

Walkthrough

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

自分でやったこと

情報収集

  • nmap
    • 以下のポートが開いていることを確認した。
      • SSH(22)
        • 公開鍵認証でのみログイン可能。
      • HTTP(80)
      • HTTP(8080)
        • ブラウザでアクセスすると、Tomcatのデフォルトページが表示された。
        • /manager はベーシック認証がかけられていた。
  • Dirbuster
    • ディレクトリ列挙をSmallサイズの辞書で実行したが、特段ヒントとなるようなものは見つからなかった。

侵入

  • HTTP(80)
    • トップページにリンクが貼られているニュースリリースのURLが /news.php?file=statement となっており、LFIを疑った。
    • パラメータを ../../../etc/passwd とすると、案の定 /etc/passwd の中身が表示された。一般ユーザーに ash がいることを確認した。
  • Hydra
    • ユーザー名を ash に固定し、 rockyou.txtTomcatのベーシック認証に対して辞書攻撃を実行したが、成功しなかった。

Writeup確認後

Writeupは公式のものを確認しました。

侵入

  • LFIを使って、Tomcatのユーザー定義ファイルである tomcat-users.xml を見る。パスは tomcat ubuntu installation directory などとググって確認する。
  • Tomcat/manager 配下のディレクトリをDirbusterなどで列挙すると、TomcatをHTTPで操作できる /text エンドポイントが見つかる。
  • ディレクトリ列挙もしくはググってサービスデプロイ用のエンドポイント /deploy の使用方法を確認し、Javaで書かれたウェブシェル(Githubで公開されている)をサービスとしてデプロイする(Javaでの開発をしたことがないので、一度Zipにしたり、jar コマンドでマニフェストを追加したり?といったお作法ははじめてだった。デプロイ方法の件も含めて後日要調査)。
  • ウェブシェル経由で nc/dev/tcp を使ったリバースシェルを試行するも失敗。- Writeupに従って、ローカルでなんやよう分からんワンライナーを書き下したテキストファイルを作り、リモートから wget して(chmod +xして)実行すると、tomcat ユーザーでのリバースシェルが確立した。何が違う……?

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

  • /var/www/html/files 配下にバックアップと思しきパスワード付きZIPファイルを発見した。
  • (Writeupをちゃんと読んでいなかったので)この中にある raedme.md あたりに何か書いてあるんだろうと思い、 pkcrack (およびZIPファイルに含まれており、かつ実ファイルが手に入る logo.jpgファイル)を使った既知平文攻撃でパスワードを解除するも、中身は特に何もなかった。
  • Writeupを読むと、どうやら重要なのはZIPファイルの方だったらしい。リモートからローカルへのファイルの送信方法として、ZIPファイルのbase64ハッシュを作って、それをコピーしてローカル側でデハッシュするという手法がとられていた。こんな方法があるのか……(結局リモート側でウェブサーバーを作って、ローカルから wget してしまった)。
  • fcrackziprockyou.txt を使って辞書攻撃すると、パスワードが判明した。
  • このZIPのパスワードこそが ash ユーザーのパスワードであり、リモート側で su ash できた。ここで own user。

権限昇格(root)

  • uname -a すると lxd というグループに所属している。どうやら lxdlxc というコマンドでコンテナをデプロイできるみたい。
  • Writeupいわく、「root権限を持ったコンテナに、ホストOSのファイルシステムを丸ごとマウントして起動する」ということらしい。そんなことできるんだな……。
  • lxd用のAlpine Linuxイメージを以下のリポジトリを利用して作成し、リモートへ送信する。
  • 以下のコマンドを実行してown root。
### デーモンの起動?
### ウィザード形式で、ストレージプールを作っておく以外は全部noでよさそう(作っておかないとこのあとコンテナが作れない
$ lxd init

### イメージのインポート
$ lxc image import ./alpine-v3.12-x86_64-20201106_2000.tar.gz --alias alpine

### 管理者権限を付与(なぜ一般ユーザーでこれが可能なのか……?
$ lxc init alpine mycontainer -c security.privileged=true

### ホストOSのファイルシステムを /mnt/root にマウントする
$ lxc config device add mycontainer mydevice disk source=/ path=/mnt/root recursive=true

### コンテナの起動
$ lxc start mycontainer

KPT(Keep-Problem-Try)

Keep

  • LFIまでさっと辿り着けた。

Problem

  • Tomcatのデフォルトパス、たぶん全く気づかなかったわけではなくて調べるのが面倒だったんだと思う。

Try

  • 時間内は横着せず、調べる(時間になったら答えを見ればいい)。

さいごに

TomcatやLXDなど、技術的な学びの多い箱でした。ちょっと遅れをとっているので最終日までには追いつきたいです。

参考

qiita.com