拼搏百天,我在pwn.college拿到了蓝带——黑客、开源和CS教育的革新

本文已首发于微信公众号


新年的第一篇推文,我们介绍一下来自大洋彼岸的计算机安全课程 pwn.college。在黑客行话中 pwn 就是入侵成功的意思,pwn 也是 CTF 安全竞赛中的重要题型,而课程的创立者 Yan Shoshitaishvili 就曾是知名 CTF 战队 Shellphish 的队长,并创立了 Order of the Overflow 连续组织了四年的 DEF CON CTF。如今作为亚利桑那州立大学教授的 Yan 在从事安全研究的同时还热衷于传道授业,打造了这一整套课程来让学生在实践中夯实计算机安全的基础,开启黑客之路。

如果读者熟悉 CTF 夺旗赛的形式,应当知道 CTF 获胜的条件就是拿到 flag,它通常是一个特征明显,含有 {} 的字符串。而在不同类型的题目中,考察的知识点五花八门,flag 所在的位置和呈现形式多种多样,解题思路可以非常天马行空。pwn.college 的解题方式则是固定的,所有题目都会启动一个服务器实例,将答案存在 /flag 文件中,这个文件只有 root 用户可读,而学生只能控制 hacker 用户,解题的关键就是 /challenge 目录下的 SUID 程序,这些程序可以 root 权限运行,学生必须利用程序中的漏洞以获取 /flag 文件内容。

pwn.college 的主体就是其精心设计的 CTF 习题 ,课程没有考试,重在让学生通过解题实践加深对计算机安全的理解。在 ASU 的教学中,每一门课对应一个 dojo,每个 dojo 中有一系列模块,每个模块对应不同的知识点和习题。以 CSE 466 Computer Systems Security 为例, 这门课程在 2021 年秋季学期一共有 14 个模块共 472 道题目,覆盖了计算机系统安全的基础内容。

Archive CSE466 F2021 Dojo

第一个模块 Program Interaction 就有 142 道题,学习曲线及其友好,由易到难覆盖命令行基本操作,标准输入输出,管道,进程间交互,网络 socket 等内容,每一道题通过判题脚本限制学生使用命令行,Bash/Python 脚本和编译后的 C 程序来实现类似的功能,看似简单的程序交互也能玩出不同的花样。

Program Misuse 模块则介绍 SUID 特权程序及其安全隐患,看过五十多个程序的 man page 才知道原来他们都能用来读取 /flag

Assembly Refresher 模块则用 21 道题目让学生从零入门 x86 汇编,第一道题还在学 mov 指令,最后一道题就要用汇编实现一个函数统计一段内存中出现次数最多的字节。

学完汇编后就有 14 道题练习 Shellcode Injection,尽管 pwntools 自带了许多 shellcode,学生仍有必要学习从零开始编译自己的 shellcode,并绕过长度限制和字符限制以最终获得 flag。

其后的 Sandboxing 模块则介绍了常用于隔离文件系统的 chroot 和屏蔽系统调用的 seccomp,学生将在 13 道题中编写 shellcode,理解这两种隔离机制的缺陷并绕过它们获取 flag。

Debugging Refresher 模块仅用 8 道题就让学生掌握了 GDB 动态调试程序的基本方法,之后的模块中需要大量使用 GDB 进行调试。

Reverse Engineering 模块共有 38 道题,从这一模块开始题目更加复杂,每道题会拆成两个版本:有提示的 teaching challenge 和无提示的 testing challenge,学生需要综合利用静态分析和动态调试工具逆向程序逻辑,还原被混淆的 license key,或直接 patch 程序以获得 flag。后半部分题目更是引入了自制的 Yan85 虚拟机混淆,大大提高了逆向难度。(这里剧透一下,Yan85 会在后续的模块中反复出现)

Memory Errors 模块开始才算真正进入了 CTF 中 pwn 类型的内容,学生将会学习利用栈溢出执行恶意代码,并在合适的场景下绕过 Stack Canary 和 ASLR 等保护机制。

这之后还有 Return Oriented Programming,Dynamic Allocator Misuse 等模块,讲解更多复杂场景下的利用方式,还会涉及 Race Condition 和 Kernel Security。

以上仅仅只是 2021 年的版本,pwn.college 会根据学生的反馈不断优化课程设计,从下图教学团队统计的学生得分数据可以直观地看出不同模块的难度,为之后调整课程内容编排提供了依据。

Grades

如果把教学看作学生与教师之间的攻防互动,那么好的教学需要做到“安全”和“高效”。教师需要检测出学生的真实学习成效,确保学生在掌握知识点的情况下才能拿到对应分数,防止学生走捷径不劳而获。只有最懂攻击的黑客才能设计出最健全的防御体系,pwn.college 放手让学生在服务器中自由发挥,又确保其无法造成破坏,最终只能在理解对应知识点后用预想的方式解题。不过若是学生真能发现实验系统中的非预期漏洞并上报,还会得到额外加分。pwn.college 的形式也让抄袭再无用处,每个人每道题对应的 flag 都是不同的,乃至对应的程序也在数据上有变化,即使拿到他人代码也无法直接抄袭过关。但这绝不意味着学生遇到困难只能闭门造车闷头苦想,pwn.college 鼓励不涉及直接答案的讨论和互助,所有关于课程和题目的疑问都可以在 Discord 中提出,群聊机器人会自动统计每个人收到感谢的次数,在计算 ASU 本校学生课程绩点时会对助人行为予以额外加分。这样学生非但不会为绩点而恶性竞争,反而会积极帮助他人,营造了良好的学习氛围,让学生更加高效地学习。

Helper Extra Credit

除此之外,我还总结了 pwn.college 在教学安排上与传统课程的两个不同点:

可复用性和可扩展性:pwn.college 最近三年讲解知识点的视频和幻灯片都只有一版,但这并不意味着老师每年翻来覆去念同一套 PPT,恰恰相反,日常课程的固定让师生的精力都得到了解放:教学团队只需开设直播答疑课来有针对性地进行讲解,不用花时间维护已有课程或批改作业,而能持续迭代出新的课程内容;学生可以灵活安排自己的学习时间,观看视频和幻灯片掌握知识点并进行大量实践,遇到难题时可以参考之前的答疑课录像和 Discord 内的聊天记录。由于充分调动了学生自主学习和社区互助的积极性,当越来越多来自世界各地的学生参与学习,教学团队非但不会担心人数太多影响教学质量,反而乐于见到更多学生参与讨论,教师所付出的时间成本几乎不受学生数量影响,而学生得到帮助的机会却随着参与人数的增加而增加,这就以“大班课”的规模实现了媲美“小班化教学”的互动程度。

用户友好和精神激励:其实国内外重视实验的计算机课程也有许多,但大多仍需学生在个人电脑上下载实验材料,繁琐的环境配置会削弱初学者的学习动力并耗费大量时间,由于环境不统一也容易产生各种无法复现的特殊问题。而 pwn.college 扩展了 CTFd 这个用于 CTF 竞赛的框架,打造了强大的基础设施,服务器中预装了二进制安全的常用软件和库,真正做到了开箱即用的体验,如果学生觉得 ssh 命令行操作不便,可以在使用自带的网页版 VS Code 编写代码,甚至启动虚拟桌面使用 IDA 和 Ghidra 等 GUI 逆向工具。学生的数据是持久化的,可以复用之前的脚本而不用担心丢失。除了良好的交互体验,pwn.college 还有一些娱乐元素来为枯燥的学习增添乐趣,老师鼓励学生创作 meme (模因,即通常所说的梗图),在 Discord 指定频道中发送自制 meme 并得到助教点赞可以额外加分,每周课上还会挑选有趣的 meme 当众展示。为了给学生带来类似黑客的荣誉感,pwn.college 设置了类似跆拳道的授带机制,当学生完成一个 dojo 中所有题目时能获得对应腰带,比如我在去年完成了 CSE 466 对应的全部题目后就获得了蓝带,提供自己的收货地址甚至还能收到腰带的实物。pwn.college 中每个模块的最后几题往往最难,而每道题的分数却是相同的,正是对荣誉的追求激励着学生挑战自我,不眠不休地解决最后的难题。

Meme Credit

Belts

pwn.college 能达成这样完美的用户体验,和开源也有着密不可分的关系。pwn.college 的基础设施都是开源的,包括一整套 Docker 环境和所有题目预生成的二进制程序,理论上其他人可以直接部署。而打造这样一套全自动的系统安全实验环境也依赖于许多开源软件,判题程序中模拟执行 shellcode 用到了 Capstone, KeystoneUnicorn,内核安全的学习环境离不开 QEMU,在终端中进行逆向分析可以使用如瑞士军刀一般小巧而强大的 Radare2,而 Yan 教授本人更是打造了自动化二进制分析的利器 angr。若是没有这些蓬勃发展乃至成为行业标杆的开源软件,学生想动手实践可能还需采购厂商专门开发的实验环境,付出昂贵代价的同时还受到更多限制,正是开源软件的存在才使得人人都能探索计算机的奥秘。

Dojo GitHub Repo

2023 年春季学期即将到来,ASU 也开出了新课 CSE 494 Software Exploitation 讲授二进制安全漏洞的利用,我们期待着 Yan 教授及其团队能继续为我们带来精彩的课程,同时也期待着将来有一天,国内的同学也能在自己的学校体验这样的课程,体会到 hacking 的乐趣。

Youtube

评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue