ShyHurricane 是一个用于辅助人工智能进行进攻性安全测试的 MCP 服务器。它旨在解决在执行 shell 命令时观察到的一些问题:
服务器的一个重要功能是使用嵌入模型对网站内容进行索引。find_web_resources 工具使用 LLM 提示来查找特定于内容类型的漏洞:html、javascript、css、xml、HTTP 头。当工具找到内容时,会对其进行索引。也可以通过将外部数据馈送到 /index 端点来对内容进行索引。支持的格式有 katana jsonl、hal json 和 Burp Suite Logger++ CSV。存在针对 Burp Suite、ZAP、Firefox 和 Chrome 的扩展,可以在浏览站点时将请求发送到服务器。
提供了以下工具:
| 工具 | 描述 | 开放世界? |
|---|---|---|
| run_unix_command | 运行 Linux 或 macOS 命令并返回其输出。 | 否 |
| port_scan | 对目标执行端口扫描和服务识别,类似于 nmap 的功能。 | 是 |
| spider_website | 爬取网站并索引结果以进行进一步分析。 | 是 |
| directory_buster | 在网站中搜索隐藏的目录和文件。 | 是 |
| index_http_url | 索引 HTTP URL 以允许进一步分析。(即 curl) | 是 |
| find_wordlists | 查找可用于爬取和 run_unix_command 的词典列表。 | 否 |
| find_web_resources | 使用自然语言查询有关网站的已索引资源。 | 否 |
| fetch_web_resource_content | 获取已索引的 Web 资源的内容。 | 否 |
| find_domains | 查询已索引资源中的域名列表。 | 否 |
| find_hosts | 查询给定域名的已索引资源中的主机列表。 | 否 |
| find_netloc | 查询给定域名的已索引资源中的网络位置列表,即主机:端口。 | 否 |
| find_urls | 查询给定主机或域名的已索引资源中的 URL 列表。 | 否 |
| register_hostname_address | 注册主机名与 IP 地址。 | 否 |
| save_finding | 将发现保存为 Markdown。 | 否 |
| query_findings | 查询目标的先前发现。 | 否 |
| web_search | 使用提供的查询搜索网络。 | 是 |
| deobfuscate_javascript | 反混淆 JavaScript 内容(在索引期间自动完成)。 | 否 |
| deobfuscate_javascript_file | 反混淆 JavaScript 文件(在索引期间自动完成)。 | 否 |
| prompt_chooser | 为进攻性安全操作选择最佳提示。 | 否 |
| prompt_list | 提供可用于进攻性安全操作的提示标题列表。 | 否 |
| encoder_decoder | 通过应用常见的操作来转换输入。 | 否 |
| channel_create_forward | 创建由本地子进程支持的转发通道。 | 是 |
| channel_create_reverse | 为单个全双工客户端创建反向通道。 | 是 |
| channel_poll | 长轮询来自通道的事件。 | 是 |
| channel_send | 将字节写入通道的标准输入。 | 是 |
| channel_status | 检查通道是否已建立并准备好发送/接收。 | 是 |
| channel_close | 关闭特定通道。 | 是 |
| channel_close_all | 关闭所有通道。 | 是 |
| oast_health | 检查当前配置的 OAST 提供程序的健康状况/可达性。 | 是 |
| oast_endpoints | 获取可用于测试目标的带外交互的端点。 | 是 |
| oast_poll | 获取自上次轮询以来与 OAST 服务的新交互。 | 是 |
MCP 服务器需要 PyTorch 支持的 GPU,如 Nvidia 或 Apple Silicon。即使使用非本地 LLM,索引嵌入也需要 GPU。
可以通过启用“低功耗”模式来禁用使用嵌入的功能。
配置 .env:
echo LOW_POWER=true >> .env
docker compose up -d
或者
python3 mcp_service.py --low-power true
MCP 服务器本身使用 LLM 执行轻量任务,因此 llama3.2:3b 模型就足够了。推荐使用 Ollama,但不是必需的。也支持 OpenAI 和 Google AI 模型。Docker 是必需的,用于特定工具命令和通用 Unix 命令。
需要 Docker,并且网络堆栈的质量很重要。接受 Docker Desktop。在 macOS 上,Apple 虚拟化网络存在问题。使用 colima 和 qemu 虚拟化可以获得更好的效果。
如果使用 Homebrew,可以使用 brew bundle 进行安装。否则,请使用您的操作系统安装 colima、qemu、docker 和 docker-compose。
启动 colima,例如使用以下命令:
colima start --runtime docker --cpu 6 --disk 50 -m 12 --vm-type qemu
最好在主机上运行 nmap。如果未在主机上安装,则将使用 Docker 容器。
在 .env 中配置您所需的提供商和模型:
OLLAMA_MODEL=llama3.2:3b
OLLAMA_HOST=192.168.100.100:11434
GEMINI_API_KEY=
GEMINI_MODEL=
OPENAI_MODEL=
OPENAI_API_KEY=
运行 MCP 服务器:
docker compose up -d
或者从源代码构建镜像:
docker compose -f docker-compose.dev.yml up -d
在 http://127.0.0.1:8000/mcp 添加 MCP 服务器到您选择的客户端,或使用此仓库中的 assistant.py(见下文)。
$(command -v python3.12) -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
安装 Ollama 和 llama3.2:3b 模型:
Ubuntu:
apt-get install ollama
ollama pull llama3.2:3b
macOS:
brew install ollama
brew services start ollama
ollama pull llama3.2:3b
Chroma 作为 Python 环境的一部分安装。
chroma run --path chroma_store --host 127.0.0.1 --port 8200
docker build -t ghcr.io/double16/shyhurricane_unix_command:main src/docker/unix_command
使用 Ollama 和 llama3.2:3b:
python3 mcp_service.py
使用 OpenAI:
export OPENAI_API_KEY=xxxx
python3 mcp_service.py --openai-model=gpt-4-turbo
使用 Google AI:
export GOOGLE_API_KEY=xxxx
python3 mcp_service.py --gemini-model=gemini-2.0-flash
开放世界工具允许 LLM 接触互联网进行爬取、目录爆破等。有些情况下,这可能是不希望的,只应使用已索引的内容。
配置 .env:
OPEN_WORLD=false
重启 Docker:
docker compose up -d
或者
启动 MCP 服务器时使用 --open-world false:
python3 mcp_service.py --open-world false
助手提供了一个命令行聊天提示。虽然不复杂,但它提供了一种简单的方式来使用 MCP 服务器。服务器查询 MCP 提示以进行进攻性安全操作,助手将根据第一个用户提示选择适当的系统提示。
助手应使用比 MCP 服务器更大的推理模型。这个模型执行实际的工作,即查找漏洞和利用。
本地模型必须具有至少 16k 令牌的上下文大小。目前,MCP 工具 + 系统提示大约使用 10k。Ollama 模型可能宣传较大的上下文大小,但默认拉取通常是 4k 左右。很容易“构建”一个派生模型,只需增加上下文大小。请参阅 src/ollama 中的示例构建脚本。
$(command -v python3.12) -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python3 assistant.py --ollama-model gpt-oss-20b:32k
给助手指令,例如:
这些提示通过 MCP 协议公开。客户端如 5ire 可以使用它们,结果与使用助手脚本相同。
可以使用远程 Ollama 服务器:
python3 assistant.py --ollama-model gpt-oss-20b:32k --ollama-host 192.168.100.100:11434
export GOOGLE_API_KEY=xxxx
python3 assistant.py --gemini-model gemini-flash-latest
移除 Ollama 选项。在运行 MCP 服务器和助手之前设置以下环境变量。模型可以使用 --openai-model 设置。API 密钥必须是一个环境变量。
export OPENAI_API_KEY=xxxx
python3 assistant.py --openai-model o3
MCP 工具会在适当的情况下索引数据。例如,爬取和目录爆破。可以通过外部手段使用 /index 端点对数据进行索引。该端点不属于 MCP 工具或协议的一部分。
ingest.py 脚本使使用此端点更加方便。直接使用并不复杂。支持的数据格式会被推断出来。Katana JSON 是首选格式。
curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/index @katana.json
cat katana.jsonl | python3 ingest.py --mcp-url http://127.0.0.1:8000/ --katana
# 实时摄入:
tail -f katana.jsonl | python3 ingest.py --mcp-url http://127.0.0.1:8000/ --katana
最小导出字段:
cat LoggerPlusPlus.csv | python3 ingest.py --mcp-url http://127.0.0.1:8000/ --csv
# 使用 Logger++ 的自动导出功能实时摄入:
tail -f LoggerPlusPlus.csv | python3 ingest.py --mcp-url http://127.0.0.1:8000/ --csv
浏览器和拦截代理扩展可在以下 GitHub 仓库中找到:
浏览器扩展将 Chrome 和 Firefox 中的请求和响应转发到 MCP 服务器进行索引。存在控制范围内的域设置。
Burp Suite 和 ZAP 扩展将转发请求/响应以及警报/发现。警报被 LLM 使用以提高有效性。
带外应用程序安全性测试允许各种负载(如 XSS)回调。
默认的 OAST 提供程序是 webhook.site,无需身份验证。单个 webhook.site URL 发送的请求限制为 100 个。支持身份验证。
# webhook.site(无身份验证)
OAST_PROVIDER=webhook_site
# webhook.site(带有 API 密钥)
OAST_PROVIDER=webhook_site
WEBHOOK_API_KEY=xxxxxxxx-xxxx-...
支持 interactsh,但效果不佳。交互似乎会丢失。具体情况因人而异。
OAST_PROVIDER=interactsh
# 可选,如果没有指定则随机选择
INTERACT_SERVER=oast.pro
# 可选
INTERACT_TOKEN=
/status 端点是一个 HTTP POST 端点,不属于 MCP 服务器协议的一部分。
curl -X POST http://127.0.0.1:8000/status
MCP 服务器暴露一个代理端口,默认为 8010,用于提供索引内容。目的是在事后使用工具处理索引内容。例如,运行 nuclei 并将发现反馈到 MCP 服务器。
代理支持 HTTP 和 HTTPS,使用自签名证书。查看类似以下的日志行以找到 CA 证书,或向 /status 发送空正文。您可以配置工具忽略证书验证或信任此证书。
replay proxy listening on ('127.0.0.1', 8010), CA cert is at /home/user/.local/state/shyhurricane/127.0.0.1_8200/certs/ca.pem (CONNECT→TLS ALPN: h2/http1.1)
一个 curl 示例调用:
curl -x 127.0.0.1:8010 -k https://example.com
这是一个使用 Nuclei 在索引内容上被动提交发现的例子:
nuclei -proxy http://127.0.0.1:8010 -target https://example.com -j | curl http://127.0.0.1:8000/findings -H "Content-Type: text/json" --data-binary @-
如果 URL 或域名未被索引,404 页面将包含已索引 URL 的链接。一个爬取链接的工具可以使用这些链接找到索引内容。
助手旨在使用 shyhurricane MCP 服务器。然而,可以通过在 JSON 文件中配置其他 MCP 服务器并通过 --mcp-url 参数传递来使用它们。可以指定多个文件。
请参阅下面的示例。环境变量在 ${} 中进行插值。token 字段指定了要包含在请求中的 Authorization: Bearer 令牌。
[
{
"transport": "stdio",
"command": "python",
"args": ["-m", "othermcp.server"],
"env": {"WORKSPACE_PATH": "/home/user/workspace", "API_KEY": "${API_KEY}"},
"max_retries": 3
},
{
"transport": "streamable_http",
"url": "https://mcp.example.com/mcp",
"token": "Bearer ${TOKEN}",
"timeout": 60
},
{
"transport": "sse",
"url": "https://legacy.example.com/sse",
"token": "${SSE_TOKEN}"
}
]