「Hack The Box」という、ペネトレーションテストの学習プラットフォームを利用してセキュリティについて学んでいます。 「Hack The Box」のランクは、本記事執筆時点でProHackerです。
今回は、HackTheBoxのリタイアマシン「Teacher」のWriteUpです。
本記事について
本記事の内容は社会秩序に反する行為を推奨することを目的としたものではございません。
自身の所有する環境、もしくは許可された環境以外への攻撃の試行は、「不正アクセス行為の禁止等に関する法律(不正アクセス禁止法)」に違反する可能性があること、予めご留意ください。
またすべての発言は所属団体ではなく個人に帰属します。
もくじ
探索
いつも通りポートスキャンから始めていきます。
$ sudo sed -i 's/^[0-9].*$RHOST/10.10.10.153 $RHOST/g' /etc/hosts
$ nmap -sV -sC -Pn -T4 $RHOST| tee nmap1.txt
Nmap scan report for $RHOST (10.10.10.153)
Host is up.
All 1000 scanned ports on $RHOST (10.10.10.153) are in ignored states.
Not shown: 1000 filtered tcp ports (no-response)
$ nmap -p- $RHOST -Pn -sC -sV -A | tee nmap_max.txt
ファストスキャンの対象は全部フィルタされてしまっているようでした。
これだとポートが開いてるかの判断もつかないですね。
すべてのポートに対するスキャンも試してみましたが、残念ながらフィルタされてしまっているようでした。
完全に行き詰ったかと思ったものの、実は凡ミスで、そもそもVPNに接続できていませんでした。
VPNに接続した結果、以下のポートが空いていることがわかりました。
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.25 ((Debian))
|_http-title: Blackhat highschool
|_http-server-header: Apache/2.4.25 (Debian)
1069/tcp filtered cognex-insight
1084/tcp filtered ansoft-lm-2
1085/tcp filtered webobjects
1434/tcp filtered ms-sql-m
2222/tcp filtered EtherNetIP-1
3766/tcp filtered sitewatch-s
5544/tcp filtered unknown
5815/tcp filtered unknown
6004/tcp filtered X11:4
7402/tcp filtered rtps-dd-mt
8087/tcp filtered simplifymedia
8181/tcp filtered intermapper
9071/tcp filtered unknown
9099/tcp filtered unknown
9415/tcp filtered unknown
9929/tcp filtered nping-echo
15004/tcp filtered unknown
32776/tcp filtered sometimes-rpc15
32782/tcp filtered unknown
49167/tcp filtered unknown
65000/tcp filtered unknown
ひとまず空いている80番ポートに接続して探索を進めてみます。
80番ポートには、なんだかよくわからないCMSサイトのようなものが稼働していました。
手掛かりがなかったためferoxbusterで探索をかけたところ、moodleのパスにアクセスしたときにリダイレクトが発生するようでした。
$ feroxbuster -u http://$RHOST/ -x php -w /usr/share/wordlists/raft-medium-directories.txt --no-recursion | tee feroxbuster.txt
301 GET 9l 28w 317c http://$RHOST/moodle => http://$RHOST/moodle/
このアドレスをブラウザで開くとhttp://teacher.htb/moodle/
にリダイレクトされたため、hostsを書き換えてからアクセスを行いました。
これによってMoodleの管理サイトと思しきページに接続できました。
ここからエクスプロイトを探そうと思ったのですが、どうやらMoodleのバージョンは教師レベルの権限以上のアカウントでないとみられないようです。
参考:Moodle 3.8 - Unrestricted File Upload - PHP webapps Exploit
ここからしばらく色々なエクスプロイトを試してみたのですが上手く刺さるものがみつかりませんでした。
ここでもう一度探索をやり直していたのですが、ギャラリーのimages/5.png
というファイルがスペースになっていたことが気になりました。
シェルの取得
コンソールの探索や脆弱性の調査など色々やった結果、最終的に以下のエクスプロイトが刺さりました。
参考:Moodle 3.4.1 - Remote Code Execution - PHP webapps Exploit
これでシェルが取れましたが、まだ権限が弱いのでここから探索を進めていきます。
ユーザの取得
とりあえず適当に探索を進めてみたところ、config.phpというファイルの中にDBのクレデンシャルが埋め込まれているのを見つけました。
そこで、以下のコマンドでDBのダンプを抽出しました。
$ mysqldump -u 'root' -p -h 'localhost' 'moodle' > /tmp/output.txt
DBの中身を一通り見てみたところ、クレデンシャルを窃取したGiovanniとは別にAdminというユーザが存在しており、パスワードハッシュがDB内に記録されていることを確認しました。
Admin $2y$10$7VPsdU9/9y2J4Mynlt6vM.a4coqHRXsNTOq/1aA6wCWTsF2wtrDO2
giovanni $2y$10$38V6kI7LNudORa7lBAT0q.vsQsv4PemY7rf/M1Zkj/i1VqLO0FSYO
Adminのハッシュを解析しようとしばらく頑張っていたのですが、他のユーザをよく見るとGiovannibakというユーザが登録されていました。
Giovannibakのハッシュは一瞬で解析できたので、こちらのパスワードを使用したところUserが取得できました。
権限昇格
ユーザディレクトリの中にはanswersAlgebraがいくつか含まれているのですが、バックアップの中に入っていたディレクトリの所有者はgiovanniであったのに対して、ディレクトリに配置されていたフォルダの所有者はrootになっていました。
giovanni@teacher:/tmp/courses/algebra$ strings answersAlgebra Point a = 3 Point b = 5 Point c = ? 3 * 3 = 9 5 * 5 = 25 ---+ v34 = 5,83 Point c = 5,83 score: 1/2
もう一点、バックアップのファイルだけ所有者がrootであり、頻繁に更新時間が変わっていることがわかりました。
つまり、定期的にrootがcousesのフォルダをバックアップとして圧縮する操作を実施している可能性がありますので、そこが権限昇格の起点になりそうです。
そこでpspyを用いてタスクを確認してみたところ、backup.shというスクリプトがよびだされていることがわかりました。
このスクリプトは以下のようなスクリプトでした。
#!/bin/bash
cd /home/giovanni/work;
tar -czvf tmp/backup_courses.tar.gz courses/*;
cd tmp;
tar -xf backup_courses.tar.gz;
chmod 777 * -R;
注目したのは、tmpディレクトリに移動した後にchmod 777 * -R
で再帰的に権限を書き換えできるところです。
つまり、tmpディレクトリを削除して任意のシンボリックリンクを設定することで、任意のディレクトリ内のファイルすべてに777の権限をセットできそうです。
どこの権限を書き換えてもよさそうですが、rootで実行されているbackup.sh
からシェルを取りたかったのでln -s /usr/bin tmp
のようにシンボリックリンクをセットしました。
これでbackup.sh
を書き換えてrootを取得できました。