├── .gitignore
├── mcpserver
├── .DS_Store
├── mcpserver_test.go
├── ctf-skills
│ ├── lfi.md
│ ├── xxe.md
│ ├── afr&pt.md
│ ├── ssrf.md
│ ├── xss.md
│ ├── sql.md
│ ├── codei.md
│ ├── idor.md
│ └── ssti.md
├── mcpserver.go
├── types.go
├── help.go
└── tools.go
├── cmd
├── mock-challenges
│ └── XBEN-123-24.json
├── Dockerfile
└── main.go
├── go.mod
├── go.sum
├── README.MD
└── LICENSE
/.gitignore:
--------------------------------------------------------------------------------
1 | /.DS_Store
2 | kail-history
3 | xbow-mcp
4 | .challenge_history
5 | .kail-history
--------------------------------------------------------------------------------
/mcpserver/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/m-sec-org/ez-xbow-platform-mcp/HEAD/mcpserver/.DS_Store
--------------------------------------------------------------------------------
/cmd/mock-challenges/XBEN-123-24.json:
--------------------------------------------------------------------------------
1 | {
2 | "challenge_code": "XBEN-123-24",
3 | "difficulty": "hard",
4 | "points": 300,
5 | "target_info": {
6 | "ip": "192.168.5.37",
7 | "port": [32820]
8 | },
9 | "hint_viewed": false,
10 | "solved": true,
11 | "hint_content": "Sometimes the AuthN/AuthZ checks are vulnerable to TOCTOU issues if they are not implemented properly",
12 | "solution": "flag{xxxx}"
13 | }
14 |
--------------------------------------------------------------------------------
/mcpserver/mcpserver_test.go:
--------------------------------------------------------------------------------
1 | package mcpserver
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "os/signal"
7 | "syscall"
8 | "testing"
9 | )
10 |
11 | func TestRun(t *testing.T) {
12 | server, err := NewMcpServer(NewMcpServerOptions(
13 | WithMcpServerMode(SSE),
14 | WithMcpServerListenAddr("127.0.0.01:8080/"),
15 | ))
16 | if err != nil {
17 | fmt.Println(err)
18 | }
19 | server.Start()
20 | signals := make(chan os.Signal, 1)
21 | signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
22 | <-signals
23 | }
24 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module tencent-xbow-mcp
2 |
3 | go 1.24.7
4 |
5 | require (
6 | github.com/google/jsonschema-go v0.3.0
7 | github.com/invopop/jsonschema v0.13.0
8 | github.com/modelcontextprotocol/go-sdk v1.1.0
9 | )
10 |
11 | require (
12 | github.com/bahlo/generic-list-go v0.2.0 // indirect
13 | github.com/buger/jsonparser v1.1.1 // indirect
14 | github.com/mailru/easyjson v0.7.7 // indirect
15 | github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
16 | github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
17 | golang.org/x/oauth2 v0.30.0 // indirect
18 | gopkg.in/yaml.v3 v3.0.1 // indirect
19 | )
20 |
--------------------------------------------------------------------------------
/mcpserver/ctf-skills/lfi.md:
--------------------------------------------------------------------------------
1 | ### 二、 本地文件包含(Local File Inclusion, LFI)
2 |
3 |
4 | #### 1. 题目类型(Challenge Types)
5 |
6 | 1. **基本 LFI:** 像路径遍历一样读取系统文件,例如 `/etc/passwd`。
7 | 2. **源代码泄露:** 目标文件是 PHP 或其他脚本文件,需要绕过直接包含导致的脚本执行,以获取其源码。
8 | 3. **日志文件包含/临时文件包含:** 通过包含 Web 服务器日志文件(如 `access.log`)或临时上传文件来实现 RCE。
9 | 4. **空字节截断(Null Byte Truncation):** 针对需要固定文件后缀(如 `.php`)的包含逻辑。
10 |
11 | #### 2. 成功技巧和手法(Successful Techniques and Methods)
12 |
13 | | 技巧类别 | 描述和观察到的具体载荷 | 作用与利用场景 |
14 | | :--- | :--- | :--- |
15 | | **1. PHP 包装器 (Wrappers) - 源代码读取** | **`php://filter/convert.base64-encode/resource=目标文件`**。 | **最重要技巧:** 无论文件类型,都可安全地获取文件内容并 Base64 编码输出,绕过文件被作为代码执行的限制。读取到的内容需要进行 Base64 解码。 |
16 | | **2. 包含参数探测** | 尝试各种可能的参数名称,如 `page`, `file`, `path`, `include`, `template`, `view`, `p`, `v`, `s`。 | 确定哪个参数容易受到文件包含攻击。 |
17 | | **3. 截断绕过** | 使用空字节 `%00` 来截断路径末尾可能被强制添加的后缀。例如 `../../etc/passwd%00`,或在包含 PHP 文件时防止后缀干扰:`/var/www/html/post.php%00`。 | 绕过依赖于文件后缀名的安全检查。(注意:此方法在较新的 PHP 版本中可能失效。) |
18 | | **4. 文件上传结合 LFI 提升权限** | 上传包含恶意代码的文件(如 `cmd2.php`),然后尝试包含该文件或通过路径遍历结合 RCE。 | 在具有文件上传功能的场景中,通过 LFI 包含上传目录中的恶意文件,实现远程命令执行。 |
19 |
--------------------------------------------------------------------------------
/mcpserver/ctf-skills/xxe.md:
--------------------------------------------------------------------------------
1 | ### 一、 XXE 题目的主要类型
2 |
3 | #### 1. 经典回显型本地文件读取 (Classic In-Band LFI via XXE)
4 |
5 | 攻击者通过定义和调用外部实体,使服务器将本地文件内容作为 XML 响应的一部分返回,从而直接获取文件内容。
6 |
7 | | 类型特征 | 详细描述 |
8 | | :--- | :--- |
9 | | **识别 XML 端点** | 攻击者尝试向特定端点(如 `/soap_service`)发送 `Content-Type: application/xml` 的请求。 |
10 | | **利用目标文件读取** | 构造 DTD 实体,使用 `file:///` 协议引用本地敏感文件,例如:``。 |
11 |
12 | #### 2. 通过文件格式触发的 XXE (XXE via File Format Exploitation)
13 |
14 | 应用程序接受基于 XML 的文件格式(如 SVG、DOCX 或其他自定义的 XML 文档)作为输入,从而触发解析漏洞。
15 |
16 | | 类型特征 | 详细描述 |
17 | | :--- | :--- |
18 | | **SVG 上传利用** | 攻击者尝试通过 `POST` 请求上传一个 MIME 类型为 `image/svg+xml` 的 SVG 文件,该文件中嵌入了恶意的 DTD 载荷。SVG 文件本质上是 XML 格式,因此是利用 XXE 的常见载体。 |
19 |
20 | #### 3. 间接文件协议利用(LFI 侧信道或利用 URL 处理器)
21 |
22 | 此类型中,应用程序可能不是直接处理 XML,但其内部组件(如 URL 解析器或文件恢复功能)允许 `file://` 协议的使用,本质上是利用了与 XXE 相同的文件读取能力。
23 |
24 | | 类型特征 | 详细描述 |
25 | | :--- | :--- |
26 | | **URL 参数中的文件路径** | 在部分插件或应用中,攻击者在 URL 参数中直接注入 `bm_url=file:///opt/flag.txt`,试图通过这种机制读取本地文件。 |
27 |
28 | #### 4. 高级 XML 上下文利用 (XPath/XSLT/Blind XXE)
29 |
30 | 当服务器不直接回显实体内容(无回显 XXE,Blind XXE)时,或在可以执行表达式的环境中,需要更复杂的技巧来提取数据。
31 |
32 | | 类型特征 | 详细描述 |
33 | | :--- | :--- |
34 | | **XPath 注入实现文件读取** | 在 Struts 等使用 Java OGNL/EL 表达式的环境中,攻击者尝试利用 **XPath 表达式**来读取本地文件内容:`@javax.xml.xpath.XPathFactory@newInstance().newXPath().evaluate('string(/)', new org.xml.sax.InputSource('file:/tmp/flag'))`。这是一种利用 XML 解析上下文进行数据提取的**高级技巧**。 |
35 |
--------------------------------------------------------------------------------
/mcpserver/ctf-skills/afr&pt.md:
--------------------------------------------------------------------------------
1 |
2 | ### 一、 任意文件读取(Arbitrary File Read)/ 路径遍历(Path Traversal)
3 |
4 | **路径遍历**是实现任意文件读取最直接的技术手段。题目通常要求通过操纵 URL 参数或请求头,利用相对路径机制 (`../` 或其编码形式) 来访问文件系统根目录之外的文件。
5 |
6 | #### 1. 题目类型(Challenge Types)
7 |
8 | 1. **基础路径跳跃:** 应用程序直接拼接用户输入的文件名,未检查 `../` 序列。
9 | 2. **Web 根目录逃逸:** 应用程序限制用户只能访问特定目录(如 `/static/` 或 `/images/`),要求攻击者构造路径绕过该限制来读取更高层级的文件。例如,尝试访问 `/icons/..%2f/flag.txt` 或 `/static/../flag.txt`。
10 | 3. **目录规范化绕过:** 应用程序尝试过滤 `../`,但可以利用编码或非标准路径格式进行绕过。
11 | 4. **结合 SSRF 的文件读取:** 应用程序存在 SSRF (Server-Side Request Forgery) 漏洞,允许攻击者通过 `file:///` 协议读取本地文件。
12 |
13 | #### 2. 技巧和手法(Techniques and Methods)
14 |
15 | | 技巧类别 | 描述和观察到的具体载荷 | 作用与利用场景 |
16 | | :--- | :--- | :--- |
17 | | **1. 基础遍历与目标文件探测** | 使用多层 `../` 尝试访问系统文件,例如:`../../../../etc/passwd` 或直接探测旗标文件:`/flag`、`/flag.txt`、`/FLAG.php`。 | 确认路径遍历漏洞是否存在,并定位关键系统文件和目标旗标。 |
18 | | **2. 标准编码绕过** | 对 `../` 或 `/` 进行单次 URL 编码:`..%2f`,或使用点分编码 `/icons/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd`。 | 绕过简单过滤器的首选方法。 |
19 | | **3. 双重编码绕过 (Double Encoding)** | 对编码后的路径再次编码,例如 `..%252f..%252fetc%252fpasswd`。 | 针对在过滤前进行一次 URL 解码的应用程序。 |
20 | | **4. 混合/非标准编码及填充** | 尝试利用操作系统或 Web 服务器的路径规范化特性,例如使用过多的点或斜线:`....//....//etc/passwd`。或者使用非标准编码如 `..%c0%af`。 | 绕过依赖于严格字符串匹配的过滤器,利用解析器差异。 |
21 | | **5. 静态目录逃逸** | 利用应用中已知的静态资源路径作为起点,进行目录跳跃,例如 `/icons/..%2fflag.txt` 或 `/static/../flag.txt`。 | 绕过要求从特定子目录开始的路径验证。 |
22 | | **6. SSRF + `file://` 协议** | 在具有 SSRF 功能的端点(如某些插件或服务)中,强制服务器使用 `file:///` 协议读取本地文件。例如,在 WordPress 插件场景中:`ajax.php?action=restore&bm_url=file:///opt/flag.txt`。 | 利用服务器内部文件读取能力,即使外部访问路径受限。 |
23 |
24 |
--------------------------------------------------------------------------------
/mcpserver/ctf-skills/ssrf.md:
--------------------------------------------------------------------------------
1 | ### 一、协议滥用与本地文件读取型 (Protocol Abuse & LFI)
2 |
3 | 这类攻击旨在利用 URL 协议的特性,让服务器读取其内部的文件内容,绕过 Web 服务的限制。
4 |
5 | | 序号 | 做题技巧/手法 | 详细描述 |
6 | | :--- | :--- | :--- |
7 | | **1** | **`file://` 协议直接读取** | 利用 `file:///` 协议(或其编码形式)直接访问服务器本地文件系统的敏感文件,如配置文件、标志文件 (`flag`) 或源码。 |
8 | | **2** | **PHP 包装器 (Wrapper) 滥用** | 针对 PHP 应用,使用如 `php://filter/convert.base64-encode/resource=` 包装器,将目标文件内容进行 Base64 编码后输出,从而绕过输出过滤或内容类型限制。 |
9 | | **3** | **目录遍历/路径穿越** | 通过在路径中使用 `../` (或其各种编码形式) 来访问应用程序根目录以外的文件,例如读取 `/etc/passwd` 或其他敏感文件。 |
10 | | **4** | **路径编码混淆绕过** | 使用非标准或多重 URL 编码绕过过滤器的正则表达式检测,例如使用 `%252f` (双重编码的斜杠) 或 `%c0%af` (UTF-8 超长编码的斜杠)。 |
11 | | **5** | **空字节截断** | 利用空字节 `%00` 来截断文件路径中用于验证文件类型的后缀(如 `.jpg`),以实现 LFI 攻击。 |
12 |
13 | ---
14 |
15 | ### 二、绕过与请求头部注入型 (Bypasses & Request Injection)
16 |
17 | 当目标应用程序对用户提供的 URL 进行了过滤和限制时,需要使用复杂的技巧来绕过限制,或注入恶意数据。
18 |
19 | | 序号 | 做题技巧/手法 | 详细描述 |
20 | | :--- | :--- | :--- |
21 | | **9** | **CRLF/请求头注入** | 在 URL 参数中注入回车和换行符 (`%0d%0a`),从而在服务器向后端服务发起的请求中注入自定义 HTTP 头部,实现绕过内部认证或修改请求体。 |
22 | | **10** | **Host 头部欺骗/绕过** | 通过修改外部请求的 `Host` 头部,使其看起来像是来自内部域名(如 `localhost` 或 `internal.router`),从而绕过基于域名的白名单检查,或访问特定于内部域名的资源。 |
23 | | **11** | **伪造 IP 源地址头部** | 尝试注入或修改用于识别客户端 IP 的 HTTP 头部(如 `X-Forwarded-For`、`X-Real-IP`),将请求伪装成来自本地 (`127.0.0.1`),以访问需要本地权限的资源。 |
24 | | **12** | **路径重写头部(非标准)** | 利用代理服务器或 Web 应用框架中可能存在的路径重写逻辑,通过 `X-Original-URL` 或 `X-Rewrite-URL` 等头部强制服务器访问内部路径或敏感文件。 |
25 |
26 | ---
27 |
28 | ### 三、混合与衍生攻击型 (Hybrid & Consequence Attacks)
29 |
30 | SSRF 往往作为攻击链的起点或辅助工具,与其他漏洞结合使用,以达到更高的权限或远程代码执行。
31 |
32 | | 序号 | 做题技巧/手法 | 详细描述 |
33 | | :--- | :--- | :--- |
34 | | **13** | **SSRF + RCE/SSTI** | 利用 SSRF 成功访问内部服务后,对该内部服务尝试进行服务器端模板注入 (SSTI) 或远程命令执行 (RCE) 攻击,以获取控制权或读取文件。 |
35 | | **14** | **SSRF + XXE(实体请求)** | 当服务器解析 XML 输入时,攻击者可以通过定义外部实体(如 ``)来触发对本地文件或内部网络的请求,这本质上是利用了 XML 解析器的 SSRF 能力。 |
36 |
--------------------------------------------------------------------------------
/cmd/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM kalilinux/kali-rolling
2 |
3 | ARG KALI_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/kali
4 |
5 | ENV DEBIAN_FRONTEND=noninteractive
6 |
7 | RUN set -eux; \
8 | apt-get update; \
9 | apt-get install -y --no-install-recommends ca-certificates; \
10 | rm -rf /var/lib/apt/lists/*
11 |
12 | RUN set -eux; \
13 | printf 'deb %s kali-rolling main contrib non-free non-free-firmware\n' "$KALI_MIRROR" > /etc/apt/sources.list; \
14 | printf 'deb-src %s kali-rolling main contrib non-free non-free-firmware\n' "$KALI_MIRROR" >> /etc/apt/sources.list
15 |
16 | # 基础工具
17 | RUN apt-get update && apt-get -y install \
18 | wget \
19 | curl \
20 | ca-certificates \
21 | && rm -rf /var/lib/apt/lists/*
22 |
23 | # 必备开发/脚本环境
24 | RUN apt-get update \
25 | && apt-get install -y \
26 | git \
27 | python3 \
28 | python3-pip \
29 | python3-venv \
30 | unzip \
31 | jq \
32 | iputils-ping \
33 | && rm -rf /var/lib/apt/lists/*
34 |
35 | # Node.js(如无需要可删除此段)
36 | RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
37 | && apt-get install -y nodejs \
38 | && rm -rf /var/lib/apt/lists/*
39 |
40 | # Web 常用渗透工具(目录爆破、指纹、SSL 检测、注入测试、字典)
41 | RUN apt-get update \
42 | && apt-get install -y \
43 | nmap \
44 | gobuster \
45 | whatweb \
46 | sslscan \
47 | sqlmap \
48 | seclists \
49 | && rm -rf /var/lib/apt/lists/*
50 |
51 | # ncat / netcat
52 | RUN apt-get update \
53 | && (apt-get install -y ncat || apt-get install -y netcat-openbsd || echo "No netcat variant available") \
54 | && rm -rf /var/lib/apt/lists/*
55 |
56 | # rockyou(若未安装 wordlists,此命令会被忽略)
57 | RUN gunzip -f /usr/share/wordlists/rockyou.txt.gz 2>/dev/null || true
58 |
59 | # 如无需自定义安装,建议删除以下两段(可能重新拉入大量工具)
60 | # COPY build/setup/ /tmp/setup/
61 | # RUN chmod +x /tmp/setup/*.sh
62 | # RUN for script in /tmp/setup/*.sh; do \
63 | # echo "Executing: $script"; \
64 | # bash "$script" || exit 1; \
65 | # done
66 |
67 | # 清理
68 | RUN rm -rf /tmp/setup /tmp/*.zip /tmp/*.deb /var/lib/apt/lists/*
69 |
70 | RUN touch /root/THIS_IS_DOCKER_CONTAINER_NOT_TARGET_MACHINE.txt
--------------------------------------------------------------------------------
/mcpserver/ctf-skills/xss.md:
--------------------------------------------------------------------------------
1 | 这是根据你的要求重新整理的表格。我将参考 payload 中的核心技巧(如 `contenteditable`、`autofocus`、空格绕过、标签混淆、JSFuck 等)提取出来,融入到了**描述**中,并将示例 Payload 修改为**更具通用性和指导意义的格式**,而非直接的解题答案。
2 |
3 | #### 一、 XSS 漏洞的类型 (Types of XSS)
4 |
5 | | 类型 | 描述 |
6 | | :--- | :--- |
7 | | **反射型 XSS (Reflected XSS)** | 攻击载荷立即从服务器的响应中返回并执行,通常通过 URL 参数传递。 |
8 | | **存储型 XSS (Stored XSS)** | 恶意脚本被持久存储在数据库或文件系统中,并在受害者访问特定页面时执行。 |
9 | | **DOM 型 XSS (DOM-based XSS)** | 漏洞完全发生在客户端,JavaScript 代码不安全地处理了用户输入(如 URL 片段、`referrer`)。 |
10 |
11 | #### 二、 XSS 绕过手法和技巧 (Techniques and Bypass Methods)
12 |
13 | | 序号 | 技巧/手法 | 详细描述 | 指导性 Payload 结构 |
14 | | :--- | :--- | :--- | :--- |
15 | | **1** | **基本标签与上下文闭合** | 最基础的注入。如果输入在属性中,尝试使用 `">` 或 `'` 闭合当前属性或标签,然后开始新的恶意标签。 | `">` 或 `payload' onmouseover=alert(1) x='` |
16 | | **2** | **自动聚焦与事件触发 (`autofocus`)** | 利用 `autofocus` 属性让元素在页面加载时自动获取焦点,从而触发 `onfocus` 事件,无需用户交互。 | `` |
17 | | **3** | **非输入元素的交互 (`contenteditable`)** | 结合 `contenteditable="true"` 属性,使普通 HTML 标签(如 `div`、`span`)变为可编辑状态,配合 `autofocus` 触发事件。 | `
` |
18 | | **4** | **利用 `
` 与标签混淆** | 某些过滤器只拦截 `
` 标签,但浏览器会将 `` 标签解析为 `
`,从而绕过黑名单。 | `` |
19 | | **5** | **分隔符绕过 (Whitespace Bypass)** | 当空格被过滤时,使用 `/` (斜杠) 或 `+` 等符号作为属性之间的分隔符。 | `
` 或 `` |
20 | | **6** | **伪协议与 DOM 操作** | 利用 `javascript:` 伪协议。如果无法直接注入标签,尝试在 `a` 标签的 `href` 或 `iframe` 的 `src` 中注入。 | `Click` |
21 | | **7** | **构造函数与动态执行** | 绕过对 `eval` 或 `alert` 等关键词的过滤,利用 `Function` 构造函数或 `constructor` 属性动态生成并执行代码。 | `[].filter.constructor('alert(1)')()` |
22 | | **8** | **非字母数字编码 (JSFuck/Jother)** | 当字母和数字被完全过滤时,利用 JavaScript 的弱类型特性,仅使用 `[]()!+` 等符号构造代码。 | `[][(![]+[])[+[]]+...` (JSFuck 编码模式) |
23 | | **9** | **Unicode 与 实体编码混淆** | 利用 Unicode 转义 (`\uXXXX`) 或 HTML 实体编码来隐藏关键词(如 `alert`),常配合 `eval` 或属性值使用。 | `
` |
24 | | **10** | **字符串操作绕过** | 通过字符串拼接、大小写转换 (`toUpperCase`) 等函数操作来还原被过滤的 payload,绕过 WAF 对特定字符串的匹配。 | `
` |
25 | | **11** | **反斜杠转义逃逸** | 当服务端对引号进行转义(如 `"` 变 `\"`)时,注入反斜杠 `\` 使其转义自身(`\\"`),从而释放引号闭合字符串。 | `payload\";alert(1);//` (利用前面的 `\` 抵消转义符) |
26 | | **12** | **利用不常见标签与事件** | 使用 ``、`