
Snipe-IT向けPoCエクスプロイト(CVE-2025-59712およびCVE-2025-59713)
この PoC は、CVE-2025-59712 (User-Agent ヘッダーの XSS) と CVE-2025-59713 (安全でないデシリアライゼーション) を悪用する自動化スクリプトを提供します。
これら 2 つの脆弱性は、Snipe-IT ソフトウェアの脆弱性調査中に Synacktiv によって発見されました。Snipe-IT は Laravel ベースのオープンソース資産管理システムであり、組織が物理資産およびデジタル資産を追跡・管理するために設計されています。
技術的な解説は、Synacktiv の Web サイト の専用セキュリティアドバイザリで入手できます。
このスクリプトは、悪用モードに対応する 3 つのサブコマンド xss、rce、fullchain を提供します。
このサブコマンドは CVE-2025-59712 を悪用します。この脆弱性により、低権限ユーザーが /reports/activity ルートを呼び出したときにレンダリングされる HTML ページに任意の JavaScript を注入できます。これは管理者ユーザー、またはレポートに対する明示的な表示権限を持つユーザーによってのみ実行可能です。注入が可能なのは、ユーザーがプロフィール情報を更新する際の User-Agent フィールドのサニタイズが不適切であるためです。
そのために、最初に低権限ユーザーとしてログインし、--javascript フラグで指定されたファイル内の JavaScript コードを注入します。
$ python3 exploit.py xss --help
Usage: exploit.py xss [OPTIONS]
Execute XSS attack only with custom JavaScript payload
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --login -l TEXT Low-privileged username [required] │
│ * --password -p TEXT Low-privileged password [required] │
│ * --new-name -n TEXT New name for low-privileged user [required] │
│ * --javascript -js TEXT Path to custom JavaScript file [required] │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
[!IMPORTANT]
セキュリティ調査中、テストはデフォルトで悪意のある JavaScript が注入されるUser-Agentフィールドを表示するバージョンの Snipe-IT で実施されました。コミット 10e5d88 以降、アクションログテーブルのレンダリング時にUser-Agentプロパティはデフォルトで表示されません。そのため、XSS をトリガーする管理者は、このコミットより後の Snipe-IT バージョンでは、表示オプションでUser-Agentボックスにチェックを入れる必要があります。
このサブコマンドは CVE-2025-59713 を悪用します。この脆弱性により、管理者またはスーパー管理者ユーザーの認証情報が既知の場合にリモートコード実行が可能になります。そのために、以下の手順が実行されます。
db-dumps/mysql-snipeit.sql ファイルへの追加 SQL 文が含まれ、新しいカスタムフィールドを作成し、リストア時に Laravel ポップチェーンを含む JSON オブジェクトで最後のアクションログを編集します。[!TIP] デフォルトでは、Snipe-IT はバックアップに
.envファイルを含めます。スクリプトがそれを検出すると、APP_KEY値が表示され、.envファイルは./outputディレクトリに保存されます(そのファイルのカスタム場所は--output-dirで指定可能)。
[!CAUTION] バックアップのリストアは、インスタンスに接続されているすべてのユーザーを切断します。
/api/v1/reports/activity ルートが呼び出され、デシリアライゼーションがトリガーされ、Laravel ポップチェーンが実行されます。$ python3 exploit.py rce --help
Usage: exploit.py rce [OPTIONS]
Execute RCE attack only (requires existing admin account)
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --admin-user -au TEXT Admin username [required] │
│ * --admin-pass -ap TEXT Admin password [required] │
│ --output-dir -od PATH Output dir for .env file [default: /home/ninja/Téléchargements/snipe-it-advisory/exploit/output] │
│ --shell-ip -si TEXT Reverse shell IP address │
│ --shell-port -sp INTEGER Reverse shell port │
│ --command -c TEXT Custom command (overrides reverse shell) │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
fullchain サブコマンドは、XSS と RCE の両方の脆弱性を連鎖させることを目的としています。これは、低権限ユーザーにしかアクセスできない状況でリモートコード実行を達成したい場合に対応します。これは、/reports/activity ページにアクセスするユーザーが管理者またはスーパー管理者である場合にのみ機能します。実際、これらのロールのみがバックアップを作成および復元する権限を持っており、データベースを汚染し、後で Laravel ポップチェーンをトリガーするために必要です。
そのために、スクリプトは以下のことを行います:
--command フラグでカスタマイズ可能)。User-Agent フィールドに <scr> タグを注入して、被害者のブラウザに悪意のある JavaScript テンプレートをロードさせます。/reports/activity ルートにアクセスすると、XSS がトリガーされ、悪意のある JavaScript が被害者のブラウザでロード・実行されます。その後、RCE モードで実行される手順と同じ手順が JavaScript で実行されます。このモードは、いくつかの追加の JavaScript ライブラリを利用しています。すべてのクレジットは各作者に帰属します:
$ python3 exploit.py fullchain --help
Usage: exploit.py fullchain [OPTIONS]
Execute full attack chain: XSS -> Backup manipulation -> RCE
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --url -u TEXT Target Snipe-IT URL [required] │
│ * --login -l TEXT Low-privileged user's username [required] │
│ * --password -p TEXT Low-privileged user's password [required] │
│ * --new-name -n TEXT New name for low-privileged user [required] │
│ --ip -i TEXT HTTP server IP address (default: auto-detect) │
│ * --port -P INTEGER HTTP server port [required] │
│ --admin-user -au TEXT Admin username to create [default: admin_rce] │
│ --admin-pass -ap TEXT Admin password to create [default: password123] │
│ --shell-ip -si TEXT Reverse shell IP address │
│ --shell-port -sp INTEGER Reverse shell port │
│ --command -c TEXT Custom command (overrides reverse shell) │
│ --proxy -x TEXT HTTP proxy (http://ip:port) │
│ --verbose -v [quiet|normal|verbose] Logging verbosity [default: normal] │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
このスクリプトを実行するには、以下のコマンドを実行してください:
$ git clone https://github.com/synacktiv/CVE-2025-59712_CVE-2025-59713
$ cd CVE-2025-59712_CVE-2025-59713
$ python3 -m venv .venv && source .venv/bin/activate
$ python3 -m pip install -r requirements.txt
スクリプトを試し、脆弱性の悪用を再現するための Dockerfile も提供されています。これは脆弱なバージョンの Snipe-IT をプルし、php artisan でデータベースを設定し、2 人のユーザーをセットアップします:
admin、デフォルトパスワード AdminPassword123!lowpriv、デフォルトパスワード LowPrivUser123!コンテナを実行する前に、.env ファイルと snipe-it.conf ファイルを Snipe-IT インスタンスの URL で更新する必要があります:
$ sed -i 's|^APP_URL=.*|APP_URL=http://<IP>:<PORT>|' .env
$ sed -i 's|\(ServerName\s*\).*|\1http://<IP>:<PORT>|' snipe-it.conf
コンテナは次のように実行できます:
$ docker build . -t "snipe-it-cve"
$ docker run -p 80:80 --name "snipe-it-debian" snipe-it-cve:latest