Skip to main content
Glama
acaranta

hexstrike-ai

by acaranta

HexStrike AI — Docker + リモートMCP

linuxserver.io の Kali ベースイメージ上で HexStrike AI を Docker 化し、新しいリモート対応の streamable-HTTP MCP サーバーを追加しました。これにより、ローカルの stdio クライアントからだけでなく、ネットワーク越し(例: Claude Code)からも HexStrike の全ツールセットを操作できます。

[!WARNING] これは、攻撃的セキュリティツールの自律実行をネットワークに公開します。 MCP エンドポイントに接続したクライアントは、コンテナ内のツール群を介して事実上リモートでコマンド実行を行うことができます。隔離されたラボ以外でこれを実行する前に、セキュリティのセクションをお読みください。常に HEXSTRIKE_MCP_TOKEN を設定し、信頼できる/隔離されたネットワークまたは VPN 上でのみ実行し、明示的にテストを許可されたシステムのみを対象にしてください。

[!NOTE] ビルド済みイメージは公開されていません。 Kali の完全なツールセットにより、イメージは巨大(>10 GB — ビルド時は約 ~17 GB)になるため、Docker Hub やいかなるレジストリにもプッシュされません。このリポジトリから自分でビルドしてください(クイックスタート参照)。Docker ホストに十分な空きディスクがあることを確認してください。

目次

Related MCP server: Pentest MCP

機能

  • 完全なアップストリームの HexStrike AI ツールキット — Flask API を通じて操作される 150 以上のセキュリティツール — を Kali ベースのイメージにプリインストール。手動での環境構築は不要です。

  • 新機能: hexstrike_mcp_http.py — アップストリームのすべての @mcp.tool() 定義をポート 8889(パス /mcp)でネットワーク経由に公開する streamable-HTTP MCP サーバー。ローカルの stdio 経由だけでなく、リモートからも操作できます。

  • MCP エンドポイントを保護するオプションのベアラートークン認証。

  • 自動化されたツール実行と並行して対話的に作業できる、ブラウザからアクセス可能な KDE デスクトップ(Selkies/KasmVNC、ベースイメージから継承)。

  • s6-overlay v3 によるプロセス監視と明示的なサービス順序 — MCP サービスは HexStrike API サーバーを依存関係として待機します。

  • 永続的な /config ボリューム: ツールごとの virtualenv とファイルマネージャーの状態は、コンテナ再起動後も保持されます。

  • 再現可能なビルド: uv が Python 環境を管理し、アップストリームソースはベンダリングせず、ピン留めされた git コミットで取得されます。

概要

HexStrike AI のアップストリームは、2 つの Python エントリポイントを提供しています:

  • hexstrike_server.py — ポート 8888 で待ち受ける Flask API サーバー。subprocess 経由で 150 以上の外部セキュリティツールを実行し、その結果を HTTP で公開します(ツールの可用性を報告する /health エンドポイントを含む)。

  • hexstrike_mcp.py — MCP ツール呼び出しを上記の API サーバーへの HTTP 呼び出しに変換する FastMCP サーバー。アップストリームはこれを stdio トランスポートでのみ実行するため、コンテナと同じマシン上の MCP クライアントからしか操作できません。

このリポジトリは hexstrike_mcp_http.py を追加します。これはアップストリームの hexstrike_mcp.py モジュールをインポートし、setup_mcp_server() 関数を丸ごと再利用します — すべてのツール定義は変更されません — ただし、stdio の代わりに、MCP streamable-HTTP トランスポートでポート 8889、パス /mcp に提供します。機能的に異なるのはこれだけです: 同じツールサーフェスを、同一プロセス内だけでなく、リモート(例: 別のマシンで実行されている Claude Code)からも到達可能にします。

uv (Astral) が Python インタープリターと依存環境を管理し、コンテナ起動時に両方のプロセスを実行するために使用されます。

アーキテクチャ

  • ベースイメージ: lscr.io/linuxserver/kali-linux:latest。ポート 3000 (HTTP) と 3001 (HTTPS) でブラウザからアクセス可能な KDE デスクトップ(Selkies/KasmVNC)、Kali-rolling の apt リポジトリ、s6-overlay v3 init を提供します。

  • 追加サービス: ベースイメージの init システムの上に 2 つの s6-overlay の longrun サービスが重ねられ、user サービスのバンドルに登録されています:

    • root/etc/s6-overlay/s6-rc.d/hexstrike-server — abc ユーザーとして uv run --no-sync python hexstrike_server.py --port 8888 を実行します。

    • root/etc/s6-overlay/s6-rc.d/hexstrike-mcp — abc ユーザーとして uv run --no-sync python hexstrike_mcp_http.py --server http://127.0.0.1:8888 --host 0.0.0.0 --port 8889 を実行します。dependencies.d/hexstrike-server エントリにより、API サーバーの後で起動するよう順序付けられています。

  • アップストリームソースはベンダリングされません。 Dockerfile はビルド時に git clone で 0x4m4/hexstrike-ai を取得し、ピン留めされたコミット(ARG HEXSTRIKE_REF、デフォルト d689933ff579d839c676c82b231f8e98326c5f04)をチェックアウトして、hexstrike_server.py、hexstrike_mcp.py、hexstrike-ai-mcp.json のみを /app にコピーします。これにより、リポジトリを小さく保ち、アップストリームの更新を 1 行の変更で済ませられます。

  • Python 環境: uv 管理の CPython 3.12(.python-version でピン留め)。pyproject.toml の依存関係はビルド時に uv sync --no-dev で /app/.venv にインストールされます。

  • 永続化のブートストラップ: root/custom-cont-init.d/10-hexstrike-persist は、longrun サービスが起動する前に root として実行されます(永続化を参照)。

ポート

Port

Protocol

Description

3000

HTTP

Web デスクトップ (Selkies/KasmVNC)、linuxserver の Kali ベースイメージから継承

3001

HTTPS

Web デスクトップ、TLS

8888

HTTP

HexStrike AI API サーバー (hexstrike_server.py)

8889

HTTP

HexStrike AI MCP サーバー、streamable-HTTP トランスポート、エンドポイントパス /mcp

クイックスタート

Docker Compose(推奨)

すべての設定は docker-compose.yml に直接記述されており、.env ファイルはありません。初回起動前に、environment: ブロックを編集して次を設定してください:

  • HEXSTRIKE_MCP_TOKEN — MCP エンドポイントのベアラートークン。openssl rand -hex 32 で強力な値を生成して貼り付けます(または空のままにしてエンドポイントを開放することもできます — 隔離されたネットワーク上のラボ/CTF のみ)。

  • CUSTOM_USER / PASSWORD — Web デスクトップの basic-auth ログイン。

次にビルドして起動します:

# generate a token to paste into docker-compose.yml:
openssl rand -hex 32

docker compose up -d --build

ビルドは大きくて遅く、プルできるビルド済みイメージはありません — 結果のイメージは >10 GB(~17 GB) になるため、レジストリには公開されておらず、ローカルでビルドする必要があります。kali-linux-headless メタパッケージに加えて多数の名前付きツールをインストールし、angr / pwntools のホイールをコンパイルし(そのためイメージに build-essential と開発用ヘッダーが含まれます)、3 つの Go ツールをソースからビルドし、rustscan のリリースパッケージをダウンロードします。初回ビルドにはかなりの時間と十分な空きディスクが必要です(約 ~20 GB+ の余裕を見積もり、反復中はさらに必要です)。

プレーンな Docker

docker build -t hexstrike-ai:local .

docker run -d \
  --name hexstrike-ai \
  --cap-add=NET_RAW --cap-add=NET_ADMIN \
  --shm-size=1g \
  -p 3000:3000 -p 3001:3001 -p 8888:8888 -p 8889:8889 \
  -v "$(pwd)/config:/config" \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Etc/UTC \
  -e CUSTOM_USER=kali \
  -e PASSWORD=changeme \
  -e HEXSTRIKE_MCP_TOKEN="$(openssl rand -hex 32)" \
  hexstrike-ai:local

--cap-add=NET_RAW --cap-add=NET_ADMIN と --shm-size=1g が必要です — 理由は セキュリティ と docker-compose.yml のコメントを参照してください。

Claude Code から接続する

コンテナが起動したら、Claude Code をポート 8889 の MCP エンドポイントに向けます。HEXSTRIKE_MCP_TOKEN が設定されている場合(強く推奨 — セキュリティを参照)、すべてのリクエストに一致する Authorization: Bearer <token> ヘッダーを含める必要があります。エンドポイントが未認証リクエストを受け入れるのは、トークンが未設定の場合のみです。

プロジェクト/ユーザー MCP 設定(.mcp.json または Claude Code 設定):

{
  "mcpServers": {
    "hexstrike-ai": {
      "type": "http",
      "url": "http://<HOST>:8889/mcp",
      "headers": { "Authorization": "Bearer <HEXSTRIKE_MCP_TOKEN>" }
    }
  }
}

または CLI 経由:

claude mcp add --transport http hexstrike-ai http://<HOST>:8889/mcp \
  --header "Authorization: Bearer <TOKEN>"

<HOST> をコンテナホストのアドレス/ホスト名に、<HEXSTRIKE_MCP_TOKEN> / <TOKEN> を上記で生成した値に置き換えてください。意図的に HEXSTRIKE_MCP_TOKEN を未設定のままにした場合は、headers / --header 引数を省略してください — その場合エンドポイントはオープンです。

Invalid Host header / HTTP 421? MCP の streamable-HTTP トランスポートには DNS リバインディング保護が組み込まれており、デフォルトでは localhost の Host ヘッダーのみを信頼します。このイメージはデフォルトでこのチェックを無効にしているため、LAN 上で IP またはホスト名を使ってエンドポイントに到達できます。逆にこのエラーが表示される場合は、このイメージにアップグレードするか(デフォルトで既に処理されています)、HEXSTRIKE_MCP_ALLOWED_HOSTS をクライアントが送信する正確な host:port 値に設定してください。

環境変数

変数

設定場所

デフォルト

説明

PUID

docker-compose.yml / -e

1000

linuxserver の慣例: コンテナ内で abc サービスユーザーが実行される UID。

PGID

docker-compose.yml / -e

1000

linuxserver の慣例: abc サービスユーザーが実行される GID。

TZ

docker-compose.yml / -e

Etc/UTC

コンテナのタイムゾーン。

CUSTOM_USER

docker-compose.yml

kali

Web デスクトップの Basic 認証ユーザー名 (linuxserver Kali ベースイメージ)。

PASSWORD

docker-compose.yml

changeme

Web デスクトップの Basic 認証パスワード。

HEXSTRIKE_MCP_TOKEN

docker-compose.yml

(空)

:8889/mcp エンドポイントで必須の Bearer トークン。openssl rand -hex 32 の出力値を設定してください。隔離された/オープンなラボ環境でのみ空のままにしてください。

HEXSTRIKE_SERVER_PORT

任意、docker-compose.yml 内のコメント付き例

8888

HexStrike API サーバーがバインドするポート。s6 の両 run スクリプトがこれを読み取ります。変更する場合は、公開ポートマッピングも更新する必要があります。

HEXSTRIKE_MCP_PORT

任意、docker-compose.yml 内のコメント付き例

8889

MCP streamable-HTTP サーバーがバインドするポート (上記と同じ注意事項)。

HEXSTRIKE_MCP_HOST

任意

0.0.0.0

MCP サーバーがバインドするインターフェース。hexstrike-mcp run スクリプトがそのまま渡し、hexstrike_mcp_http.py が環境変数のフォールバックとして読み取ります。

HEXSTRIKE_MCP_ALLOWED_HOSTS

任意、-e

(空)

トランスポートの DNS リバインディング保護用の、カンマ区切りの Host/Origin 許可リスト (例: hexstrike.lan:8889,10.0.0.5:8889)。空 (デフォルト) の場合、Host チェックは無効になり、エンドポイントは任意のアドレス/ホスト名から到達可能になります。特定のホスト名にロックするには設定してください。

HEXSTRIKE_MCP_TOOL_FILTER / _INCLUDE_ONLY / _EXCLUDE_TOOLS / _KEEP_TOOLS

任意、-e

auto / 空

公開する MCP ツールを制御します — MCP ツールフィルタリング を参照してください。

hexstrike_mcp_http.py は --server / HEXSTRIKE_SERVER_URL、 --path / HEXSTRIKE_MCP_PATH、--timeout / HEXSTRIKE_TIMEOUT、 --allowed-hosts / HEXSTRIKE_MCP_ALLOWED_HOSTS のオーバーライドも受け付けます。同梱の s6 run スクリプトは --server、--host、--port のみを渡します。残りは 環境変数のフォールバックから読み取られるか (そのため HEXSTRIKE_MCP_ALLOWED_HOSTS は コンテナに設定すれば機能します)、組み込みのデフォルト値 (/mcp、上流の デフォルトリクエストタイムアウト、Host チェック無効) が維持されます。

永続化

/config ボリュームは linuxserver の慣例によるホームディレクトリであり、 コンテナ再作成後も生存する唯一のパスです。cont-init スクリプト root/custom-cont-init.d/10-hexstrike-persist は longrun サービスが起動する前に root として実行され、以下を行います:

  1. /config/hexstrike/envs、/config/hexstrike/files、/config/hexstrike/output を作成します。

  2. 上流のハードコードされた /tmp/hexstrike_envs と /tmp/hexstrike_files のパスを、それぞれ /config/hexstrike/envs と /config/hexstrike/files へのシンボリックリンクに置き換えます。これにより、HexStrike がオンデマンドで構築するツールごとの Python 仮想環境と、ファイルマネージャーの読み書き領域がコンテナ再起動後も生存します。

  3. lsiown を使用して、永続ツリーの所有者を abc:abc に変更します (PUID/PGID を尊重)。

個々のツール実行によって作成される動的な /tmp/<tool>_output ディレクトリは シンボリックリンクされず、一時的なままです — 再起動後も出力を保持する必要がある場合は、 特定のツールを明示的に /config/hexstrike/output に向けてください。

Web デスクトップへのアクセス

ブラウザで https://<HOST>:3001/ を開き、上記で設定した CUSTOM_USER / PASSWORD の認証情報でログインします (HTTP デスクトップも TLS なしで ポート 3000 で利用可能です)。

ヘルスチェック

curl http://<HOST>:8888/health

HexStrike API サーバーから JSON を返し、コンテナ内の PATH 上で どのツールが利用可能として検出されたかを一覧表示します。

セキュリティ

[!WARNING] 8889 の MCP エンドポイントは、接続されたクライアントがコンテナ内で 攻撃的セキュリティツールの実行を自律的に駆動できるようにします — これは事実上 設計上リモートコード実行であり、設定した Bearer トークンによってのみ ゲートされます。

  • 常に HEXSTRIKE_MCP_TOKEN を設定してください。 openssl rand -hex 32 で 生成し、秘密に保ってください。空のままにすると MCP エンドポイントは 認証なしになります。

  • 信頼できる/隔離されたネットワークまたは VPN 上でのみ公開してください。 ポート 8889 (または 8888) をオープンなインターネットに公開しないでください。

  • 明示的にテストを許可されたシステムのみを対象にしてください。 この コンテナには、アクティブスキャン、エクスプロイト、認証情報攻撃などが可能な 実際の攻撃的セキュリティツールが同梱されています。

  • コンテナには NET_RAW と NET_ADMIN ケーパビリティが付与されています (docker-compose.yml / docker run の例を参照)。これは nmap SYN スキャン、 masscan、responder などの複数のツールが raw ソケットを必要とするためです。 これらは --privileged よりは狭いものの、依然として実質的に昇格されています。 それらのスキャンタイプが必要な場合にのみ付与してください。

  • 認証は最小限の ASGI ミドルウェア (hexstrike_mcp_http.py 内の BearerTokenASGIMiddleware) として実装されており、Authorization ヘッダーを定数時間比較で検査し、MCP アプリに到達する前に MCP パスへの 未認証リクエストを 401 で拒否します — streamable-HTTP/SSE レスポンス ストリームをバッファリングしたり、その他の方法で妨害したりしません。

ツールカバレッジ

ツールセットは厳選されたものであり、網羅的ではありません:

  • kali-linux-headless メタパッケージに加え、Dockerfile で明示的に 指定されたツール群 (HexStrike の /health エンドポイントがプローブするもの、 および一般的な偵察/Web/エクスプロイトユーティリティ) — 例: nmap、 masscan、gobuster、feroxbuster、ffuf、dirb、dirsearch、nikto、 sqlmap、wpscan、whatweb、wafw00f、hydra、john、hashcat、 medusa、evil-winrm、amass、dnsenum、dnsrecon、fierce、 theharvester、responder、nuclei、subfinder、httpx-toolkit、 arjun、paramspider、hakrawler、getallurls (gau)、netexec、 enum4linux-ng、smbclient、seclists、wordlists、binwalk、 foremost、steghide、exiftool、radare2、gdb。

  • ビルド時にソースからコンパイルされ、その後 Go ツールチェーンが 除去された 3 つの Go 製ツール: katana、dalfox、waybackurls。

  • rustscan。最新の GitHub リリースからインストールされます (.deb は rustscan.deb.zip アセット内に同梱されており、ビルドはインストール前に それを解凍します。ベストエフォート方式 — アセットを解決できない場合は ビルドはそれを含めずに続行します)。

上流の HexStrike が参照する一部の重量級またはライセンス付きツール — Ghidra、 IDA、Burp Suite Pro、Maltego、Nessus、および各種クラウド/フォレンジック ユーティリティ — は、ビルドを扱いやすく保つためにこのイメージには インストールされていません。

MCP ツールフィルタリング (モデル向けのツールを減らす)

上流は 約 150 個の MCP ツールを登録します。これは一部のモデルプロバイダーの 関数ツール上限 (OpenAI は約 128 個で上限) を超え、また CLI バイナリが インストールされていないために失敗するしかないツールも表面化させます。 これを回避するため、MCP サーバーはバッキングバイナリが存在しないツールを 非表示にします (MCP プロセスはツールと同じコンテナ内で実行されるため、 起動時に which でチェックされます)。一般的なビルドでは 150 個ではなく 約 115 個のツールが公開されます。起動ログには件数と非表示リストが出力されます。

コンテナの環境変数で制御します:

変数

デフォルト

効果

HEXSTRIKE_MCP_TOOL_FILTER

auto

auto はバイナリが欠落しているツールを非表示にします。off は全約 150 個を公開します。

HEXSTRIKE_MCP_INCLUDE_ONLY

(空)

カンマ区切りのホワイトリスト — これらのツールのみを公開します (auto を上書き)。

HEXSTRIKE_MCP_EXCLUDE_TOOLS

(空)

常に非表示にするカンマ区切りのツール。

HEXSTRIKE_MCP_KEEP_TOOLS

(空)

常に保持するカンマ区切りのツール (auto による削除から保護)。

上流ピンの更新

アップストリームのソースは、ビルド時に ARG HEXSTRIKE_REF(Dockerfile)で指定されたコミットでクローンされます。新しいアップストリームの変更を取り込むには、そのピンを更新して再ビルドしてください:

docker build -t hexstrike-ai:local --build-arg HEXSTRIKE_REF=<new-sha> .

または、Compose を使用する場合は、docker-compose.yml の build: キーの下にある args: HEXSTRIKE_REF: エントリのコメントを解除して設定し、docker compose up -d --build を実行してください。

クレジットとライセンス

  • HexStrike AI(0x4m4 作)— このイメージがパッケージ化するセキュリティ自動化プラットフォーム。MIT License の下でリリースされています。完全な条件については、アップストリームの LICENSE ファイルを参照してください。

  • linuxserver.io の kali-linux イメージ — Kali 環境と Web デスクトップを提供するベースイメージ。

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables authorized penetration testers to run reconnaissance, scanning, brute-force, exploitation, traffic capture, wordlist generation, and client-report workflows through MCP clients, with stdio/HTTP/SSE transport and OIDC bearer authentication.
    172 npm
    GPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables professional penetration testers to run authorized reconnaissance, scanning, exploitation, and reporting workflows through MCP tools such as nmap, ffuf, nuclei, hashcat, and report generation, with STDIO/HTTP/SSE transport and bearer/OIDC auth support.
    172 npm
    GPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables professional penetration testers to run reconnaissance, scanning, brute-force, exploitation, traffic capture, and reporting workflows through a unified MCP interface with STDIO, Streamable HTTP, and deprecated SSE transports plus bearer/OIDC authentication. Supports tools including nmap, gobuster, nikto, JtR, hashcat, subfinder, httpx, ffuf, nuclei, hydra, sqlmap, and wordlist generation.
    172 npm
    GPL 3.0
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables professional penetration testers to run reconnaissance, exploitation, brute-force, traffic capture, and reporting workflows through MCP-compatible stdio, HTTP, and SSE transports with integrated tools such as nmap, gobuster, nikto, John the Ripper, hashcat, and wordlist generation.
    172 npm
    GPL 3.0