大胆破坏


Linux 启明道场.

能力越大,责任越大。

通过 Luminarium 的学习,你已经掌握了如何在 Linux 机器中浏览、操作和控制系统。 在你开始独立探索之前,我们理应以一些提醒收尾——再加上一点破坏体验。

下面列举了一些看似无害的操作,但在真实系统中执行时,它们可能导致严重的数据丢失、拒绝服务,甚至无法修复的系统损坏。这份清单并不涵盖所有情况。 在 pwn.college 中,重启容器就能恢复,但对没有防备的真实电脑来说,这些危险可都是真实的。

你可以在这里练习,感受它们的威力,但千万不要在存有重要内容的系统上执行。


你已经在“进程与作业”模块中学过,每次启动程序,Linux 操作系统都会创建一个新进程。 如果创建进程的速度超过内核的处理能力,进程表就会被填满,整个系统都会停滞。 这个新进程(例如执行 ls 时创建的进程)是从父进程(例如 shell 实例)通过 fork 派生出来的。 因此,故意造成进程数量爆炸式增长的程序被称为“Fork 炸弹”。

你已经具备实现它所需的技能:

  • 编写一个小脚本(就像“串联命令”模块中做过的那样)。
  • 赋予脚本执行权限(就像“理解权限”模块中做过的那样)。
  • 让脚本在后台启动一个自身的副本(就像“进程与作业”模块中学过的那样)。
  • 然后在后台再启动一个自身的副本!

每个副本都会再启动两个副本,而新副本也会各自启动两个。如此不断增长,系统最终会被进程淹没,无法再启动新进程!

本挑战提供了 /challenge/check,它会尝试判断你的 Fork 炸弹是否生效(例如检查能否启动新进程),成功后就会给你 flag。 一定要在发动攻击之前,先在另一个终端中启动它,否则之后就无法启动了!


注意: 不用说,这会让你的环境无法使用。 重启本挑战,或启动另一个挑战,就能恢复到可用状态!

这个容器中,/home/hacker 的可用空间只有区区1 GB。 本关中,你要把 /home/hacker 塞满垃圾文件,直到连一个小小的 1 MB 文件都创建不了。 发生这种情况后,你的工作环境就无法使用了。 本挑战会让你练习制造这种情况,稍后再进一步探索。

怎样填满磁盘? 方法很多。 这里我们来认识 yes 命令!

hacker@dojo:~$ yes | head
y
y
y
y
y
y
y
y
y
y
hacker@dojo:~$

命令 yes 会不停地输出 y,永远重复下去。 它通常配合管道,用于自动回应确认提示(例如“你确定要删除这个文件吗?”)。不过,我们要用它生成一个巨大的文件,每行都是“y”。 只需把 yes 的输出重定向到主目录中的一个文件,一两分钟就能填满磁盘!

本挑战要求你先填满磁盘,再清理空间。 步骤如下:

  1. 填满磁盘。
  2. 运行 /challenge/check。它会尝试创建一个 1 MB 的临时文件。如果创建失败,你就通过了第一阶段,检查程序会要求你释放空间。
  3. 删除你创建的文件(使用 rm),释放空间。
  4. 再次运行 /challenge/check。如果现在能创建临时文件,也就是你成功清理了主目录,就会得到 flag。

注意: 在本挑战中,/home/hacker 是一个容量很小的临时主目录。 你原有主目录中的文件在这里不可用,而且保存在这里的文件也不会在挑战结束后继续保留。

为什么分成两个阶段? 通常,你的主目录会在不同挑战实例之间保留。 如果任由它一直处于满容量状态,pwn.college 就无法正常工作了。 在 pwn.college 的各种奇怪问题中,这毫无疑问是最常见的原因!

救命,环境坏了! 如果你填满磁盘后没有清理,就需要通过 ssh 登录,删除那个文件来修复环境。 这稍微有些麻烦,不过我们在“入门”模块的“通过 SSH 连接”部分介绍了具体方法。

想把一切清空,重新来过? 可以!

hacker@dojo:~$ ls /
bin etc blah blah blah
hacker@dojo:~$ rm -rf /
hacker@dojo:~$ ls /
bash: ls: command not found
hacker@dojo:~$

这里发生了什么? 你应该还记得,rm 用于删除文件。 -r(recursive,递归)选项会删除目录及其包含的所有文件。 -f(force,强制)选项让 rm 忽略错误并跳过确认提示。 把这两个选项组合起来,再对准 /,结果就是灾难:整个系统被清空。 在现代系统上,事情倒没有那么简单,不过等你亲自尝试时就会明白。

本挑战中,你将做一件以后可能再也不会做的事:清空整个系统。 我们做了一点调整来保护你的主目录(正常情况下,它也会被删掉!)。除此之外,你和 flag 之间唯一的障碍,就是你是否愿意清空磁盘。 但在动手之前,一定要先启动 /challenge/check,让它见证这场破坏,并把 flag 交给你!


注意: rm 需要运行一段时间。 要删除的东西很多!

注意: 出于各种技术原因,你很可能无法删除所有内容,其中也包括本关用来保护主目录的机制。 别担心,你造成的破坏已经足够了!

我们来进一步看看,清空整个文件系统会带来什么影响。 你现在已经很擅长使用 rm 了。不过,上一关中,/challenge/check 会在你清空文件系统后替你输出 flag。 如果它没有这么做呢? 没有 cat,你该怎样读取 /flag?

回顾“读懂文档”模块,你知道有些 shell 命令是内建命令。 虽然 ls、cat 等命令不是内建命令,但 read(你在“Shell 变量”模块中学过,它能读取文件!)是内建命令。 这意味着,即使你清空了整个文件系统,只要还有一个已经在运行的 bash 实例,就仍然能够读取文件!

本挑战就要求你亲自试试。 它和上一关几乎一样,但你必须在破坏系统之后自己读取 flag。 当你用 rm 删除所有内容后,事先启动的 /challenge/check 会恢复 /flag 文件,并让你能够读取它。 然后就可以使用 read 读取了!

看来,没有 cat 你也能活下去! 那么,没有 ls 呢? 这一次,/challenge/check 会把 flag 恢复到一个名称随机的文件中。 你得在没有 ls 命令的情况下找到它。

本挑战有很多种解法。 echo 是内建命令,你可以对它的参数使用文件通配,让参数展开为所有文件! 例如,echo * 会输出当前目录下所有文件的名称。 同样,你也可以对参数使用 Tab 补全,多按几次 Tab,让 shell 列出可能匹配的文件。

无论你采用哪种方法,都要找到由 /challenge/check 创建在 / 中的那个随机命名文件;它会在你执行 rm 删除操作之后出现。读出文件内容,拿到 flag!


30天排行榜:

此排行榜反映本模块在道场上线后各挑战的解出情况。

排名 黑客 徽章 得分
暂无解题排行数据 —— 注册账号并完成挑战即可登上榜单!