
nightcrawler — Updated!
ローカルAI駆動のレッドチーマーをスマートフォン上で
Nightcrawler
スマートフォン上で完全に動作する自律型ペネトレーションテストエージェント。電話をネットワークに置いて立ち去るだけで、ホストの発見、サービスのマッピング、脆弱性の発見、ペンテストレポートの生成までを、クラウド接続なしで実行します。
░█▄░█ █ █▀▀ █░█ ▀█▀ █▀▀ █▀█ ▄▀█ █░█░█ █░░ █▀▀ █▀█
░█░▀█ █ █▄█ █▀█ ░█░ █▄▄ █▀▄ █▀█ ▀▄▀▄▀ █▄▄ ██▄ █▀▄ v0.1.0
AUTONOMOUS MOBILE PENTEST AGENT
OnePlus 8 · NetHunter · LFM2.5-1.2B · OpenCL GPU
これは何か?
ペネトレーションテスト(ペンテスト)とは、ネットワーク所有者の明示的な許可を得た上で、攻撃をシミュレートしてコンピュータネットワークのセキュリティをテストする手法です。プロのペンテスターは、実際の攻撃者よりも先に脆弱性を見つけるために雇われます。
Nightcrawlerはこのプロセスを電話上で自動化します。電話のGPU上でローカルに動作する小型AIモデル(LFM2.5-1.2B-Instruct-Heretic、12億パラメータ)を使用して、次に何をするか(どのホストを調査するか、どのツールを使うか、何を探すか)を決定します。インターネット接続やクラウドAPIは不要です。
デモ
▶️ InstagramでNightcrawlerの動作を見る
仕組み
- WiFi侵入(オプション)— WiFiなしで設置された場合、外部USB WiFiアダプタを使用してWPA2ネットワークを自律的にクラックできます
- 偵察 — ステルススキャンを使用してネットワーク上のデバイスを発見
- 列挙 — 発見したサービス(Webサーバー、ファイル共有、SSH、DNSなど)を調査
- 悪用 — 既知の脆弱性とデフォルト認証情報をテスト
- レポート作成 — 調査結果と修復アドバイスを含む構造化されたペンテストレポートを生成
このエージェントは忍耐強い人間のペンテスターのように動作します — ホスト間をローテーションし、ターンごとに小さなアクションを1つ実行し、数時間かけて徐々に知識を構築します。これにより、すべてのホストを一度に攻撃する従来の脆弱性スキャナーよりもはるかに検出が困難です。
主要な概念
| 用語 | 意味 |
|---|---|
| ドロップボックス | ターゲットネットワーク上に残され、自律的にテストを実行するデバイス |
| スコープ | テストを許可されたネットワーク/ホストのセット |
| 交戦規則(ROE) | 何が許可されているかを指定する法的文書 |
| ステルス | ネットワーク監視(IDS/IPS)による検出を回避する技術 |
| MCP | Model Context Protocol — AIツール使用のための標準インターフェース |
| C2 | Command and Control — エージェントの監視と操作のためのWebダッシュボード |
アーキテクチャ
┌──────────────────────────────────────────────────────────┐
│ 電話 (OnePlus 8) │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ LFM2.5 │ │ エージェントループ │ │
│ │ 1.2Bモデル │◄───►│ (main.py) │ │
│ │ GPU上 │ │ 次に何をするか │ │
│ │ (:8080) │ │ を決定 │ │
│ └─────────────┘ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ スコーププロキシ │ ← 安全レイヤー │
│ │ 実行前にすべての │ スコープ外の │
│ │ コマンドを検証 │ アクションを │
│ │ │ ブロック │
│ └────────┬─────────┘ │
│ │ │
│ ┌────────▼─────────┐ │
│ │ Kali MCPサーバー │ ← 実際のコマンド │
│ │ nmap, curl, │ を実行 │
│ │ smbclient, ... │ │
│ └──────────────────┘ │
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ Webダッシュボード │ │ SQLite DB │ │
│ │ (:8888) │ │ ホスト、脆弱性、 │ │
│ │ 監視と操作 │ │ 認証情報、コマンド │ │
│ └──────────────────┘ └──────────────────┘ │
└──────────────────────────────────────────────────────────┘
完全なシステム設計については、docs/ARCHITECTURE.mdを参照してください。
機能
- 完全自律型 — 運用中に人間の介入は不要
- 100%ローカル推論 — AIは電話のGPU上で動作し、クラウドは不要
- スコープ強制 — 2層防御でスコープ外のアクションを防止
- ステルス優先 — 低速スキャンレート、ホストローテーション、カバートラフィック、nmap -T2のみ
- 27のエクスプロイトプレイブック — 自動実行される多段階攻撃チェーン
- 24,956件のCVEデータベース — バージョン認識型の脆弱性マッチング
- Webダッシュボード — リアルタイム監視、ホスト管理、C2コントロール
- WiFi侵入モード — USBアダプタによる自律的WPA2クラッキング(Pwnagotchiに着想を得た)
- パッシブディスカバリ — mDNS/NBNS/DHCP/ARPブロードキャストのバックグラウンドキャプチャ
- マルチネットワーク — ネットワークごとにデータを分離、MACキー付きホストでDHCP変更に耐性
- 自己修復 — ガベージ検出、コンテキストリセット、ウォッチドッグ、スタック検出
- トレーニングキャプチャ — 将来のモデルファインチューニングのための成功したインタラクションを記録
- レポート生成 — 脆弱性、エクスプロイトチェーン、修復策を含むダウンロード可能なペンテストレポート
完全な機能リファレンスについてはdocs/FEATURES.mdを参照してください。
ハードウェア
必須
- Androidスマートフォン — Kali NetHunter搭載(OnePlus 8、Snapdragon 865でテスト済み)
- ルートアクセス — Magisk経由
- 12GB以上のRAM(モデルは約1.3GB、Androidは約4GB、残りはツール用)
オプション
- USB WiFiアダプタ — オフラインWiFi侵入モード用(Ralink RT3572推奨)
- カスタムカーネル — モニターモード用のMAC80211搭載(ビルドガイド)
- NVIDIA AGX — Tailscale経由でより大きなモデルにオフロードするため
GPUパフォーマンス
すべての推論はAdreno 650 GPU上のOpenCL経由で実行:
| モデル | 量子化 | プロンプト速度 | 生成速度 |
|---|---|---|---|
| LFM2.5-1.2B-Instruct-Heretic(本番) | Q8_0 | 115 tok/s | 13 tok/s |
| Qwen3.5-0.8B | Q8_0 | 30.5 tok/s | 6.3 tok/s |
| Qwen3.5-4B | Q4_0 | 10.1 tok/s | 2.0 tok/s |
注記: Androidはバッテリー駆動時にGPUをスロットルします(6倍の減速)。Nightcrawlerには、最大パフォーマンスを強制し、バッテリー残量≤15%で自動スロットルするGPUガバナーデーモンが含まれています。
クイックスタート
# 1. インストール(Kali NetHunter chroot内)
bash INSTALL.sh
# 2. llama-serverの起動を待つ(起動後約5分)
curl -s http://127.0.0.1:8080/health # {"status":"ok"}が返るはず
# 3. すべてのサービスを開始
bash scripts/run-36h.sh
# 4. Webダッシュボードを開く(Tailscaleネットワーク上の任意のデバイスから)
# https://<your-tailscale-hostname>:8888
ドライラン(実際のコマンドは実行されません)
NC_DRY_RUN=1 python3 main.py
これによりモックKaliサーバーが使用され、実際のネットワークコマンドを実行せずにエージェントループをテストできます。
手動起動(tmuxランチャーを使用しない場合)
kali-server-mcp --port 5000 &
python3 scope_proxy.py --config config.yaml --port 8800 --upstream http://127.0.0.1:5000 &
bash scripts/webui-daemon.sh start
python3 main.py &
設定
デプロイ前にconfig.yamlを編集:
mission:
id: "CLIENT-YYYY-XXX" # エンゲージメントID
scope:
networks: ["auto"] # "auto" = 起動時にwlan0から検出
excluded_hosts: ["auto"] # "auto" = ゲートウェイ + 自身のIP
excluded_ports: [502, 503] # 絶対に触れないSCADA/ICSポート
authorization: "ROE-YYYY-XXX.pdf"
max_runtime_hours: 0 # 0 = 制限なし
model:
local:
ctx_size: 8192
port: 8080
動的スコープ検出により、ネットワーク間を移動する際の設定変更は不要です — エージェントは起動時にwlan0から現在のサブネットを読み取ります。
プロジェクト構造
nightcrawler/
├── main.py # エントリーポイント
├── config.yaml # ミッションスコープ + モデル設定
├── scope_proxy.py # スコープ強制プロキシ
├── INSTALL.sh # インストーラー
│
├── agent/ # コアエージェントロジック
│ ├── loop.py # 決定ループ + エラーリカバリ
│ ├── planner.py # フェーズ状態機械(偵察→悪用)
│ ├── llm_client.py # LLM APIクライアント(llama.cpp / リモート)
│ ├── db.py # SQLiteバックエンド(ホスト、脆弱性、認証情報)
│ ├── host_memory.py # ホストごとの観察 + 自動タグ付け
│ ├── cve_db.py # 24,956件のCVEデータベース
│ ├── attack_planner.py # 悪用フェーズの戦略的指示
│ ├── output_parser.py # ツール出力から構造化データを抽出
│ ├── offline_manager.py # WiFi侵入パイプライン状態機械
│ ├── net_detect.py # wlan0からネットワークを自動検出
│ ├── cover_traffic.py # 現実的なWebトラフィックとのステルスブレンド
│ ├── passive_capture.py # ブロードキャストトラフィックのバックグラウンドtcpdump
│ └── ...
│
├── proxy/ # スコープ強制コンポーネント
│ ├── scope.py # IP/ポート/ホストの検証
│ ├── rate_limiter.py # コマンドレート制限 + ジッター
│ └── command_filter.py # 破壊的コマンドのブロックリスト
│
├── webui/ # Webダッシュボード(Flask)
│ ├── server.py # API + ステルスミドルウェア
│ └── templates/index.html # ダッシュボードUI
│
├── data/ # 静的データファイル
│ ├── cve_exploits.json # CVE→エクスプロイトコマンドマッピング
│ └── playbooks.json # 27の多段階攻撃プレイブック
│
├── prompts/ # LLMプロンプトテンプレート(ホットリロード可能)
├── scripts/ # 運用スクリプト(開始、停止、ウォッチドッグ)
├── tests/ # テストスイート(API、UI、オフラインモード)
├── kernels/ # WiFiドライバーモジュール + カーネルドキュメント
├── simulation/ # ドライランモックサーバー
├── docs/ # アーキテクチャ、GPUセットアップ、機能
├── logs/ # ランタイムデータ(gitignore対象)
└── models/ # モデルファイル(gitignore対象)
エージェントの思考プロセス
エージェントはシンプルだが効果的なループを使用します:
- ターゲットを選択 — 重み付きランダム選択(70%は既知ポートのあるホスト、30%は新規ディスカバリ)
- コンテキストを構築 — ホストメモリ、ネットワーク観察、フェーズガイダンスをプロンプトに注入
- LLMに問い合わせ — モデルが
REASONING: ... COMMAND: ...を生成 - 検証 — スコーププロキシがコマンドがスコープ内で破壊的でないことを確認
- 実行 — Kali MCPサーバー経由でコマンドを実行
- 学習 — 出力パーサーが発見事項を抽出し、ホストメモリを更新
- コンテキストをリセット — 会話をクリアし、永続メモリを保持して繰り返す
1.2Bモデルのコマンド成功率は約50%(サイズに固有の特性)です。エージェントは以下で補償します:
- ガベージ検出 — 多様なfew-shot例による5連続リセット
- 重複検出 — ツール/ターゲットの多様化を強制
- 時間ベースのスタック検出 — 5分のバックストップでコンテキストリセットを強制
- 直接プレイブック実行 — 多段階攻撃はLLMを完全にバイパス
Webダッシュボード
:8888のダッシュボードはリアルタイムの監視と制御を提供します:
- ライブフィード — すべてのコマンド、発見事項、エージェントの決定
- ホストカード — ポート、サービス、脆弱性を表示するクリック可能なカード
- ネットワークマップ — インタラクティブなフォース指向グラフ(ドラッグ、ズーム、パン)
- 脆弱性の詳細 — CVEタグ、エクスプロイトチェーン、修復手順
- C2コントロール — ホストのスター/ブラックリスト登録、フェーズ強制、一時停止/再開、コマンド注入
- オフラインモード — アニメーション顔付きのPwnagotchiに着想を得たWiFi攻撃UI
ダッシュボードはステルスフィルタリングされています:nginxヘッダーを偽装し、ターゲットネットワークからの接続には空の404を返します。
テスト結果
複数のネットワークでの72時間以上の自律運用から:
- ネットワークごとに30以上のホストを発見
- 2,000以上のコマンドを自律実行
- 複数のサービスで10以上の脆弱性を発見
- 6以上のプレイブックを直接実行で実行
- エージェントメモリは全体を通して35-50MBで安定(リークなし)
貢献
貢献は歓迎します!ガイドラインについてはCONTRIBUTING.mdを参照してください。
支援が必要な分野
- モデルのファインチューニング — コマンド形式のコンプライアンスを約50%から85%以上に改善
- 新しいプレイブック — より多くのサービス向けのエクスプロイトチェーンを追加
- CVEデータベース — 現在の24,956件を超えるカバレッジの拡大
- アダプタサポート — より多くのUSB WiFiチップセットでのテスト
- ドキュメント — 異なる電話向けのチュートリアル、セットアップガイド
- テスト — 特にエッジケース向けのテストカバレッジの拡大
開発環境のセットアップ
# リポジトリをクローン
git clone https://github.com/garagehq/nightcrawler.git
cd nightcrawler
# ドライランモード(実際のコマンドなし、ハードウェア不要)
NC_DRY_RUN=1 python3 main.py
# テストを実行
python3 -m pytest tests/
法的注意事項
このツールは許可されたペネトレーションテスト専用です。 Nightcrawlerを展開する前に、ネットワーク所有者から書面による許可(交戦規則)が必要です。所有していない、またはテスト許可のないネットワークに対する不正使用は違法です。
ライセンス
MIT — 詳細はLICENSEを参照してください。
サポート
このプロジェクトを気に入っていただけたら、コーヒーを一杯ごちそうしてください ☕:
