Try Hack Me  Writeup : mKingdom

## 前書き

本記事は、TryHackMeのRoom mKingdomのwriteupです。
投稿時点で最新のRoomで難易度はEasyですが、Linuxの権限に関して改めて学びになりました。
投稿時点で最新の為、「もしかしたらほかにも方法があるのか...」と思っています。
もし他の方法や気づけていない洞察があるなら勉強したいと思っています。

## 偵察
まずはポートスキャンから行います。
85/tcpが開いていることが分かります。

```bash
rustscan -a $TARGET
```

```bash
PORT   STATE SERVICE    REASON
85/tcp open  mit-ml-dev syn-ack
```
サービスの詳細を知る為にnmapによる詳細なスキャンも行います。

```bash
nmap -sV -sC $TARGET -p 85
```

```bash
PORT   STATE SERVICE VERSION
85/tcp open  http    Apache httpd 2.4.7 ((Ubuntu))
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: 0H N0! PWN3D 4G4IN
MAC Address: 02:DF:D6:47:3A:B9 (Unknown)
```
## 初期侵入まで

ポートスキャンの結果から、稼働しているサービスはwebサーバ的なものだと推測できます。Apache httpd 2.4.7に関して軽く調査しましたが、何か使えそうな脆弱性は存在しなさそうだったのでwebサイト(hxxp[://]mkingdom[.]thm:85/) にアクセスして詳細を見ていきます。

![スクリーンショット 2024-06-15 224811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816892/778db66e-0d4a-b146-0b06-f4f362e92147.png)

サイトにはボタンなどがなく、ソースコードを確認しましたが、特に興味深いものはありませんでした。
そこでgobusterでディレクトリ探索を行います。

```bash
gobuster dir -u http://mkingdom.thm:85/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 
```
```bash
/app (Status: 301)
```
/appが見つかりましたのでアクセスしてみます。

すると、ボタンが一つだけのページに飛びますのでボタンをクリックしました。
ソースコードからも分かりますが、ボタンで`/app/castle/`に飛ぶようになっていました。


![スクリーンショット 2024-06-15 225525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816892/f1539ce0-2c25-ae5e-cb4d-2120ccdb7905.png)

ここで時間をかけて再度ディレクトリの列挙を試したり、BlogやContactページにアクセスしました。
CMSとして`concrete5`というものを使用していそうなことが分かり、いくつかの既知の脆弱性はあるものの、私が見た限り、初期侵入につながりそうなものはありませんでした。

少し調査を継続すると、画面下部のボタンかログインページへアクセスできることを発見しました。
一度試しで、`admin:password`といういかにも脆弱な認証情報でログインを試すとなんとアクセスできてしまいました。
（たまたま一発目で当たったのか、またはなんでも通るような設計にしていたのか...)


![スクリーンショット 2024-06-16 094631.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3816892/8bf889a6-eaf8-51da-efeb-ffac5b532bff.png)


とにかく管理者ページに入れました。
少し調査すると、`Files`からファイルがアップロードできそうだったのでphpリバースシェルを試しましたが、拡張子の制限があってうまくいきません。ほかの機能もみていくと、`System & Settings>>Allowed File Types`　から受け入れる拡張子が設定できることが分かります。ここに`php`を追加し、再度phpのリバースシェルをアップロードすると見事うまくいきました！

## 権限昇格①
初期侵入が完了したのでここからはフラグの取得と権限昇格を目指します。
ここからは大きく2通りのルートがあると思います。
（①の方が少しショートカットできる程度ですが...)

### ①　catを使用してダイレクトにmario
現状は、`www-data`としてリバースシェルが取得できています。
SUIDが設定されているファイルを確認すると、`toad`というユーザが所有者の`cat`にSUIDが設定されていることが分かります。
調査した限り、SUIDが設定されている`cat`からすぐさま権限昇格につながるわけではなさそうです（sshの秘密鍵を覗かれてしまう可能性などは考えられますが...) 。ただし、`/home/toad`ディレクトリにはアクセスできませんが、ホームディレクトリ配下に一般的に存在するファイルを指定して閲覧することは可能です。
そこで`/home/toad/.bashrc`を閲覧すると、`export PWD_token='_REDACTED_'`という環境変数が見つかります。`base64`でエンコードされていそうなのでデコードすると、`_REDACTED_`が得られます。
現状ユーザは、`toad`と`mario`が存在しますので、上記の文字列がパスワードかどうか試します。
`su toad`ではうまくいきませんが、`su mario`だとうまくいきます。

### ②　mysqlで一旦toadを経由する方法
`linpeas`などを利用して権限昇格への手がかりを探ると、`mysql`にrootとしてパスワードなしで接続可能なことが分かります。mysql内を捜索すると、`toad`のパスワードハッシュ`*67D97D25E90A4914F673B30_REDACTED_ `が得られます。`johntheripper`などのツールでオフラインクラックすると`toad`の認証情報が得られます。`toad`は大きな権限を与えられていませんが、環境変数や①のように`.bashrc`ファイルを確認することで`mario`の認証情報が得られます。

## 権限昇格②
marioのホームディレクトリ下に最初のフラグがあります。
※最初のフラグは読み取り権限はあるはずですが`cat`を使用すると「権限がない」と言われます。方法はいろいろありますが、例えば`head`を使用すると見れます。なぜそうなるかは最後に深堀します。


`thm{030a76_REDACTED_}`



`mario`は、sudo権限で`id`バイナリが実行できます。ここから何かできるのか暫く調べましたが有益な情報が得られませんでした。（環境変数のPATHを書き換えるなどを考えましたが、絶対パス指定なので恐らく無理かな...)

行き詰ったため、あらためて権限昇格につながりそうなものを調査しました。`pspy`を使用すると興味深いプロセスを発見しました。

```bash
2024/06/15 04:59:01 CMD: UID=0     PID=2652   | curl mkingdom.thm:85/app/castle/application/counter.sh 

2024/06/15 05:00:01 CMD: UID=0     PID=2662   | /bin/sh -c curl mkingdom.thm:85/app/castle/application/counter.sh | bash >> /var/log/up.log  
```

`mkingdom.thm:85/app/castle/application/counter.sh` を取得し、実行し、その出力を`/var/log/up.log`に書き込んでいるようです。`UID=0`の為、`root`として実行されていることも分かります。

実行されるシェルスクリプトを書き換える、あるいは"誤認"させることで権限昇格することを考えます。`counter.sh`を確認しましたが、書き込み権限がなく書き換えることは難しそうです。しかし、`/etc/hosts`ファイルに書き込み権限がありましたので、`mkingdom.thm`に対応するIPアドレスを攻撃者のものに書き換える方法を試しました。攻撃者マシン側でポート85番で`/app/castle/application/counter.sh`を用意します。`counter.sh`にはリバースシェルを実行させるためのスクリプトを書き込み、、リバースシェルをリッスン。しばらくすると、リバースシェルが確立され、`root`権限をとることができます。

`thm{e8b2f52d8_REDACTED_}`

## 深堀
#### ログインがあっさりできた原因
何故あっさりログインできたのか分からなかったため、疑問を解消するためターゲット内のソースコードを漁ってみましたが処理の部分は面倒くさそうだったので断念しました。
（mysqlにハッシュ処理された`admin`のパスワードがあり、クラックすると`password`になっていたのでおそらくここを参照してログイン処理していそうです。Easyということもあるので脆弱な設定になっていて今回は偶然一発目でパスワードを当ててしまったのかな？...)

#### catでuser.txtが閲覧できない原因

ファイル自体の権限は下記のように読み取り権限が設定されています。本来なら`cat`で閲覧できるはずです。
```bash
ls -l user.txt
-rw-r--r-- 1 root root 38 Nov 27  2023 user.txt
```
しかし、下記のように読み取りできません...
```bash
cat user.txt
cat: user.txt: Permission denied
```

原因はおそらく`cat`の権限だと思います。
`cat`の所有者は`toad`であり、`SUID`が設定されています。
```bash
ls -l /bin/cat
-rwsr-xr-x 1 toad root 47904 Mar 10  2016 /bin/cat
```
そしてmarioのホームディレクトリに対するアクセス権が`toad`にはありません。
```bash
ls -ld ~
drwx------ 15 mario mario 4096 Jun 15 21:14 /home/mario
```
したがって、
SUIDによりcatがtoadとして実行される
➡toadは/home/mario/に対する権限がない
➡/home/mario下のuser.txtが見れない
という理屈になると思われます。

それを踏まえて考えられる解決方法は、

・SUIDが設定されていないheadなどで見る
・user.txtを/tmp/にコピーしてcatで見る
・catを複製して、複製したcatでuser.txtを見る

などなど色々な方法があると思います。