2026/10/15 20:12:38

fbctf 关卡搭建实战:Too Small 弱 RSA 加密题(256 位密钥分解)从生成到上线的完整流程

fbctf 关卡搭建实战:Too Small 弱 RSA 加密题(256 位密钥分解)从生成到上线的完整流程 网络安全后端前端【免费下载链接】fbctfPlatform to host Capture the Flag competitions项目地址https://gitcode.com/gh_mirrors/fb/fbctf点击查看免费下载本篇技术指南以 fbctf 官方示例关卡demo_levels/too_small的 README.md 为主体完整讲解如何用 OpenSSL 生成 256 位 RSA 密钥与加密 Flag、在 fbctf 管理后台创建 Too Small Flag 关卡并绑定附件、以及该题在玩家视角下看似无解实则秒破的弱密钥原理。读完本文你将掌握 fbctf 平台 Flag 类关卡的从出题脚本到管理后台上线的全流程并能从源码层面理解关卡的计分、判定与提示扣分机制。关卡设计意图一道劝退玩家的 RSA 送分题Too Small 是 fbctf 仓库内置的演示关卡之一位于 demo_levels/too_small 目录题目叙事沿用官方 README 的原文Youve recovered 3 encrypted files and an RSA public key. Since the files are RSA encrypted and RSA hasnt been broken yet, I guess you should just give up now.题目伪装成你恢复了 3 个加密文件和一个 RSA 公钥既然 RSA 还没有被攻破不如直接放弃的悲观口吻实际上是在提示参赛者这个 RSA 密钥的位数太小了——256 位模数在现代计算能力面前完全不堪一击。题目名 Too Small 正是对密钥规模的暗示。该关卡的最终 Flag 为flag{RSA_i5_n00b}关卡目录下的文件构成如下文件作用README.md出题与上线操作说明weakrsa.sh一键生成密钥、加密 Flag、打包附件的脚本tooSmall.tar.gz脚本产出的附件包公钥 3 个密文tooSmallflag.txt、tooSmallflag2.txt、tooSmallflag3.txt被拆成三段的 Flag 明文其中三个明文文件的真实内容分别是flag{RS、A_i5、_n00b}首尾拼接即得到完整 Flag。这也是出题思路的一部分把 Flag 拆成多段分别加密迫使参赛者必须完成多次解密/分解才能拼出完整答案。环境准备与 weakrsa.sh 出题脚本逐行拆解运行脚本./weakrsa.sh该脚本会生成一个 256 位 RSA 密钥并将三个 Flag 文件加密。完整的脚本内容如下weakrsa.sh#!/bin/bash openssl genrsa -out private_key.pem 256 openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout openssl rsautl -encrypt -inkey public_key.pem -pubin -in tooSmallflag.txt -out tooSmallflag.enc openssl rsautl -encrypt -inkey public_key.pem -pubin -in tooSmallflag2.txt -out tooSmallflag2.enc openssl rsautl -encrypt -inkey public_key.pem -pubin -in tooSmallflag3.txt -out tooSmallflag3.enc tar -cvf tooSmall.tar.gz public_key.pem *.enc rm -f *.enc *.pem各条命令的作用与参数说明生成 256 位 RSA 私钥openssl genrsa -out private_key.pem 256genrsa用于生成 RSA 私钥最后的256是指模数的位数。现代安全标准要求至少 2048 位256 位早已被公开的分解挑战远远甩开——作为对比512 位模数RSA-155早在 1999 年就已被公开分解768 位RSA-768也于 2009 年告破256 位属于几分钟内可分解的规模。这正是本题的考点。从私钥导出 PEM 格式公钥openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout-pubout表示输出公钥-outform PEM指定输出格式为 PEMBase64 编码的 DER 结构生成public_key.pem供参赛者使用。公钥是公开信息可以放心打包进附件。用公钥分别加密三个 Flag 片段openssl rsautl -encrypt -inkey public_key.pem -pubin -in tooSmallflag.txt -out tooSmallflag.enc openssl rsautl -encrypt -inkey public_key.pem -pubin -in tooSmallflag2.txt -out tooSmallflag2.enc openssl rsautl -encrypt -inkey public_key.pem -pubin -in tooSmallflag3.txt -out tooSmallflag3.encrsautl是 OpenSSL 的 RSA 底层工具-encrypt指定加密-pubin声明输入的-inkey是公钥-in/-out分别指定明文输入与密文输出。三个片段分别输出为tooSmallflag.enc、tooSmallflag2.enc、tooSmallflag3.enc。打包成附件tar -cvf tooSmall.tar.gz public_key.pem *.enc注意这里的打包命令使用的是-cvf普通 tar 归档而非-czvfgzip 压缩只是扩展名带.gz。实际解包时用tar -xvf tooSmall.tar.gz即可tar会自动识别格式。仓库自带的附件包内容经tar -tvf验证为public_key.pem 138 字节 tooSmallflag.enc 32 字节 tooSmallflag2.enc 32 字节 tooSmallflag3.enc 32 字节每个密文恰好 32 字节与 256 位模数32 字节的 RSA 密文长度一致。打包后脚本立即执行rm -f *.enc *.pem清理现场确保私钥不会留在出题目录里只保留打包好的附件交给平台。附件包内的公钥与密文验证将附件包中的public_key.pem解出可见其 PEM 内容为-----BEGIN PUBLIC KEY----- MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhALpU7GeuLcnFLSXsUIObhPCcYmdz7P3g zrbSkgMgmeIvAgMBAAE -----END PUBLIC KEY-----该 DER 编码的公钥中模数部分为 32 字节256 位与脚本中genrsa ... 256的参数完全吻合证实这是一把极弱密钥。参赛者拿到附件后只需要对 256 位模数做整数分解可使用 YAFU、CADO-NFS、GMP-ECM 等公开分解工具或针对小公因数/相近素数构造的 Fermat 分解等经典手段即可重建私钥并逐段解密三个密文拼出flag{RSA_i5_n00b}。上述分解手段属于通用密码学背景知识并非仓库代码的一部分但正是这道题期望参赛者掌握的技能。在 fbctf 管理后台创建并上线 Flag 关卡操作步骤继承自官方 README进入平台管理后台index.php?padmin。进入Levels: Flags页面。点击Add Flag Level按钮。填写关卡信息例如名称Too Small、分值points以及想提供给参赛者的提示hints。下面给出官方推荐的描述文案Youve recovered 3 encrypted files and an RSA public key. Since the files are RSA encrypted and RSA hasnt been broken yet, I guess you should just give up now.点击Create按钮创建关卡。在刚创建的关卡上点击Edit为该关卡添加附件。点击 Attachment。选择脚本生成的tooSmall.tar.gz文件。最后点击Create和Save完成保存。上线前还需点击关卡卡片左上角的On按钮启用该关卡之后即可在 Gameboard 上看到它。需要特别注意的是只有游戏正式开始game is on后玩家才能提交答案。后台操作背后的源码机制后台页面入口AdminController::getPages()明确声明了管理后台支持的页面集合其中包含flags即 README 所说的 Levels: Flags等页面见 AdminController.php。关卡数据落库创建 Flag 关卡最终调用Level::genCreateFlag()其内部以类型flag调用通用创建逻辑genCreate()见 Level.php。从 database/schema.sql 可看到levels表的完整字段typevarchar(4)取值为flag/quiz/base、title、description、entity_id关联国家、category_id关联分类、points、bonus、bonus_dec、bonus_fix、flag、hint、penalty、active等。新创建的关卡active初始为0未启用与 README 中点击 On 按钮启用的操作一一对应。启用/停用关卡Level::genSetStatus()通过UPDATE levels SET active %d切换状态并同步生成管理员活动日志与公告XX enabled!/disabled!见 Level.php。附件落盘细节点击 Attachment 上传文件后Attachment::genCreate()会将文件移动到/var/www/fbctf/attachments/目录并以原文件名_文件 MD5重命名、强制0600权限与www-data属主随后在attachments表中写入level_id、filename、type记录见 Attachment.php 与 database/schema.sql。也就是说参赛者从 Gameboard 下载到的正是这份tooSmall.tar.gz。玩家侧视角为什么RSA 还没被攻破是陷阱从竞赛出题的角度Too Small 的立意非常清晰叙事反讽题目描述信誓旦旦地说RSA 还没被攻破建议放弃但前提被悄悄替换成了256 位密钥。密钥规模是全部考点附件包只给出公钥与密文没有私钥参赛者的出路只有分解模数。256 位模数只有 77 位十进制数字左右属于个人电脑上用公开分解工具即可快速处理的范围与题目名称 Too Small 呼应。Flag 分段增加练习价值三个密文分别对应flag{RS、A_i5、_n00b}参赛者需要分解密钥后对三段分别做openssl rsautl -decrypt或用程序语言实现 RSA 解密最终拼接出flag{RSA_i5_n00b}并提交到平台。作为出题人这个例子反向说明了安全出题红线真实环境中的 RSA 密钥必须使用足够大的模数OpenSSL 建议至少 2048 位且应使用 OAEP 等带随机填充的加密方案rsautl默认使用 PKCS#1 v1.5 填充若用-raw直接加密短明文则存在更多已知弱点。提交判定与计分机制的源码级验证当玩家在 Gameboard 上提交答案后fbctf 的判定与计分逻辑值得出题人深入了解以下均可在 Level.php 中查到实现答案判定genCheckAnswer()对flag类型关卡执行trim($level-getFlag()) trim($answer)的大小写敏感精确比较而quiz类型则转为大写后再比较不区分大小写。因此出题时 Flag 的写法必须与玩家提交完全一致见 Level.php。计分genScoreLevel()中得分 points bonus即基础分 当前动态加分。关卡首次被攻克后genAdjustBonus()会执行UPDATE levels SET bonus GREATEST(bonus - bonus_dec, 0)让 bonus 随攻克次数逐步衰减直至 0见 Level.php 与 Level.php——这是 fbctf 经典的先到先得多得分动态计分玩法。防重复得分genScoreLevel()会先查询ScoreLog中该队是否已攻克此关卡已得分则直接返回false并通过flock文件锁保证并发提交时计分的原子性。提示扣分genLevelHint()会在玩家查看提示时从队伍总分中扣除penalty分若该队已拿过提示或已得分则提示免费若队伍当前分数不足以支付扣分则拒绝返回提示见 Level.php。常见问题与实战注意事项附件包名是.tar.gz但其实是普通 tar脚本用tar -cvf打包扩展名带有误导性。玩家侧tar -xvf tooSmall.tar.gz即可正常解包出题人若希望真正压缩应改用tar -czvf。Flag 明文分片与行尾换行三个明文片段文件是拼接出完整 Flag 的原材料出题脚本直接对它们做 RSA 加密因此出题时务必保证三个片段的拼接顺序与内容正确并记得在提交判定时使用与flag{RSA_i5_n00b}完全一致的写法判定大小写敏感。附件目录权限上传的附件存放在/var/www/fbctf/attachments/若后台上传报错可优先检查该目录是否可写以及 Web 服务用户www-data的权限见 Attachment.php 的attachmentsDir常量定义。与交互型题目的区别Too Small 是纯提交答案型 Flag 关卡玩家下载附件后本地解题平台只负责判定与计分无需额外部署服务对比之下同仓库的 babys_first_bof 演示关卡是二进制漏洞利用题出题人还需用socat TCP4-LISTEN:4000,fork,reuseaddr exec:./babys_first_bof单独托管二进制供玩家连接。两类关卡的部署边界在出题时需区分清楚。小结Too Small 是 fbctf 仓库中最适合学习Flag 关卡全流程的示例一条 weakrsa.sh 完成出题物料的生成管理后台按 README.md 的 9 步操作即可上线而 Level.php 与 Attachment.php 的源码则揭示了判定、计分、提示扣分与附件存储的完整底层逻辑。对出题人而言它是理解平台机制的最小闭环对参赛者而言它则是一道别被 RSA 吓住先看看密钥多大的经典入门密码学题目。赞分享网络安全后端前端【免费下载链接】fbctfPlatform to host Capture the Flag competitions项目地址https://gitcode.com/gh_mirrors/fb/fbctf点击查看免费下载相关推荐JSEncrypt 快速上手指南OpenSSL RSA 加密、解密与密钥生成实战JSEncrypt 快速上手指南OpenSSL RSA 加密、解密与密钥生成实战 本指南围绕 docs/getting started.md https://密码学Send前端加密流程从密钥生成到文件加密的完整实现指南Send前端加密流程从密钥生成到文件加密的完整实现指南 Send是一个安全文件传输服务采用前端加密技术确保用户文件在传输过程中的安全性。通过完整的加密流程后端前端CLRS 31.7 RSA 密码系统实战从密钥生成到加解密验证Exercise 31.7-1 详解CLRS 31.7 RSA 密码系统实战从密钥生成到加解密验证Exercise 31.7 1 详解 正文见上文档教程示例工程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考