电蓝MCP服务器(防御重点评估工具包)
该项目提供了一个模型上下文协议(MCP)服务器,在一个隔离的基于Kali的Docker容器中公开了常见的web渗透测试实用程序。它仅用于针对您拥有或明确授权评估的系统进行道德测试。
为什么是“电蓝”?
蓝色让人联想到防御性网络安全(“蓝队”)。Electric Blue MCP服务器重新构建了用于受控、授权侦察和漏洞暴露映射的工具集,并进行了输入净化和能力最小化。
包含的工具
- 扫描器
- 无
- sqlmap
- wpscan
- dirb(当提供像/login.php这样的文件路径时,会自动进行URL规范化)
- searchsploit(exploitdb)
- dnsrecon
- grype(漏洞扫描)
- syft(SBOM一代)
环境变量
| 变量 | 目的 | 默认值 |
|---|---|---|
PENTEST_TIMEOUT | 工具可以运行的最长秒数 | 300 |
PENTEST_MAX_OUTPUT | 捕获输出的最大字节数 | 60000 |
PENTEST_DEFAULT_THREADS | 保留供将来使用 | 4 |
WPSCAN_API_TOKEN | WPScan API令牌(可选) | (空) |
构建与运行
# Build image
docker build -t electric-blue-mcp .
# Run container (no privileged mode; network tools need raw sockets which we set via setcap)
docker run --rm -it \
-e PENTEST_TIMEOUT=2000 \
-e PENTEST_MAX_OUTPUT=60000 \
electric-blue-mcp服务器会自动启动,并根据MCP的期望通过stdio进行监听。
使用预构建映像(Docker Hub)
如果您不想在本地构建,请拉取已发布的映像(替换 latest 如果可用,则带有版本标签):
docker pull abhishekchoudharry/electric-blue-mcp:latest然后像以前一样运行它,但要引用远程映像名称:
docker run --rm -it \
-e PENTEST_TIMEOUT=300 \
-e PENTEST_MAX_OUTPUT=60000 \
abhishekchoudharry/electric-blue-mcp:latest使用注册表映像的好处:
- 在构建过程中没有本地构建工具链或大型基础映像下载。
- 一致、可复制的环境(每个人都拉相同的层)。
- 加快新用户的入职流程。
当您在本地更新并希望发布时:
docker build -t electric-blue-mcp .
docker tag electric-blue-mcp:latest abhishekchoudharry/electric-blue-mcp:0.1.0
docker tag electric-blue-mcp:latest abhishekchoudharry/electric-blue-mcp:latest
docker push abhishekchoudharry/electric-blue-mcp:0.1.0
docker push abhishekchoudharry/electric-blue-mcp:latest(可选)扫描推送的图像是否存在漏洞:
docker pull abhishekchoudharry/electric-blue-mcp:latest
grype abhishekchoudharry/electric-blue-mcp:latest要强制更新(绕过本地缓存):
docker pull --quiet --disable-content-trust=false abhishekchoudharry/electric-blue-mcp:latest如果您需要在MCP配置中固定特定版本(建议用于稳定性),请使用标签: abhishekchoudharry/electric-blue-mcp:0.1.0 而不是 latest.
MCP客户端集成(示例)
配置支持MCP的客户端(例如支持模型上下文协议的AI助手)以启动容器。您可以使用本地构建的映像或已发布的Docker Hub映像。
选项A:本地图像
command: docker
args: ["run","--rm","-e","PENTEST_TIMEOUT=300","-e","PENTEST_MAX_OUTPUT=60000","electric-blue-mcp"]选项B:Docker Hub镜像(固定或最新)
command: docker
args: ["run","--rm","-e","PENTEST_TIMEOUT=300","-e","PENTEST_MAX_OUTPUT=60000","abhishekchoudharry/electric-blue-mcp:latest"]为可重复性固定一个特定版本:
args: ["run","--rm","-e","PENTEST_TIMEOUT=300","-e","PENTEST_MAX_OUTPUT=60000","abhishekchoudharry/electric-blue-mcp:0.1.0"]可用工具功能
使用 tool_info 查看运行时列表。
| 工具 | 描述 | 关键参数 |
|---|---|---|
nmap_scan | 基本nmap扫描 | 目标、标志、超时秒数 |
nikto_scan | Web服务器扫描 | 目标,超时秒数 |
sqlmap_scan | SQL注入测试 | 目标(URL)、标志、超时秒数 |
wpscan_site | WordPress扫描 | url、api_token、timeout_seconds |
dirb_scan | 目录暴力破解(自动将文件url标准化到目录) | url、单词表、超时秒数 |
search_exploit | 搜索exploitdb | 查询,超时秒数 |
dnsrecon_scan | DNS枚举(有限标志) | 域、标志、超时秒数 |
grype_scan | 漏洞扫描(包、操作系统、库) | target(image/dir)、timeout_seconds |
syft_scan | SBOM生成 | 目标(图像/目录)、格式(可选)、超时秒数 |
tool_info | 列出工具 | 名称 |
输入消毒
正则表达式过滤限制了输入;只传递简单的、长度有限的标志。拒绝潜在危险的构造(shell元字符、命令链、重定向)和过长的输入。 dirb_scan 额外规范URL:如果您提供了一个以可能文件结尾的路径(例如。 /login.php)它修剪到父目录并附加一个尾随 /.
大输出被截断为 PENTEST_MAX_OUTPUT 带有尾随标记的字节。
执行模型和能力
Docker镜像创建了一个专用的非root用户 pentest (家: /home/pentest)并在启动MCP服务器之前切换到它(USER pentest).如果包裹的工具受到损害,这种最小特权默认值会减小爆炸半径。
能力(setcap)被狭义地应用于 nmap 二进制文件,因此某些扫描类型(例如SYN扫描)可以在没有完整根的情况下运行:
setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip /usr/bin/nmap
setcap cap_net_raw,cap_net_bind_service+eip /usr/lib/nmap/nmap如果你明确通过 --user root 在本地MCP客户端配置中(如一个示例所示),您 覆盖 这种安全默认。移除 --user root 除非您有特定原因(例如,调试功能边缘情况)。大多数操作应该像 pentest 用户。
摘要:
- 默认容器执行:非root(
pentest). - 使用率提高:仅当您使用以下命令运行容器时
--user root手动。 - 建议:保留非root,临时诊断除外。
漏洞和SBOM扫描
捆绑了两种以供应链为重点的工具:
grype_scan:快速枚举映像或目录中的已知漏洞(严重程度可忽略不计;默认情况下在包装器中没有失败,但使用--fail-on negligible内部用于一致的退出代码)。syft_scan:以允许的格式生成软件物料清单(SBOM)(table,json,spdx-json).
示例(来自您的MCP客户端):
grype_scan target: electric-blue-mcp:latestsyft_scan target: electric-blue-mcp:latest format: spdx-json假设和范围(概念证明)
这种实现有意地最小化,并带有几个明确的假设:
| 面积 | 假设 |
|---|---|
| 授权 | 用户具有扫描指定目标的明确合法权限。 |
| 性能 | 扫描速度和资源使用尚未优化;正确性和安全性>性能。 |
| 图像大小 | 基础Kali图像加工具集产生相对较大的图像;足迹减少不在PoC的范围内。 |
| 工具许可 | 仅包括开源工具(nmap、nikto、sqlmap、wpscan、dirb、searchsploit、dnsrecon、grype、syft)。 |
| 漏洞 | 上游包可能包含已知的CVE; grype_scan 但不进行自动修补。 |
| 安全模型 | 工具以root身份运行(nmap功能除外),输入经过净化;无法保证上游工具中固有的所有特权升级向量。 |
| 网络环境 | 容器可以访问出站网络,以访问目标并(在构建过程中)获取依赖关系。 |
| 输出处理 | 大输出被截断 PENTEST_MAX_OUTPUT;部分结果可用于侦察环境。 |
| 测井/遥测 | 无外部遥测采集;仅使用stdout/stdio MCP通信。 |
| 状态持久性 | 容器是短暂的;除非手动挂载,否则在运行时stdout之外不会持久存在扫描工件。 |
如果这些假设中的任何一个发生了变化(例如,需要性能调优、图像强化或私有工具),则应重新审视架构和Dockerfile。
道德与法律声明
您必须只扫描或测试您拥有或具有书面测试权限的资产。未经授权的访问或探测可能违反法律和政策。维护者和作者对误用不承担任何责任。
故障排除
- 非常大的扫描可能会截断每分钟的输出
PENTEST_MAX_OUTPUT. - 延长扫描可能会超时;调整
PENTEST_TIMEOUT. - WPScan API增强功能需要
WPSCAN_API_TOKEN.
发展
更新依赖关系/无缓存重建:
docker build --no-cache -t electric-blue-mcp .GitHub Copilot MCP集成
GitHub Copilot Chat(支持MCP)可以通过Docker启动此服务器。复制 mcp.json 到您当地的Copilot MCP配置位置,并在需要时进行调整。
典型的用户级配置路径示例(如果目录不存在,则创建该目录):
- 窗户:
%UserProfile%\\AppData\\Roaming\\GitHub Copilot\\mcp.json - macOS:
~/Library/Application Support/GitHub Copilot/mcp.json - Linux:
~/.config/github-copilot/mcp.json
当前参考配置(镜像 .vscode/mcp.json):
{
"servers": {
"electric-blue": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e","PENTEST_TIMEOUT=2000",
"-e","PENTEST_MAX_OUTPUT=60000",
"--user","root",
"electric-blue-mcp"
]
}
}
}笔记:
-i确保MCP JSON-RPC在stdio上的交互式STDIN。--user root匹配本地开发配置;大多数工具的功能都是无特权的,但nmap的功能可能需要根/上下文细节。如果愿意,您可以删除此项并依赖容器的默认非root用户。- 调整
PENTEST_TIMEOUT向下(例如300)以在代理上下文中实现更快的返回约束。
替代方案(拉取远程映像而不是本地构建):
{
"servers": {
"electric-blue": {
"command": "docker",
"args": [
"run","--rm","-i",
"-e","PENTEST_TIMEOUT=300",
"-e","PENTEST_MAX_OUTPUT=60000",
"--user","root",
"abhishekchoudharry/electric-blue-mcp:latest"
]
}
}
}如果固定了版本标签,请更换 latest 与(例如) 0.1.0.
保存配置后,重新启动Copilot Chat/VS Code,让它发现新的MCP服务器。然后问Copilot tool_info 在...之下 electric-blue 服务器上下文。
更新图像
如果修改代码,请重新生成:
docker build -t electric-blue-mcp .FastMCP导入问题
如果在容器内看到以下错误 ModuleNotFoundError: No module named 'fastmcp':
- 确认虚拟环境路径:
/opt/venv/bin/python -c "import sys; print(sys.executable)" - 确保
requirements.txt仍然列出固定版本。 - 无缓存重建:
docker build --no-cache -t electric-blue-mcp .- 运行快速验证:
docker run --rm electric-blue-mcp python -c "import fastmcp, platform; print('fastmcp OK on', platform.python_version())"如果失败,请检查网络访问是否有依赖性下载,以及基本映像是否仍然支持 python3-venv.
持续集成/Docker发布
GitHub操作工作流(.github/workflows/docker-publish.yml)在每个拉取请求目标上构建映像 main (或 master).它有条件地推动 latest 标记到Docker Hub 仅 当pull请求来自基础存储库(而不是fork)时,以避免泄露机密。
触发条件
- 事件:
pull_request(分支机构:main,master) - 筛选的路径:Dockerfile、关键源文件、需求和工作流文件本身
- 手动触发:
workflow_dispatch
标签
目前,工作流只发出一个标签: latest. (您稍后可以使用git refs或常规提交使用版本标记进行扩展。)
必需的秘密
将这些添加到存储库设置中→ 秘密和变量→ 行动:
DOCKERHUB_USERNAME–您的Docker Hub帐户名(仓库所有者)abhishekchoudharry/electric-blue-mcp)DOCKERHUB_TOKENDocker Hub访问令牌(不是您的密码)
安全控制
- 分叉的PR构建但做 不 推送(通过条件检查跳过登录和推送步骤
head.repo.full_name). - 通过以下方式进行层缓存
actions/cache减少重建时间。 - 单个作业使管道保持简单;不需要特权跑步者。
推送前的最小本地测试
(可选)在本地复制构建:
docker build -t electric-blue-mcp .如果成功,打开或更新PR-CI将镜像构建。
扩展(未来想法)
- 添加a
push在合并到main用于自动释放latest. - 引入语义版本标记(源自git标记)并同时推送两者
vx.y.z和latest. - 添加a
grype扫描作业在严重漏洞上失败(取决于策略)。 - 使用发布软件物料清单工件
syft并通过上传actions/upload-artifact. - 通过作业步骤输出将图像摘要摘要附加到PR。
故障排除
- 未找到机密:确保两个机密都已定义(区分大小写)。
- 身份验证失败:重新生成Docker Hub令牌并更新密钥。
- 构建缓存会错过每次运行:检查缓存路径
/tmp/.buildx-cache坚持工作(应该);验证缓存密钥没有意外更改。 - 未发生推送:确认PR来自基础仓库;叉PR故意跳过推。
许可证
仅供教育使用。使用前验证是否符合法律规定。
