hexstrike-ai
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: MCP Tools
機能
完全なアップストリームの HexStrike AI ツールキット — Flask API を通じて操作される 150 以上のセキュリティツール — を Kali ベースのイメージにプリインストール。手動での環境構築は不要です。
新機能:
hexstrike_mcp_http.py— アップストリームのすべての@mcp.tool()定義をポート8889(パス/mcp)でネットワーク経由に公開する streamable-HTTP MCP サーバー。ローカルの stdio 経由だけでなく、リモートからも操作できます。MCP エンドポイントを保護するオプションのベアラートークン認証。
自動化されたツール実行と並行して対話的に作業できる、ブラウザからアクセス可能な KDE デスクトップ(Selkies/KasmVNC、ベースイメージから継承)。
s6-overlayv3 によるプロセス監視と明示的なサービス順序 — 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-overlayv3 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 サーバー ( |
8889 | HTTP | HexStrike AI MCP サーバー、streamable-HTTP トランスポート、エンドポイントパス |
クイックスタート
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値に設定してください。
環境変数
変数 | 設定場所 | デフォルト | 説明 |
|
|
| linuxserver の慣例: コンテナ内で |
|
|
| linuxserver の慣例: |
|
|
| コンテナのタイムゾーン。 |
|
|
| Web デスクトップの Basic 認証ユーザー名 (linuxserver Kali ベースイメージ)。 |
|
|
| Web デスクトップの Basic 認証パスワード。 |
|
| (空) |
|
| 任意、 |
| HexStrike API サーバーがバインドするポート。 |
| 任意、 |
| MCP streamable-HTTP サーバーがバインドするポート (上記と同じ注意事項)。 |
| 任意 |
| MCP サーバーがバインドするインターフェース。 |
| 任意、 | (空) | トランスポートの DNS リバインディング保護用の、カンマ区切りの |
| 任意、 |
| 公開する 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 として実行され、以下を行います:
/config/hexstrike/envs、/config/hexstrike/files、/config/hexstrike/outputを作成します。上流のハードコードされた
/tmp/hexstrike_envsと/tmp/hexstrike_filesのパスを、それぞれ/config/hexstrike/envsと/config/hexstrike/filesへのシンボリックリンクに置き換えます。これにより、HexStrike がオンデマンドで構築するツールごとの Python 仮想環境と、ファイルマネージャーの読み書き領域がコンテナ再起動後も生存します。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/healthHexStrike 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の例を参照)。これはnmapSYN スキャン、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 個のツールが公開されます。起動ログには件数と非表示リストが出力されます。
コンテナの環境変数で制御します:
変数 | デフォルト | 効果 |
|
|
|
| (空) | カンマ区切りのホワイトリスト — これらのツールのみを公開します (auto を上書き)。 |
| (空) | 常に非表示にするカンマ区切りのツール。 |
| (空) | 常に保持するカンマ区切りのツール (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 デスクトップを提供するベースイメージ。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceAn MCP server that integrates various penetration testing tools, enabling security professionals to perform reconnaissance, vulnerability scanning, and API testing through natural language commands in compatible LLM clients like Claude Desktop.7
- AlicenseNot gradedqualityAmaintenanceA passive MCP server that exposes a toolbox of executable tools (shell, network, HTTP, AI search, SSH, S3 file operations) to autonomous agents via Streamable HTTP, with strong security features including Docker sandboxing and WAF.2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceAI-driven penetration testing MCP server that equips Claude with 13 tools for automated reconnaissance, analysis, vulnerability validation, and exploitation.2GPL 3.0
- AlicenseNot gradedqualityBmaintenanceConfig-driven MCP server that exposes Kali Linux penetration testing tools to AI agents, with automatic tool discovery, man page integration, and local/remote execution modes.MIT
Related MCP Connectors
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
AI Reasoning Cache & Consensus Layer with 11 MCP tools via Streamable HTTP.
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/acaranta/hexstrike-docker-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server