All Articles

【Easy/Linux】Teacher Writeup(HackTheBox)

「Hack The Box」という、ペネトレーションテストの学習プラットフォームを利用してセキュリティについて学んでいます。 「Hack The Box」のランクは、本記事執筆時点でProHackerです。

Hack The Box

今回は、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サイトのようなものが稼働していました。

image-20220806185608094

手掛かりがなかったため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の管理サイトと思しきページに接続できました。

image-20220806213248955

ここからエクスプロイトを探そうと思ったのですが、どうやらMoodleのバージョンは教師レベルの権限以上のアカウントでないとみられないようです。

参考:Moodle 3.8 - Unrestricted File Upload - PHP webapps Exploit

image-20220806232551041

ここからしばらく色々なエクスプロイトを試してみたのですが上手く刺さるものがみつかりませんでした。

ここでもう一度探索をやり直していたのですが、ギャラリーのimages/5.pngというファイルがスペースになっていたことが気になりました。

image-20220807110613844

シェルの取得

コンソールの探索や脆弱性の調査など色々やった結果、最終的に以下のエクスプロイトが刺さりました。

参考:Moodle 3.4.1 - Remote Code Execution - PHP webapps Exploit

image-20220807224459952

これでシェルが取れましたが、まだ権限が弱いのでここから探索を進めていきます。

ユーザの取得

とりあえず適当に探索を進めてみたところ、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というユーザが登録されていました。

image-20220808115139623

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というスクリプトがよびだされていることがわかりました。

image-20220808141218071

このスクリプトは以下のようなスクリプトでした。

#!/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を取得できました。