返回市场
石药飓风

石药飓风

作者:double162 星标更新:2025-11-22

项目介绍

shyhurricane

<img src="shyhurricane/assets/shyhurricane.png" alt="Hurricane picking padlock logo" width="150" style="float: left; margin-right:10px;" />

ShyHurricane 是一个用于辅助人工智能进行进攻性安全测试的 MCP 服务器。它旨在解决在执行 shell 命令时观察到的一些问题:

  1. 爬虫和目录爆破命令可能会产生大量噪音且运行时间较长。LLM 将经过几次迭代以选择合适的命令和选项。该服务器提供爬虫和爆破工具,以持续地向 LLM 提供可用的结果。
  2. 模型还会使用许多 curl 命令枚举网站。服务器保存并索引响应,以便无需重复联系网站即可返回数据。大型网站(常见于漏洞赏金计划中)无法通过单独的 curl 命令高效枚举。
  3. 端口扫描可能需要很长时间,导致 LLM 认为扫描失败并发出重复扫描。服务器提供的端口扫描工具解决了这个问题。

服务器的一个重要功能是使用嵌入模型对网站内容进行索引。find_web_resources 工具使用 LLM 提示来查找特定于内容类型的漏洞:html、javascript、css、xml、HTTP 头。当工具找到内容时,会对其进行索引。也可以通过将外部数据馈送到 /index 端点来对内容进行索引。支持的格式有 katana jsonlhal 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 服务的新交互。

GPU

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 Desktop 或 colima

需要 Docker,并且网络堆栈的质量很重要。接受 Docker Desktop。在 macOS 上,Apple 虚拟化网络存在问题。使用 colimaqemu 虚拟化可以获得更好的效果。

如果使用 Homebrew,可以使用 brew bundle 进行安装。否则,请使用您的操作系统安装 colimaqemudockerdocker-compose

启动 colima,例如使用以下命令:

colima start --runtime docker --cpu 6 --disk 50 -m 12 --vm-type qemu

nmap

最好在主机上运行 nmap。如果未在主机上安装,则将使用 Docker 容器。

Docker Compose

作为 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(见下文)。

从源代码运行

Python 环境

$(command -v python3.12) -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

Ollama

安装 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 数据库

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

MCP 服务器

使用 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

给助手指令,例如:

  • 解决位于 10.129.10.10 的 CTF 挑战
  • 解决位于 10.129.10.10 的 HTB CTF 挑战(Hack-the-Box 特定代理)
  • 帮我找到 https://example.com 的漏洞(聊天)
  • 找出 https://example.com 的所有漏洞(代理)

这些提示通过 MCP 协议公开。客户端如 5ire 可以使用它们,结果与使用助手脚本相同。

Ollama 远程服务器

可以使用远程 Ollama 服务器:

python3 assistant.py --ollama-model gpt-oss-20b:32k --ollama-host 192.168.100.100:11434

Google AI

export GOOGLE_API_KEY=xxxx
python3 assistant.py --gemini-model gemini-flash-latest

OpenAI

移除 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

katana

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

Burp Logger++ CSV

最小导出字段:

  • Request.AsBase64
  • Request.Time
  • Request.URL
  • Response.AsBase64
  • Response.RTT
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 使用以提高有效性。

OAST

带外应用程序安全性测试允许各种负载(如 XSS)回调。

webhook_site

默认的 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-...

interact.sh

支持 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 的链接。一个爬取链接的工具可以使用这些链接找到索引内容。

MCP 服务器

助手旨在使用 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}"
  }
]