
許可されたラボ環境で、ZendToの未認証ClamAV RCEとroot権限昇格を再現する。固定されたDockerターゲット、フェイルクローズ検証、nonceにバインドされた出力、およびクリーンアップを備える。
このディレクトリは、アカウント不要の ZendTo→ClamAV コード実行チェーンと、その別系統のデフォルトプロファイル Smarty/root-cron 継続に対する、スタンドアロンかつ認可済みラボ向けの再現バンドルです。含まれるもの:
初期 PoC は、標準の clamav サービスアカウントとして呼び出し元が選択したコマンドを実行します。オプションの変種は、そのアカウント不要の足掛かりを継続し、root として呼び出し元が選択したコマンドを実行します。いずれもデフォルトで id を実行し、リテラルな /root/flag パスを拒否し、ノンスバインドの出力を HTTPS で返します。
脆弱なグループ、ディレクトリ、Smarty、root-cron の各関連は、ZendTo Debian パッケージ/インストーラのデフォルトです。ただし root への到達可能性は環境条件に依存します。この正確なポジティブフィクスチャは、ext4 ベースの /var/zendto ボリューム、機能する PHP CLI の FFI/POSIX/exec、および非制限 (unconfined) の clamd プロセスを使用します。AppArmor/SELinux を強制するか、互換性のないファイルシステム意味論を使用すると、他の点では標準的なインストールでも継続がブロックされる可能性があります。
これは、同梱の使い捨てフィクスチャ、または明示的にテストを許可された別のシステムでのみ使用してください。
基準となる正確なターゲットは、意図的にバージョン管理されていないローカル成果物で、次の場所にあります:
image/zendto-installer-systemd-debian12.tar.zst
Git は Docker イメージアーカイブを無視します。正確なリグレッションの前に、認可済みのローカルコピーをそのパスに配置してください。scripts/setup.sh は記録された SHA-256 とイメージ ID を要求します。source-recipe/README.md には、インストーラ由来イメージの構築とキャプチャ方法が記載されています。ライブのパッケージリポジトリからの新規ビルドはトポロジテストには有用ですが、固定ターゲットとバイト単位で同一であるとは見なされません。
セットアップとコンテナエントリポイントは、以下のプロファイルからの不一致をすべて拒否します:
| コンポーネント | 試験済みの正確な値 |
|---|---|
| Docker イメージ ID | sha256:de6d2f06ca04943362a9bdec5026e808448953728f31bd926343a4ed2ca2ef7c |
| ZendTo | 6.15-8 |
| ClamAV/libclamav パッケージ | 1.4.3+dfsg-1~deb12u2 |
| libclamav | libclamav.so.12.0.3、SHA-256 55e3cd94…027c |
| libclamav ビルド ID | e6427ab62146ee3001fe463d12e797e9d25bf81a |
| glibc | 2.36-9+deb12u14、SHA-256 6b4a4535…421 |
| main データベース | v63、SHA-256 0b2182d2…365 |
| daily データベース | v28082、SHA-256 cddbcccf…906 |
| bytecode データベース | v339、SHA-256 6d4aa01f…ffb |
| clamd | MaxThreads 12、IdleTimeout 30、Restart=no |
| ライフサイクル | 有効な clamav-daemon.socket、systemd PID 1 |
| Web ランタイム | Apache 2.4.68、PHP 8.2.32 |
| MAC ポスチャ | 非制限 (unconfined) の特権 Docker フィクスチャ |
| root ブリッジ | www-data 内の標準 clamav; /var/zendto root:www-data 0775 |
| root コンシューマ | 標準の root クリーンアップ cron、毎時 25 分 |
| Smarty キャッシュ | 決定論的な Smarty 4.5.4 コンパイル済み zendto.conf |
| 交換ファイルシステム | ext4 ベースの名前付き /var/zendto ボリューム |
完全な値は PROFILE.json にあります。
これは ClamAV パッケージのバージョンだけを固定するよりも強力です。アロケータの構築は glibc、CVD 駆動のパーサトラフィック、ワーカー設定、および正確なターゲットライブラリにも依存します。キャプチャしたイメージでは FreshClam は無効化されており、daily.cvd がずれたり daily.cld が出現したりすると起動は失敗します。
親ワークスペース内で現在長時間実行中の研究コンテナは、クリーンなフィクスチャではありません。後日のテストで外部送信者フォームを無効化し、daily データベースを更新したためです。これらの変更はここでは意図的に除外されています。このバンドルは、ネイティブ実行が実証されたクリーンなベースラインを使用します。
/sys/fs/cgroupzstd、venv 付き Python 3、C コンパイラ、file、GNU readelfターゲットはホストカーネルと ASLR 実装を共有します。したがって、カーネル依存のマッピング動作は移植性の変数として残ります。
一度に 1 つの systemd フィクスチャだけがホスト cgroup 名前空間を共有する必要があります。元の研究マシンでは、古いフィクスチャを削除せずに停止してください:
docker stop zendto-installer-systemd-native
後で docker start zendto-installer-systemd-native で復元できます。
このディレクトリから:
./scripts/verify-bundle.sh
./scripts/setup.sh
セットアップスクリプトは:
.venv を作成します。/var/zendto ボリュームを作成し、systemd を起動します。clamav として実行される使い捨ての renameat2(RENAME_EXCHANGE) 操作を含む、デフォルトの root 変種前提条件を証明します。デフォルトのエンドポイントはループバックのみです:
http://127.0.0.1:18084/
https://127.0.0.1:18447/
証明書は自己署名です。PoC はすべての HTTP リクエストで意図的に verify=False を使用します。セットアップ前に別のループバックポートを選択できます:
export ZENDTO_HTTP_PORT=19084
export ZENDTO_HTTPS_PORT=19447
./scripts/setup.sh
後続の Compose/ヘルパーコマンドでも同じ環境変数を使用してください。
いつでもターゲットを確認できます:
./scripts/verify-target.sh
docker compose ps
クリーンなインストーラベースラインには以下があります:
allowExternalUploads = TRUE
confirmExternalEmails = TRUE
captcha = google
その CAPTCHA とメール値はインストーラのプレースホルダであるため、未改変のアーカイブは実際には公開確認メールを配信できません。ネイティブのリグレッションテストでは、その完了済みアプリケーションステップを同等の外部送信者 AuthData 行で表現しただけです。ターゲットのコード、パッケージ、スキャナ、権限、エクスプロイトパスはパッチ適用されていません。
その 1 つのラボ行とモード 0600 のトークンファイルを以下で作成します:
./scripts/mint-lab-auth.py [email protected]
トークン値は表示されず、以下に保存されます:
.lab/upload-auth-token.txt
このローカルヘルパーは、外部アップロード無効のデプロイメントがリモートで悪用可能であるという主張ではありません。公開の外部送信者フォームが無効な場合、トークンファイルが提供されても PoC は ClamAV の手前で正しく停止します。
通常どおり構成された認可済みデプロイメントでは、--external-auth-token-file を省略してください。検証ページを手動で開き、CAPTCHA を解き、攻撃者制御のメールボックスでターゲット生成のメッセージを受信し、その URL/トークンを隠しプロンプトに貼り付けます。
このモードは CAPTCHA、メール、ケイパビリティ、アップロード、ログイン POST、スキャナコンテンツを一切送信しません。--skip-clamd-tcp-probe はオプションの読み取り専用ネイティブ TCP/3310 チェックも抑制します:
mkdir -p -m 700 work
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--enumerate-only \
--skip-clamd-tcp-probe \
--fingerprint-json work/fingerprint.json
列挙は依然として通常の Web アクセスログを生成し、通常のアプリケーションキャッシュを初期化する可能性があります。その Debian/Ubuntu Apache レイアウトの結果は、ネイティブパッケージ、ビルド ID、libc、CVD、ソケットポリシー、MAC 状態を証明するものではありません。ローカルの Docker 検証スクリプトが、このフィクスチャに対するその証拠を提供します。
これはラボベアラーと受信者ポリシーを検証しますが、ファイルやスキャナコンテンツは送信しません:
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--probe-only \
--no-open-browser
[email protected]. は、このインストーラフィクスチャの作成時に入力された、意図的に変わった test. 内部ドメイン値に一致します。カスタムの実運用デプロイメントでは、実際の認可済み受信者が必要になる場合があります。
警告: これは無害なスキャナチェックではありません。最初の試行の前に、リモートモードは EICAR を送信し、PESpin 判別子で clamd を意図的にクラッシュさせ、ソケット起動の復旧を証明し、追加のクラッシュ/復旧サイクルを伴う 2 つの最終コードページプローブを実行します。拒否されたマッピングは意図的に clamd を強制終了します。
新しい作業ディレクトリと無害なコマンドを使用してください:
run_dir="work/run-$(date +%Y%m%d-%H%M%S)"
mkdir -m 700 "$run_dir"
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--oracle-conditioned-attempts 72 \
--command 'id; uname -a' \
--workdir "$run_dir" \
--keep-workdir
推奨される条件付きルートは、1 つの破損キャリアを送信する前に、有用なニブル 8 マッピングをテストします。現在の 3 レイアウト集約は後日のライフサイクル修正です。過去の 1 レイアウトオラクルと同一プロセス RCE ステージは docs/ に別途文書化されています。
ブラインドの固定ニブル 6 フォールバックは明示的に利用可能です:
.venv/bin/python poc/zendto_6_15_8_unauth_clamav_rce.py \
https://127.0.0.1:18447 \
--sender-email [email protected] \
--recipient [email protected]. \
--external-auth-token-file .lab/upload-auth-token.txt \
--restart-resample-attempts 72 \
--command 'id; uname -a' \
--workdir work/blind-run \
--keep-workdir
独立した一様ニブルモデルの下では、47 個の新しいマッピングで約 95%、72 個で約 99% になります。これらは幾何分布のマッピング確率であり、エンドツーエンドの信頼性保証ではありません。拒否された各マッピングは、スキャン時間を除いて、少なくとも 12 秒の復旧遅延に加えて強制される 40 秒のワーカー退役期間を要します。72 回試行の実行は 1 時間を超える可能性があります。
結果はコールバックやウェブシェルから読み取られるわけではありません。DSO は別の 30 分間の出力専用 AuthData ベアラーを作成し、clamav として /bin/sh -c を実行し、匿名の ZendTo ページを通じて上限付きの stdout/stderr を返します。成功には、以下のすべてが一致する 1 つのフレーム化された結果が必要です:
zendto_unauth_clamav_rce_result=1証明が欠落、重複、切り詰め、または不一致の場合は実行失敗です。
これは、./scripts/verify-target.sh が [target] と [privesc-target] の両方の成功を報告した後でのみ実行してください。ラッパーはまず同じアカウント不要の ClamAV ステージを実行し、その正確な上限付きアーミング証明を要求してから、変更されていない標準の root cron コンシューマを待ちます: