はじめに
これは、Hack The Box二十五番勝負 Advent Calendar 2020 10日目の記事です。
サマリ
- 対戦相手:Tabby
- 対戦日時:2020年12月12日 18:00 - 23:59
- 結果:敗北
- 主な敗因:
- Tomcatについて無知であったがために、LFIを有効に使えなかった
- 通算成績:10戦1勝9敗
対戦相手
今回の対戦相手は「Tabby」です。 www.hackthebox.eu
Walkthrough
※以下、解法に関するネタバレです。
自分でやったこと
情報収集
- nmap
- Dirbuster
- ディレクトリ列挙をSmallサイズの辞書で実行したが、特段ヒントとなるようなものは見つからなかった。
侵入
- HTTP(80)
- トップページにリンクが貼られているニュースリリースのURLが
/news.php?file=statement
となっており、LFIを疑った。 - パラメータを
../../../etc/passwd
とすると、案の定/etc/passwd
の中身が表示された。一般ユーザーにash
がいることを確認した。
- トップページにリンクが貼られているニュースリリースのURLが
- Hydra
- ユーザー名を
ash
に固定し、rockyou.txt
でTomcatのベーシック認証に対して辞書攻撃を実行したが、成功しなかった。
- ユーザー名を
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
してしまった)。 fcrackzip
とrockyou.txt
を使って辞書攻撃すると、パスワードが判明した。- このZIPのパスワードこそが
ash
ユーザーのパスワードであり、リモート側でsu ash
できた。ここで own user。
権限昇格(root)
uname -a
するとlxd
というグループに所属している。どうやらlxd
とlxc
というコマンドでコンテナをデプロイできるみたい。- 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など、技術的な学びの多い箱でした。ちょっと遅れをとっているので最終日までには追いつきたいです。