Skip to main content
Glama
acaranta

hexstrike-ai

by acaranta

HexStrike AI — Docker + 远程 MCP

基于 linuxserver.io Kali 基础镜像的 Docker 化 HexStrike AI,并附带一个新的远程、可流式 HTTP MCP 服务器,使得完整的 HexStrike 工具集可以通过网络(例如从 Claude Code)驱动,而不仅仅是从本地 stdio 客户端。

[!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,一个可流式 HTTP MCP 服务器,在端口 8889(路径 /mcp)上通过网络暴露所有上游 @mcp.tool() 定义,因此可以远程驱动,而不仅仅是通过本地 stdio。

  • 可选的 bearer token 认证,保护 MCP 端点。

  • 可通过浏览器访问的 KDE 桌面(Selkies/KasmVNC,继承自基础镜像),用于在自动化工具运行的同时进行交互式工作。

  • s6-overlay v3 进程监督,具有显式的服务排序 — MCP 服务等待 HexStrike API 服务器被定义为依赖项。

  • 持久化的 /config 卷:每个工具的 virtualenv 和文件管理器状态在容器重启后仍然存在。

  • 可重现的构建:uv 管理 Python 环境,上游源码在固定的 git 提交处拉取,而不是 vendored。

概述

上游 HexStrike AI 提供了两个 Python 入口点:

  • hexstrike_server.py — 一个 Flask API 服务器,监听端口 8888,通过 subprocess 执行 150+ 外部安全工具,并通过 HTTP 暴露其结果(包括一个报告工具可用性的 /health 端点)。

  • hexstrike_mcp.py — 一个 FastMCP 服务器,将 MCP 工具调用转换为对上述 API 服务器的 HTTP 调用。上游仅通过 stdio 传输运行它,因此只能由与容器在同一台机器上的 MCP 客户端驱动。

此仓库添加了 hexstrike_mcp_http.py,它导入上游的 hexstrike_mcp.py 模块并整体重用其 setup_mcp_server() 函数 — 每个工具定义,不变 — 但通过 MCP 可流式 HTTP 传输在端口 8889 的路径 /mcp 上提供服务,而不是 stdio。这是唯一的功能差异:相同的工具表面,可以远程访问(例如从运行在不同机器上的 Claude Code),而不是仅从同地进程访问。

uv(Astral)管理 Python 解释器和依赖环境,并在容器启动时用于运行两个进程。

架构

  • 基础镜像: lscr.io/linuxserver/kali-linux:latest,提供可通过浏览器访问的 KDE 桌面(Selkies/KasmVNC),端口 3000(HTTP)和 3001(HTTPS),Kali-rolling apt 仓库,以及 s6-overlay v3 init。

  • 添加的服务: 两个 s6-overlay longrun 服务叠加在基础镜像的 init 系统之上,并注册在 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 服务器之后启动。

  • 上游源码未 vendored。 Dockerfile 在构建时 git clone 0x4m4/hexstrike-ai 并检出固定的提交(ARG HEXSTRIKE_REF,默认 d689933ff579d839c676c82b231f8e98326c5f04),仅将 hexstrike_server.py、hexstrike_mcp.py 和 hexstrike-ai-mcp.json 复制到 /app。这保持了仓库的小巧,并使上游升级成为一行更改。

  • 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 身份运行(参见 持久化)。

端口

端口

协议

描述

3000

HTTP

Web 桌面(Selkies/KasmVNC),继承自 linuxserver Kali 基础镜像

3001

HTTPS

Web 桌面,TLS

8888

HTTP

HexStrike AI API 服务器(hexstrike_server.py)

8889

HTTP

HexStrike AI MCP 服务器,可流式 HTTP 传输,端点路径 /mcp

快速开始

Docker Compose(推荐)

所有配置直接位于 docker-compose.yml 中 — 没有 .env 文件。在首次启动之前,编辑 environment: 块并设置:

  • HEXSTRIKE_MCP_TOKEN — MCP 端点的 bearer token。使用 openssl rand -hex 32 生成一个强值并粘贴进去(或留空以使用开放端点 — 仅限隔离网络上的实验室/CTF)。

  • CUSTOM_USER / PASSWORD — Web 桌面的基本认证登录。

然后构建并启动:

# 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 wheel(因此镜像中包含 build-essential 和开发头文件),从源码构建三个 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> 头;只有在 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 可流式 HTTP 传输具有内置的 DNS 重绑定保护,默认只信任 localhost 的 Host 头。此镜像默认禁用此检查,以便你可以通过 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-auth 用户名(linuxserver Kali 基础镜像)。

PASSWORD

docker-compose.yml

changeme

Web 桌面的 Basic-auth 密码。

HEXSTRIKE_MCP_TOKEN

docker-compose.yml

(空)

:8889/mcp 端点所需的 Bearer token。请将其设置为 openssl rand -hex 32 生成的值;仅在隔离/开放实验室环境中才可留空。

HEXSTRIKE_SERVER_PORT

可选,docker-compose.yml 中有注释示例

8888

HexStrike API 服务器绑定的端口。两个 s6 运行脚本都会读取该值;如果更改它,还必须更新已发布的端口映射。

HEXSTRIKE_MCP_PORT

可选,docker-compose.yml 中有注释示例

8889

MCP streamable-HTTP 服务器绑定的端口(注意事项同上)。

HEXSTRIKE_MCP_HOST

可选

0.0.0.0

MCP 服务器绑定的网络接口;由 hexstrike-mcp 运行脚本直接透传,并被 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 运行脚本只传递 --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 将持久化目录树 chown 为 abc:abc(遵循 PUID/PGID)。

各个工具运行期间创建的动态 /tmp/<tool>_output 目录不会被符号链接,并且保持临时性 — 如果你需要某工具的输出在重启后保留,请将该工具显式指向 /config/hexstrike/output。

Web 桌面访问

在浏览器中打开 https://<HOST>:3001/,使用上面配置的 CUSTOM_USER / PASSWORD 凭据登录(HTTP 桌面也可在端口 3000 上无 TLS 访问)。

健康检查

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

从 HexStrike API 服务器返回 JSON,列出容器内 PATH 上检测为可用的工具。

安全

[!WARNING] 8889 上的 MCP 端点允许已连接的客户端自主驱动容器内攻击性安全工具的执行 — 这本质上就是设计上的远程命令执行,仅受你配置的 bearer token 约束。

  • 始终设置 HEXSTRIKE_MCP_TOKEN。 使用 openssl rand -hex 32 生成并保密。将其留空会使 MCP 端点无需认证。

  • 仅在受信任/隔离的网络或 VPN 上暴露此服务。 不要将端口 8889(或 8888)发布到公共互联网。

  • 仅针对你被明确授权测试的系统。 该容器内置了真实的攻击性安全工具,能够进行主动扫描、漏洞利用、凭据攻击等。

  • 容器被授予 NET_RAW 和 NET_ADMIN 能力(参见 docker-compose.yml / docker run 示例),因为多个工具 — nmap SYN 扫描、masscan、responder 等 — 需要原始套接字。这些权限比 --privileged 更窄,但仍然有实质性的提升;仅当你需要这些扫描类型时才授予它们。

  • 认证实现为一个极简的 ASGI 中间件(hexstrike_mcp_http.py 中的 BearerTokenASGIMiddleware),它使用常数时间比较检查 Authorization 头,并在未认证请求到达 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 构建的工具在构建时从源码编译,然后剥离 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 服务器隐藏任何缺少底层二进制的工具(启动时用 which 检查,因为 MCP 进程与工具运行在同一个容器中)。典型的构建暴露约 115 个工具而不是 150 个。启动日志会打印数量和隐藏列表。

通过容器上的环境变量控制:

变量

默认值

作用

HEXSTRIKE_MCP_TOOL_FILTER

auto

auto 隐藏缺少二进制的工具;off 暴露全部约 150 个。

HEXSTRIKE_MCP_INCLUDE_ONLY

(空)

逗号分隔的白名单 — 仅暴露这些工具(覆盖 auto)。

HEXSTRIKE_MCP_EXCLUDE_TOOLS

(空)

始终隐藏的逗号分隔工具列表。

HEXSTRIKE_MCP_KEEP_TOOLS

(空)

始终保留的逗号分隔工具列表(保护它们不被自动丢弃)。

更新上游固定版本

上游源代码在构建时按 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 文件。

  • 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