从破甲提示词仓库到人生第一面 CTF 旗 我让 AI 搭了个靶场然后被CTF{}这种格式上了一课。起因一个高频出现的词坦白说我不算计算机小白。写过一点服务端的代码折腾过服务器自认为圈内黑话多少都见过。但「CTF」这三个字母在我这儿一直是「听说过、没细究过」。事情的转折很偶然。前几天我在 GitHub 上翻一个收集各类 AI 提示词的仓库里面也包括一些被称为「破甲」的提示词。读着读着发现一个规律CTF 这个词出现的频率高得离谱。在各种提示词里它一会儿是测试场景一会儿是能力基准一会儿又是某个 payload 的演练场。CTFCapture The Flag夺旗这到底是个什么玩意能让这么一群人天天挂在嘴边我随手问了豆包一句「CTF 是什么意思」得到的答案我其实没太记住因为我立刻就冒出了另一个念头既然都说它是网络安全圈的入门玩法那我为什么不自己搭一个亲自玩一把这篇博客就是我从这句「为什么」到人生第一面旗的全过程。CTF 到底是个啥先给同样懵的朋友补个课我尽量不写成教科书CTF 全称 Capture The Flag夺旗赛。规则一句话主办方藏好一串串叫 flag 的秘密字符串参赛者想办法把它们挖出来。挖出来之后交到平台验证正确就得分谁先交谁占先。常见的题型就那么几类Misc杂项啥都可能有图片藏字、文件尾部追加、压缩包密码……Crypto密码学给一串密文解码解密拿 flagWeb给你一个真实网站去找里面的漏洞Pwn二进制利用真刀真枪打程序漏洞Reverse逆向把编译好的程序拆开看它在干嘛我当时想这不就是解谜游戏吗直到真正上手我才发现 —— 它比解谜游戏狠多了因为题目不会告诉你该看哪里。搭建AI 当施工队我原本以为搭一个 CTF 平台得先装 Docker、MySQL再配一堆环境光想想就头大。所以这次干脆偷个懒让豆包类似 agent 的工作模式去跑我当监工。结果它给我上了一课。它先探查了我的电脑嗯没有 Docker。于是它转头去找系统里的 Python准备自己搭环境。我赶紧打断它「等等我机器上有 uv。」它这才改用 uv 管理 Python 3.11 环境把 CTFd 的源码 clone 下来装依赖再用 gunicorn 把服务拉起来。全程没碰 Docker 一下。说实话这个「没有 A 就换 B而不是卡死在 A 上」的思路比它最后搭出来的东西更让我服气 —— 虽然这次提醒它「B 就在你手边」的人是我。换成是我自己可能早就去装 Docker Desktop 了。搭建过程中踩的坑我原样记下来免得有人觉得「AI 干活哪有什么坑」clone 中断留下残缺目录第一次 clone 因为网络被掐断留下一个只有 .git、没有任何源码的目录git 都报 branch appears to be broken。删掉重来放后台跑才稳住。Python 的 bytes 字面量不能写中文我想在靶机页面里放中文文案写了个b中文...直接 SyntaxError。改成.encode(utf-8)才好。CTFd 的 API 讲究先来后到想用 API 加题目一开始直接把 flag 塞进题目的创建请求里结果 500。查源码才发现要先建题、再单独传 flag而且每次请求还得带 CSRF token不带就 403。403 和 500 各踩了一遍。这些坑单独看都不起眼但串在一起就是一次很真实的部署体验。所谓「把服务跑起来」说白了就是把一串错误挨个解决掉。出题AI 当出题老师平台起来了里面是空的。接下来豆包又自作主张当起了出题老师给我准备了三道入门题。后来我仔细琢磨这三道题其实是有讲究的Misc「查看源码」50 分flag 藏在一个网页源码的注释里Crypto「Base64」100 分给一段 Base64 密文解码即得 flagWeb「响应头里的秘密」100 分flag 藏在 HTTP 响应头里看出来了吗三道题的共同点是flag 全都藏在「你看不见的地方」—— 注释里、编码里、响应头里。这就是出题人的心思让新手在第一次做题时就建立「主动去翻没人翻的角落」的意识。难度也是递进的注释最容易看完源码就会Base64 需要一点工具意识响应头则要求你理解 HTTP 响应的结构。现在回头看这三道题就是给我这种零基础选手量身定做的新手村任务。做题玩家的视角第一题被一个注释上了一课打开靶机页面右键查看源代码我一眼就看到了!-- ... --里面躺着一串CTF{view_source_is_easy}。然后我…… 把它放过了。准确说我不是没看见它 —— 我看见了只是不认得。我当时的心理活动是CTF{view_source_is_easy}这串是什么鬼没见过这种格式大概是什么占位符、测试数据吧跟我没关系。直到被豆包点破「你不是忽略是看见了却不认识CTF{}这种 flag 格式 —— 于是把它当成了无关紧要的东西。」CTF 的第一课就这么来了你眼睛看到的不是全部更关键的是 ——你看到了也不一定认得。那串被我放过的字符串就是第一面旗CTF{view_source_is_easy}。第二题识别类型剩下的交给工具Crypto 那道题给了一串神秘字符题目名就叫 Base64。我一看题目名就知道这是明示 —— 先认出这是 Base64 编码然后随便找了个在线解码网页一秒出结果CTF{base64_is_fun}。这题教会我的不是 Base64 本身而是一个更通用的方法识别类型然后选对工具。比赛里没人手算编码全是工具。在线解码站、CyberChef、Python 一行代码用什么都行解出来就是本事。第三题被浏览器扩展坑了一整晚Web 题最折磨我。题目说 flag 在 HTTP 响应头里于是我打开浏览器 F12点开网络面板盯着那一大堆信息看了半天愣是没找到。后来发现捣乱的居然是我自己装的「沉浸式翻译」浏览器扩展。它在每个网页上注入了一堆自己的代码和浮层还会篡改响应头 ——DevTools 甚至提示我「当前显示的是预配标头」。我一度以为是题目故意埋的坑差点去控制台写 JS 了。最后是豆包提醒我别在浏览器里较劲了用命令行一行命令看原始响应头curl -i http://127.0.0.1:5001/header-i的意思就是「把响应头也打印出来」。干净的原始数据里X-CTF-Flag: CTF{headers_are_public}就躺在那里。这道题给我最大的教训是工具链里的污染源有时候比题目本身更隐蔽—— 你排查了半天发现是自己的浏览器扩展在捣乱。顿悟为什么要有「账号」三道题做完我提交完 flag正准备关页面突然意识到一个被我忽略了很久的细节这只是一个跑在本机上的平台为什么还要搞「管理员账号」和「普通用户注册」这一整套体系一开始我觉得这是多此一举 —— 就我一个人玩要账号干嘛然后我反应过来了CTF 的核心是「谁先拿到旗」。没有账号就没有「谁」。排行榜、解题记录、谁先交谁得分 —— 这一切的前提是每个玩家有一个可以挂靠归属的身份。想通这一点我突然觉得这个「复杂」太合理了管理员账号 出题人负责藏 flag、管题目普通用户 玩家负责挖 flag、比速度一个完整的比赛生态就是这两个角色。本地单机玩的时候觉得「重」但它本来就是照着一场真实比赛的样子做的。写在最后收获与下一步三个 flag 到手我在排行榜上看到了自己的名字 —— 人生第一次「完赛」。但如果只记住三句话我希望是这三句flag 藏在别人不想给你看的地方HTML 注释、响应头、编码……新手往往还栽在「看见了也不认识」上识别类型比背工具重要认出 Base64剩下的交给工具别跟被污染的环境较劲浏览器扩展改响应头换条干净的路至于下一步我在两个选择之间摇摆是去碰一碰真正的 Pwn 和 Reverse还是先自己出几道题让别人也体验一下被我藏 flag 的快乐如果你也一直好奇 CTF 却不知道从哪下手 —— 别怕搭一个真的花不了半小时而且现在连「搭」这件事都可以交给 AI 了。剩下的就是把第一个!-- --看进去。附环境清单给想照着玩的朋友一份可复现清单平台CTFd 3.8.6GitHub 开源Python Flask 写的比赛平台运行方式uv 管理 Python 3.11 环境gunicorn 启动无 Docker 也能跑平台地址本机 4000 端口题目靶机本机 5001 端口自写的小 Python 服务加题 API 的坑先 POST 建题再 POST 单独传 flag请求头带 CSRF-Token否则 403看原始响应头curl -i 地址比 F12 干净不被浏览器扩展污染