Krawlで脆弱性スキャナーを撹乱する方法
一般のWebサーバーのログを開くと、おそらく必ず大量の不要リクエストが見つかるでしょう。/wp-login.php、/.env、/.git/HEADの検索や、旧バージョンのphpMyAdminへのアクセスが延々と続いています。スキャナーやパーザーは24時間体制で脆弱な標的を探しています。通常はNGINXでアクセスを遮断したり、WAFルールで切断したりしますが、別のアプローチがあります。対抗するのではなく、攻撃者の自動化ツールに最高の偽情報を与え、リソースを浪費させるのです。
最近、Krawlプロジェクトを見つけました。脆弱なWebアプリケーションを装った特殊な欺瞞サーバーで、ボットに延々とトラップページを返し、必要に応じてニューラルネットワークを使ってリアルなHTMLをリアルタイム生成することもできます。
このトラップできること
Krawlの主な目的はシンプルです。自動スキャナーにとって魅力的に見せ、その行動をログに記録し、袋小路に陥れることです。
内部では以下を使用しています:
- 無限リンクウェブ(Spider Traps)。プロジェクトは互いにランダムにリンクしたページを生成し、パーサーに堂々巡りをさせてトラフィックを浪費させます。
- 偽の管理パネルと設定ファイル。KrawlはWordPress、phpMyAdmin、ログインパネルなど一般的なパスへのリクエストに応答し、入力されたパスワードを収集します。
- ニューラルネットワークによるページ生成。スキャナーが未知のアドレスにアクセスした場合、KrawlはOpenRouterやOpenAIにクエリを送信し、脆弱性を含むコンテキストに応じたHTMLをすばやくレンダリングできます。
- robots.txt内のトラップ。サーバーはボットが真っ先にチェックする禁止パスを宣言し、その意図を明かさせます。
さらに、CanaryTokensのカナリートークンを注入することもできます。攻撃者が見つけた偽のAPIキーを外部システムで使用しようとすると、即座に通知が届きます。
KrawlのIPレピュテーション計算方法
ボットの捕獲だけでは不十分です。実際に誰があなたのドアを叩いているのかを理解する必要があります。Krawlは各着信IPアドレスのアクティビティをバックグラウンドで複数の基準に基づいて分析します。
システムは危険なHTTPメソッドの頻度、robots.txtのパスへのアクセス頻度、リクエストのタイミング、SQLインジェクションやXSSシグネチャとの照合を評価します。最終的に、そのアドレスにはラベルが付けられます:攻撃者、不正クローラー、正当な検索エンジン、または通常のユーザー。
エクスポートが有効な場合、ネットワークフィルター用にデータを直接APIで取得できます:
curl "https://krawl.local/<SECRET_PATH>/api/export-ips?categories=attacker&fwtype=iptables"
このエンドポイントは、iptables、nftables、RouterOS用の готовыеルール、またはOPNsenseやpfSense用のブロックリストを提供します。
監視ダッシュボード
何が起きているかを監視するためのWebインターフェースがあります。ボットがハニーポット自体の管理パネルを誤って見つけることがないよう、動的な秘密パス(KRAWL_DASHBOARD_SECRET_PATH)とパスワードで保護されています。
内部では、攻撃の地理的分布、ペイロードタイプの内訳、各疑わしいアドレスの詳細な dossier(リクエスト履歴とタイムラインを含む)を確認できます。
2つの動作モード
開発者は2つの設定を用意しています:
- スタンドアロン。単一のコンテナで実行され、WALモードのSQLiteにデータを保存し、キャッシュはPythonプロセスのメモリ内に保持します。トラフィックが数十万リクエストを超えないペットプロジェクトや小型VPSに最適なオプションです。
- スケーラブル。こちらにはPostgreSQLとRedisが必要です。このモードは、ロードバランサーの後ろでKrawlインスタンスを水平スケールしたい場合や、公式Helmチャート経由でKubernetesにデプロイする場合に必要です。
典型的な使用パターンは、NGINXやTraefikの裏側でメインアプリケーションと一緒にKrawlを配置することです。疑わしいトラフィックや存在しないシステムパスへのリクエストはすべてハニーポットにプロキシされます。
クイックスタート
ローカルでプロジェクトを試す最も簡単な方法は、スタンドアロンモードでDockerコンテナを実行することです:
docker run -d \
-p 5000:5000 \
-e KRAWL_DASHBOARD_SECRET_PATH="/my-secret-dashboard" \
-e KRAWL_DASHBOARD_PASSWORD="admin-secret-password" \
-v krawl-data:/app/data \
--name krawl \
ghcr.io/blessedrebus/krawl:latest
AIを活用したページ生成を設定する予定がある場合は、docker-compose.ymlに環境変数を追加するだけです:
services:
krawl:
image: ghcr.io/blessedrebus/krawl:latest
container_name: krawl-server
ports:
- "5000:5000"
environment:
- KRAWL_MODE=standalone
- KRAWL_DASHBOARD_SECRET_PATH=/secret-dashboard
- KRAWL_DASHBOARD_PASSWORD=super-safe-password
- KRAWL_AI_ENABLED=true
- KRAWL_AI_PROVIDER=openrouter
- KRAWL_AI_API_KEY=your_openrouter_key
- KRAWL_AI_MODEL=nvidia/nemotron-3-super-120b-a12b:free
volumes:
- krawl-data:/app/data
restart: unless-stopped
volumes:
krawl-data:
何に役立つか
Krawlがトラフィックの多いプロジェクトでフル機能のWAFに取って代わる可能性は低いですが、別のニッチがあります。ブルーチーム、家庭内ラボ、そして自分のサービスへの実際の攻撃パターンを研究したい人にとって優れたツールです。
リクエストを404で盲目的に拒否するのではなく、スキャンをトラップに変え、悪意のあるIPのデータベースを収集してファイアウォールに連携させます。別のサブドメインやテストサーバーで通常のDockerコンテナを使って実験を始めることができます。
関連プロジェクト