
1. ctfshow 信息搜集题里 git/svn/vim 泄露到底在考什么做 ctfshow 信息搜集专题时很多人第一反应是拿 dirsearch 一顿扫扫出一堆 200 就以为完事了。实际上信息搜集题真正拉开差距的地方是源码泄露这一类考点git 泄露、svn 泄露、vim 泄露。它们考的不是你扫目录有多快而是你知不知道这些版本控制工具和编辑器在服务器上会留下什么残骸以及残骸里怎么把源码拼回来。先说清楚这三类泄露分别是什么、能拿到什么git 泄露是网站根目录下存在.git/目录且可被直接访问。攻击者这里就是我们做题人可以通过git log、git diff、git reset --hard等命令把历史提交里的源码还原出来。很多题目会把 flag 写在某个被删除的提交里或者写在某个分支、某个 stash 里你只有把 git 仓库完整恢复才能看到。svn 泄露是.svn/目录可访问。老版本 svn 在.svn/text-base/下存源码备份新版本在.svn/pristine/下存。如果这些目录都被清理了还有.svn/wc.db这个 SQLite 数据库里面的NODES表记录了local_relpath和repos_path配合checksum字段能定位到 pristine 目录下的缓存文件从而恢复源码。vim 泄露是编辑过程中异常退出留下的交换文件比如.index.php.swp再次异常退出会生成.swo。用vim -r就能恢复出编辑时的内容flag 经常就藏在里面。这三类考点在 ctfshow 的 web 信息搜集题里反复出现属于知道就会、不知道就卡死的典型。我这次周报场景里还叠加了 Trae-mcp 工具链用 TaoToken 统一 Key/API 通道来做请求调试和结果验证把扫描—恢复—验证这条链路串起来。下面按可跟做的顺序拆开讲。适合谁看正在刷 ctfshow 信息搜集、想系统掌握源码泄露排查流程的人已经在用 Trae 或类似 AI 编码工具、想把它接进 CTF 调试流程的人以及想搞明白为什么我扫到了 .git 却拿不到 flag的人。核心检索词先摆出来ctfshow 信息搜集、git 泄露排查、svn 泄露恢复、vim swp 恢复、Trae-mcp 配置、TaoToken API 通道。这几个词贯穿全文你按这个思路往下走就行。2. 前置准备TaoToken 统一 Key/API 通道 Trae-mcp 接入在动手扫泄露之前先把工具链搭好。这一步的意义在于后面你要反复发 HTTP 请求验证.git/HEAD能不能访问、.svn/wc.db能不能下载、.index.php.swp返回什么状态码如果每次都手动开浏览器或者临时写 curl效率很低。用 Trae-mcp 把请求调试能力接进来再通过 TaoToken 统一 Key/API 通道管理模型调用整个流程会顺很多。TaoToken 在这里扮演的角色是统一的 API 通道你不需要为每个模型或每个工具单独配一套 Key而是通过一个 Base URL 加一个 Key 走统一入口。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。注意 API 地址后面不加 UTM 参数配置的时候别画蛇添足。Trae-mcp 的配置核心是三件套Base URL、Key、Model ID。这三个缺一不可而且必须和你的实际环境一致。我踩过的坑是一开始只填了 Key 没填 Model ID结果请求一直报模型不存在排查了半天才发现是配置项漏了。具体操作路径第一步去 TaoToken 控制台创建 API Key。入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 登录后找到 API Keys 页面新建一个 Key 并复制保存。这个 Key 只显示一次丢了就得重建。第二步确认你要用的 Model ID。如果你只是做请求调试和结果验证用模型对话能力就够了入口在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你打算长期做编码和 Agent 类任务可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。第三步在 Trae 里配置 MCP。Trae 的 MCP 配置一般是一个 JSON 文件路径根据你的系统不同而不同。Windows 下通常在用户目录的.trae或 Trae 安装目录的配置文件夹里macOS 下在~/Library/Application Support/Trae/附近。你打开 Trae 的设置找到 MCP 相关配置项把下面这段填进去{ mcpServers: { taotoken: { command: npx, args: [-y, taotoken/mcp-server], env: { TAOTOKEN_BASE_URL: https://taotoken.net/api, TAOTOKEN_API_KEY: sk-你的Key, TAOTOKEN_MODEL_ID: 你的ModelID } } } }这段配置里三个环境变量就是三件套。Base URL 固定用https://taotoken.net/apiKey 换成你刚才复制的Model ID 换成你实际要用的。填完之后重启 Trae让 MCP 服务重新加载。如果你用的是 Claude Code 这类工具配置方式类似但要注意 Claude Code 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有专门的 Anthropic 兼容配置说明入口在 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 。别把 Trae 的配置直接抄到 Claude Code 里两者的字段名不一样。配好之后怎么验证最简单的办法是在 Trae 里发一句测试请求比如让它用一句话说明当前配置的模型是什么。如果返回正常说明三件套生效了。如果报 401说明 Key 有问题如果报模型不存在说明 Model ID 填错了如果报连接失败检查 Base URL 是不是写成了带 UTM 的地址。这一步做完你就有了一个能随时发请求、随时验证结果的调试通道。接下来扫泄露的时候遇到不确定的响应直接丢给 Trae 让它帮你分析返回内容比你自己盯着十六进制看快得多。3. 可复制配置git/svn/vim 泄露检测命令与 Trae-mcp 片段这一节是全文的技术核心给出可以直接复制粘贴的命令和配置。你按顺序做每一步都有明确的输入和预期输出。3.1 git 泄露检测与恢复先确认.git/目录是否可访问。最直接的方式是请求.git/HEADcurl -i http://目标站点/.git/HEAD如果返回200且内容类似ref: refs/heads/master说明 git 泄露成立。如果返回403或404说明被拦了或者不存在。确认之后用 git 自带的工具把仓库拉下来。这里推荐用git-dumper比手动一个个文件下载快得多pip install git-dumper git-dumper http://目标站点/.git/ ./dumped-repo拉下来之后进入目录先看提交历史cd dumped-repo git log --oneline --all--all很关键因为 flag 可能藏在非 master 分支里。看到可疑提交后用git diff看改动git diff HEAD~1 HEAD如果 flag 在某个被删除的文件里用git reset --hard回到那个提交git reset --hard commit-hash还有一种情况是开发者用git stash临时保存了改动然后中断了开发。这种内容不在提交历史里要用git stash list git stash popgit stash pop会把暂存的改动恢复到工作区你就能看到当时没提交的代码。如果 stash 有多个用git stash apply stash{0}指定。分支切换也是常见操作git branch -a git checkout branch-name切到目标分支后再看文件内容。3.2 svn 泄露检测与恢复svn 泄露的入口是.svn/目录。先探测curl -i http://目标站点/.svn/entries老版本 svn 返回的entries文件里能看到目录和文件列表。如果entries被清理了试.svn/wc.dbcurl -i http://目标站点/.svn/wc.dbwc.db是 SQLite 数据库下载下来后用 sqlite3 打开sqlite3 wc.db .tables SELECT local_relpath, repos_path, checksum FROM NODES;local_relpath是本地相对路径repos_path是仓库路径checksum是文件内容的校验值。拿到这些信息后去.svn/pristine/目录下找对应的缓存文件。pristine 目录下的文件按 checksum 的前两位分目录存放比如 checksum 是$sha1$abcdef...就去pristine/ab/下面找。老版本 svn 更简单源码备份直接在.svn/text-base/下文件名是原文件名.svn-basecurl -i http://目标站点/.svn/text-base/index.php.svn-base直接就能拿到源码。3.3 vim 泄露检测与恢复vim 交换文件的命名规则是.原文件名.swp。比如编辑index.php时异常退出会留下.index.php.swp。再次异常退出生成.swo第三次是.swn以此类推。探测curl -i http://目标站点/.index.php.swp如果返回200且内容是一堆二进制说明存在。下载下来curl -o index.php.swp http://目标站点/.index.php.swp然后用 vim 恢复vim -r index.php.swpvim 会提示你交换文件的信息按提示操作就能看到编辑时的内容。如果.swp不行试.swo、.swn。3.4 Trae-mcp 配置片段与上节呼应上面第 2 节给的 JSON 配置在这里再强调一次关键点Base URL 必须是https://taotoken.net/api不要带 UTMKey 和 Model ID 必须成对出现。如果你在 Trae 里配置后请求报local proxy failed大概率是npx拉取 MCP server 时网络问题可以先把taotoken/mcp-server手动装到本地再指定路径。配置好之后你可以让 Trae 帮你做这些事把 curl 返回的响应贴给它让它判断是不是 git 泄露把wc.db的查询结果贴给它让它帮你算 checksum 对应的 pristine 路径把 vim 恢复出来的乱码贴给它让它帮你找 flag 格式的字符串。3.5 参数对照表泄露类型探测路径恢复工具关键命令git/.git/HEADgit-dumpergit log --all/git stash popsvn/.svn/entries或/.svn/wc.dbsqlite3SELECT local_relpath FROM NODESvim/.index.php.swpvimvim -r index.php.swp这张表建议存下来做题的时候对着查。4. 验证请求与成功结果从扫描到拿到 flag配置和命令都齐了这一节走一遍完整的验证流程让你知道每一步的预期结果长什么样。4.1 git 泄露验证假设目标站点是 ctfshow 的一道信息搜集题。先发探测请求curl -i http://目标/.git/HEAD预期返回HTTP/1.1 200 OK Content-Type: text/plain ref: refs/heads/master看到ref: refs/heads/master就说明 git 泄露成立。接着用 git-dumper 拉取git-dumper http://目标/.git/ ./repo拉取过程中会输出下载的文件列表最后提示Done。进入目录看历史cd repo git log --oneline --all预期输出类似a1b2c3d (HEAD - master) 更新首页 e4f5g6h 删除测试文件 i7j8k9l 初始化看到删除测试文件这种提交就要警惕了。用git show看这个提交改了什么git show e4f5g6h如果 flag 在删除的文件里输出里会直接显示-flag{...}这样的行。如果不在用git reset --hard e4f5g6h回到那个提交然后ls看目录里多了什么文件。4.2 svn 泄露验证探测curl -i http://目标/.svn/wc.db预期返回200且Content-Type是application/octet-stream或类似二进制类型。下载curl -o wc.db http://目标/.svn/wc.db sqlite3 wc.db SELECT local_relpath, checksum FROM NODES;预期输出类似index.php|$sha1$1a2b3c4d5e6f... config.php|$sha1$7g8h9i0j1k2l...拿到 checksum 后去 pristine 目录找。checksum 去掉$sha1$前缀取前两位作为目录名curl -i http://目标/.svn/pristine/1a/1a2b3c4d5e6f....svn-base返回的内容就是index.php的源码。如果源码里有 flag直接就能看到。4.3 vim 泄露验证探测curl -i http://目标/.index.php.swp预期返回200内容开头是b0VIM这样的魔数。下载并恢复curl -o index.php.swp http://目标/.index.php.swp vim -r index.php.swpvim 打开后会显示交换文件的恢复界面按回车确认恢复。恢复出来的内容里如果有flag{...}直接提交即可。4.4 用 Trae-mcp 做结果验证上面每一步的响应你都可以贴给 Trae 让它帮你判断。比如 git-dumper 拉下来的仓库里git log输出很长你可以让 Trae 帮你筛选包含flag或删除关键词的提交。svn 的 checksum 拼接路径容易出错让 Trae 帮你算。vim 恢复出来的内容如果有乱码让 Trae 帮你提取可打印字符。实测下来把 Trae 接进这个流程后最省时间的环节是响应分析。以前遇到一个返回 200 但内容看不懂的路径要自己猜半天现在直接贴给 Trae它几秒钟就能告诉你这是 git 的 objects 文件还是 svn 的 pristine 缓存。4.5 成功结果的标志git 泄露成功的标志git log --all能看到多个提交且某个提交的 diff 里有 flag 格式字符串。svn 泄露成功的标志wc.db的NODES表能查到文件路径且 pristine 目录下能下载到对应源码。vim 泄露成功的标志vim -r恢复出的内容里有完整的 PHP 代码和 flag。三类泄露的 flag 位置不固定有的在源码注释里有的在配置文件里有的在删除的文件里。核心思路是先把能拿到的源码全部拿到再在里面搜 flag。5. 本篇常见报错排查401、local proxy failed、reading choices、OAuth这一节把配置和请求过程中最容易遇到的报错列出来对照着排查。5.1 401 Unauthorized这是 TaoToken 配置里最常见的错误。原因通常是 Key 填错、Key 过期、或者 Key 前面多了空格。排查步骤先确认 Key 是从控制台完整复制的没有截断。然后在 Trae 的 MCP 配置里检查TAOTOKEN_API_KEY的值注意 JSON 里字符串不能有换行。如果还不行去控制台重新生成一个 Key 替换。还有一种情况是 Base URL 写错了。必须是https://taotoken.net/api如果你写成了https://taotoken.net/api/末尾多斜杠或者带了 UTM 参数都可能触发 401。5.2 local proxy failed这个报错通常出现在 Trae 启动 MCP server 的时候。原因是npx拉取taotoken/mcp-server失败可能是网络问题或者 npm 源问题。解决办法先手动安装npm install -g taotoken/mcp-server然后把配置里的command从npx改成全局安装后的可执行文件路径args里去掉-y taotoken/mcp-server。这样就不依赖每次启动时拉取了。如果还是失败检查你的 npm 源配置换成可用的源再试。5.3 reading choices 相关报错这个报错一般出现在模型返回内容解析阶段。如果你在 Trae 里发请求后看到类似error reading choices的提示说明返回的 JSON 结构不符合预期。可能原因Model ID 填错了导致返回的不是标准对话格式。去控制台确认你用的 Model ID 和实际调用的一致。或者请求参数里stream设置和客户端预期不匹配试试关掉流式输出。还有一种可能是返回内容被截断。如果你让模型分析一个很大的wc.db查询结果超出了上下文长度返回就会异常。这种情况把输入拆小分批次问。5.4 OAuth 相关报错如果你在 Claude Code 里配置 TaoToken 时遇到 OAuth 报错注意 Claude Code 的接入方式和 Trae 不同。参考 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 里的说明它用的是 Anthropic 兼容协议配置字段是ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY不是 Trae 那套TAOTOKEN_*。常见错误是把 Trae 的配置直接抄过去导致字段名不匹配。另外 Claude Code 的配置文件路径和 Trae 也不一样一般在~/.claude/目录下。5.5 git-dumper 报错git-dumper拉取时如果报404或403说明.git/下某些文件不可访问。这时候可以手动下载关键文件.git/HEAD、.git/config、.git/objects/下的对象文件。用git init建一个空仓库把下载的文件按目录结构放进去再git checkout恢复。如果报invalid git repository检查.git/HEAD的内容是不是ref: refs/heads/master如果不是可能是被改过或者不是标准 git 仓库。5.6 svn wc.db 打不开下载下来的wc.db用 sqlite3 打开报file is not a database说明下载的内容不对。可能是服务器返回了错误页面而不是数据库文件。用file wc.db确认文件类型如果是 HTML说明路径不对或者被拦了。5.7 vim 恢复乱码vim -r恢复出来的内容如果全是乱码可能是交换文件损坏或者版本不匹配。试试用strings命令直接提取可打印字符strings index.php.swp | grep -i flag有时候 flag 就在 strings 的输出里不需要完整恢复。6. 把这条链路用起来从周报场景到日常刷题这套流程走下来你会发现 ctfshow 信息搜集题的源码泄露考点其实就三层探测—恢复—验证。探测靠 curl 和 dirsearch恢复靠 git-dumper、sqlite3、vim验证靠 Trae-mcp 加 TaoToken 通道做响应分析。我自己的习惯是每做一道新题先把三类泄露的探测命令跑一遍不管题目描述里有没有提。因为很多题目的 flag 就藏在.git/或者.index.php.swp里你不主动探测就永远发现不了。探测到之后恢复过程按第 3 节的命令走遇到不确定的响应就丢给 Trae 分析。TaoToken 在这个流程里的价值是统一入口。你不需要为每个工具单独配 Key一个 Base URL 加一个 Key 就能覆盖模型对话、编码辅助、请求调试多个场景。如果你打算长期刷题或者做安全相关的开发可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合高频调用和 Agent 类任务。最后给一个实用技巧把第 3 节的命令存成一个 shell 脚本参数化目标 URL每次做题直接跑。脚本里加上curl -s -o /dev/null -w %{http_code}来判断状态码只对返回 200 的路径做进一步处理。这样一轮扫描下来几秒钟就能定位到所有可疑的泄露点。如果你在配置 Trae-mcp 或者排查泄露时遇到问题先去 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 看接入文档大部分报错里面都有说明。Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 需要新建或吊销 Key 的时候去那里操作。模型对话验证在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 不确定 Model ID 的时候去查一下。这套东西搭好之后下次再遇到 ctfshow 的信息搜集题你就不用从零开始了。