
高対話型ハニーポットで、脆弱なLaravel/Livewireアプリを模倣します。CVE-2024-47823、CVE-2025-54068、CVE-2025-14894を標的とするRCEエクスプロイトやウェブシェルを捕捉し、サンドボックス化されたDockerコンテナ内で分析してIOCを抽出します。
脆弱なLaravel/Livewireアプリケーションを装う高対話型ハニーポット。既知のLivewire CVEを狙ったエクスプロイト試行を捕捉し、アップロードされた悪意のあるファイル(Webシェル)やリモートコード実行(RCE)ペイロードをSHA-256重複排除で保存し、必要に応じてサンドボックス化されたDockerコンテナ内で実行して、マルウェアが接続しようとする侵害指標(IOC)— URL、IP、ドメイン — を抽出します。
このシステムはセキュリティのために2つの独立したプロセスとして動作します。ペイロードを捕捉するWebサーバー(Dockerアクセスなし)と、隔離されたコンテナ内でそれらを解析するサンドボックスワーカーです。
Attacker → Nginx → FastAPI → SQLite ← Sandbox Worker (Docker)
(capture) (polls jobs, writes IOCs)
ファサード — 実際のLaravelログイン/登録ページを模した、Livewire wire: 属性、XSRFトークン、X-Powered-By: PHP/8.3.12 ヘッダーを備えたページを配信します。自動スキャナーには、実際の脆弱なアプリケーションのように見えます。
捕捉 — ASGIミドルウェア層によって、すべてのHTTPリクエストが(IP、ヘッダー、ボディハッシュ、タイムスタンプ)ルーティングの前に透過的にSQLiteに記録されます。
トラップ — Livewireエンドポイントは、実際のフレームワークと同様にファイルアップロードとコンポーネントメッセージを受け入れます。ペイロードは(PHPコード、シリアライズされたオブジェクト、シェルコマンドに)分類され、SHA-256重複排除で保存されます。興味深い各ペイロードは、sandbox_jobs キューに永続的なジョブを作成します。
サンドボックス — 別のワーカープロセスが保留中のジョブをポーリングし、各ペイロードを一時的なDockerコンテナ(読み取り専用ファイルシステム、ネットワークなし、cap_drop=ALL)で実行します。LD_PRELOAD シムがlibcネットワークコールをインターセプトして、C2(コマンド&コントロール)通信の試行を記録します。アナライザーはIOCを抽出し、ヒューリスティックを使用して潜在的なC2エンドポイントをスコアリングします。
*.php キャッチオールトラップは、一般的なWebシェルのファイル名(例: accesson.php、wp-login.php、admin.php)を探すポストエクスプロイトの探索も捕捉します。
前提条件: Python 3.11+ と uv。
git clone https://github.com/HelgeSverre/livewire-honeypot.git
cd livewire-honeypot
# Install dependencies
uv sync
# Start the web server (capture-only, no Docker needed)
DATA_DIR=./data uv run uvicorn honeypot.main:app --reload --port 8000
# In a second terminal — start the sandbox worker (requires Docker)
DATA_DIR=./data uv run python -m honeypot.worker
# Run tests
uv run pytest tests/ -v
Webサーバーはスタンドアロンで動作します。サンドボックスワーカーが実行されていなくても、すべてを捕捉して保存します。自動ペイロード解析が必要になったらワーカーを起動してください。
注意:
src/ディレクトリはpyproject.toml(srcレイアウト)を介してPythonパス上にあるため、honeypot.main:appはsrc/honeypot/main.pyにマップされます。
必要なもの:
VPSが存在すれば、フルデプロイは単一のコマンドで完了します。スクリプトは「ベアドロップレット」から「TLSで動作中のサービス」までのすべての手順(aptパッケージ、ユーザーとグループ、Python venv、サンドボックスイメージ、nginx、certbot、ファイアウォールルール)を処理します。
# 1. Provision a $6/mo droplet (Ubuntu 24.04, 1 GB RAM is enough).
# On DigitalOcean:
doctl compute droplet create veritron-honeypot \
--size s-1vcpu-1gb \
--image ubuntu-24-04-x64 \
--region fra1 \
--ssh-keys "$(doctl compute ssh-key list --format ID --no-header | head -1)" \
--wait
# 2. Point your domain's A record at the droplet IP.
# Wait for DNS to resolve before continuing.
dig +short your-domain.example # should return the droplet IP
# 3. Copy the project onto the droplet.
rsync -az --exclude='.git' --exclude='.venv' --exclude='data' \
./ root@<droplet-ip>:/opt/honeypot/
# 4. Run the bootstrap script. Passing your domain enables TLS via certbot.
ssh root@<droplet-ip> 'cd /opt/honeypot && [email protected] \
bash deploy/setup.sh your-domain.example'
これで完了です。ハニーポットはHTTPS経由で偽のLaravel/Livewireログインページを提供し、すべてのリクエストをSQLiteに捕捉し、Dockerサンドボックスでペイロードを解析する準備ができています。
deploy/setup.sh は冪等です。再実行しても安全です。順に、次のことを行います:
/root/.local/bin の下にインストールします。honeypot(Web)と sandbox(ワーカー)サービスユーザー、および共有の honeypot-data グループを作成します。uv sync --python /usr/bin/python3.12 を実行します。uvがバンドルするインタープリターではなく、aptでインストールされたPythonを意図的に使用します。uvのPythonは /root/.local/share/uv/ にあり、非特権サービスユーザーはこれを通過できないため、uvにインタープリターを選択させると systemd から紛らわしい status=203/EXEC が返ります。/var/honeypot/ を作成し、両方のサービスが互いの書き込みを読み取れるようにします。ExecStart をシステムのDockerデーモンを使用するように書き換えます(同梱のユニットは設定が難しいrootless Dockerを想定しています)。docker build -t honeypot-sandbox sandbox/)。limit_req_zone ディレクティブを に配置します( ブロック内に置く必要があり、 ブロック内ではありません)。setup.sh を実行せずに各手順を自分で実施したい場合は、同等のシェル履歴がdeploy/setup.shにコメント付きステージとして記載されています。
| Service | User | 目的 | Dockerアクセス |
|---|---|---|---|
honeypot.service | honeypot |
両方のサービスは、SQLiteデータベースとペイロードストレージのために /var/honeypot/ を共有します。WebプロセスはDockerソケットへのアクセスを持たないため、攻撃者のトラフィックを通じて侵害されたとしても、ホスト上でコンテナを作成することはできません。
# View logs
journalctl -u honeypot -f
journalctl -u honeypot-worker -f
# Restart services
systemctl restart honeypot honeypot-worker
# Upgrade
cd /opt/honeypot && git pull && uv sync
docker build -t honeypot-sandbox sandbox/
systemctl restart honeypot honeypot-worker
すべての設定は環境変数で制御されます(systemdユニットファイルで設定するか、実行前にエクスポートします):
すべてのデータは単一のSQLiteデータベース(デフォルト: /var/honeypot/captures.db)に保存されます。
# Recent requests
sqlite3 /var/honeypot/captures.db \
"SELECT timestamp, source_ip, method, path, matched_trap
FROM requests ORDER BY id DESC LIMIT 20;"
# Unique payloads by frequency
sqlite3 /var/honeypot/captures.db \
"SELECT sha256, filename, payload_type, times_seen, sandbox_status
FROM payloads ORDER BY times_seen DESC;"
# Top attacker IPs
sqlite3 /var/honeypot/captures.db \
"SELECT ip, total_requests, first_seen, last_seen
FROM attackers ORDER BY total_requests DESC LIMIT 10;"
# Sandbox results with extracted IOCs (JSON)
sqlite3 /var/honeypot/captures.db \
"SELECT payload_id, exit_code, duration_seconds, c2_urls_found, iocs
FROM sandbox_runs ORDER BY id DESC LIMIT 5;"
# Pending sandbox jobs
sqlite3 /var/honeypot/captures.db \
"SELECT id, payload_sha256, status, created_at
FROM sandbox_jobs ORDER BY id DESC LIMIT 10;"
sandbox_runs.iocs のIOCデータは、domains、ips、emails、urls、hashes というキーを持つJSONとして保存されます。必要に応じて抽出し、脅威インテルプラットフォーム(MISP、OpenCTIなど)にフィードしてください。
src/honeypot/
main.py # FastAPI web app (capture-only, no Docker)
worker.py # Standalone sandbox worker (polls SQLite, needs Docker)
config.py # Settings from environment variables
capture/
database.py # Async SQLite — requests, payloads, sandbox_jobs queue
logger.py # ASGI middleware — logs every request
payloads.py # SHA-256 dedup storage + payload classification
facade/
routes.py # Laravel-fingerprinted pages (login, register, etc.)
templates/ # Jinja2 HTML with Livewire wire: attributes
static/ # Fake livewire.js (v3.5.1 fingerprint)
traps/
livewire.py # POST /livewire/message, /upload-file, /preview-file
php_catchall.py # Catch-all for *.php probing
sandbox/
orchestrator.py # Docker container lifecycle + hardening
analyzer.py # Artifact parsing + IOC extraction + C2 scoring
deploy/
nginx.conf # Reverse-proxy with rate limiting
honeypot.service # systemd unit (web)
honeypot-worker.service # systemd unit (sandbox worker)
setup.sh # VPS bootstrap script
sandbox/
Dockerfile # Sandbox container image (PHP 8.3 + attacker tools)
entrypoint.sh # Container entry-point with LD_PRELOAD network shim
これは、あなたが所有するインフラストラクチャ上でマルウェアサンプルを収集し、攻撃者の行動を観察するための研究ツールです。本番用セキュリティ製品ではありません。管理下にあるシステムにのみデプロイし、攻撃者のペイロードを捕捉して実行することは、お住まいの法域で法的影響を及ぼす可能性があることに注意してください。SQLiteデータベースとペイロードファイルは無制限に増大します。ディスク使用量を監視し、必要に応じて保持ポリシーを実装してください。
問題報告やプルリクエストを歓迎します。
| CVE | CVSS | 概要 | トラップエンドポイント |
|---|
| CVE-2024-47823 | 9.8 Critical | LivewireのファイルアップロードにおけるMIMEタイプバイパスによるRCE。 ファイル拡張子はファイル名から検証されるのではなくMIMEタイプから推定されるため、画像に偽装した .php のアップロードが可能です。影響を受けるバージョン: Livewire < 2.12.7 および < 3.5.2。 | POST /livewire/upload-file |
| CVE-2025-54068 | 9.2 Critical | LivewireのプロップハイドレーションによるRCE。 ハイドレーションプロセスはコンポーネントプロパティ更新時のオブジェクト型のサニタイズに失敗するため、注入されたペイロードがサーバーサイドで実行される可能性があります。影響を受けるバージョン: Livewire 3.0.0-beta.1 から 3.6.3。 | POST /livewire/message |
| CVE-2025-14894 | Critical | Livewire Filemanagerの無制限アップロードによるRCE。 ファイルタイプとMIME検証が欠如しているため、未認証で実行可能なPHPファイルをアップロードできます。 | POST /livewire/upload-file |
/etc/nginx/conf.d/http {}server {}certbot --nginx を実行します。| Webサーバー — リクエストとペイロードを捕捉 |
| なし |
honeypot-worker.service | sandbox | サンドボックスワーカー — Dockerでペイロードを解析 | あり |
| Variable | Default | 説明 |
|---|
DATA_DIR | /var/honeypot | すべてのデータのベースディレクトリ |
DB_PATH | $DATA_DIR/captures.db | SQLiteデータベースのパス |
SANDBOX_TIMEOUT | 60 | サンドボックス実行あたりの最大秒数 |
SANDBOX_MEMORY | 128m | コンテナのメモリ制限 |
SANDBOX_CPUS | 0.5 | コンテナのCPU制限 |
SANDBOX_MAX_CONCURRENT | 3 | 最大同時サンドボックスコンテナ数 |
SANDBOX_IMAGE | honeypot-sandbox | サンドボックス用Dockerイメージ |
WORKER_POLL_INTERVAL | 2.0 | ジョブポーリング間隔(秒) |