简介
在 Linux 系统中,管理员经常使用自动化任务调度程序来执行日常维护、备份和系统更新。最常用的工具是 Cron。虽然 Cron 非常有用,但配置不当的定时任务可能会引入严重的安全漏洞。
当信任关系与写入权限不匹配时,定时任务就会变得非常危险。如果一个高权限任务执行了低权限用户可以修改的内容,那么该调度机制就会变成一种延迟的权限提升手段。
在本实验中,你将探索一个场景:系统管理员创建了一个以 root 用户身份自动运行的维护脚本,但不小心将文件权限设置得过于宽松。你将学习如何识别这种配置错误,理解其影响,并通过注入自己的命令负载,将权限从普通用户提升至 root。
枚举 Cron 任务
在这一步中,你将学习如何枚举系统范围内的 Cron 任务。Cron 是类 Unix 操作系统中基于时间的作业调度程序。系统管理员使用它来安排作业(命令或 shell 脚本)在固定的时间、日期或间隔周期性地运行。
系统范围的 cron 任务通常定义在 /etc/crontab 文件中或 /etc/cron.d/ 目录下。这些配置文件指定了调度时间、执行命令的用户账户以及命令本身。
这意味着 cron 条目会同时揭示三个关键信息:代码何时运行、以何种身份运行,以及执行的是哪个文件或命令。
让我们检查 /etc/cron.d/ 目录,看看是否有任何自定义的定时任务。使用 cat 命令读取维护 cron 任务文件的内容。
cat /etc/cron.d/maintenance
输出:
* * * * * root /usr/local/bin/maintenance.sh
输出显示该 cron 任务被安排为每分钟运行一次,由五个星号(* * * * *)表示。它被配置为以 root 用户身份运行,并执行位于 /usr/local/bin/maintenance.sh 的 bash 脚本。
识别可写脚本
在这一步中,你将调查 cron 任务执行的脚本,以识别潜在的安全漏洞。当脚本由像 root 这样拥有高权限的用户执行时,该脚本内的任何命令也将以 root 权限运行。
这就是为什么可写脚本路径是权限提升的重要信号。对脚本内容的控制,实际上变成了对高权限定时任务的间接控制。
如果普通用户可以修改此脚本,他们就可以注入自己的命令,系统随后会以 root 身份执行这些命令。这是一种常见的权限提升向量。
让我们使用带有 -l 参数的 ls 命令查看维护脚本的文件权限,以获取详细列表。
ls -l /usr/local/bin/maintenance.sh
输出:
-rwxrwxrwx 1 root root 78 Oct 10 10:00 /usr/local/bin/maintenance.sh
注意输出行开头的 rwxrwxrwx 权限。这意味着该文件对所有者、所属组以及系统上的所有其他用户都是可读、可写且可执行的。由于任何人都可以写入该文件,你当前的普通用户也可以修改其内容。
注入 Root 命令负载
在这一步中,你将通过向维护脚本注入自己的命令来利用薄弱的文件权限。
由于该脚本每分钟以 root 身份运行一次,你附加的任何命令也将以 root 身份运行。为了进行一个简单且可靠的验证,我们将附加一条命令,将 id 命令的输出写入你项目目录下的一个文件中。
我们将使用 echo 命令将此负载附加到脚本中。>> 操作符确保我们将负载添加到文件末尾,而不会删除其原始内容。
echo "id > /home/labex/project/cron_pwned.txt" >> /usr/local/bin/maintenance.sh
你可以通过使用 tail 命令读取文件末尾来验证你的负载是否已成功添加。
tail -n 2 /usr/local/bin/maintenance.sh
输出:
echo "Maintenance run at $(date)" >> /var/log/maintenance.log
id > /home/labex/project/cron_pwned.txt
等待 Root 权限任务运行
在这一步中,你将等待 cron 任务执行你注入的负载。
cron 任务每分钟运行一次。当它运行时,它将以 root 身份执行 id 命令,并将输出保存到 ~/project/cron_pwned.txt。
等待最多 60 秒,然后读取验证文件:
cat /home/labex/project/cron_pwned.txt
如果利用成功,你将看到类似以下的输出:
uid=0(root) gid=0(root) groups=0(root)
恭喜你。你已经成功劫持了一个 cron 任务,并以 root 身份执行了命令。
总结
在本实验中,你学习了如何识别并利用安全性较差的系统维护任务,从而在 Linux 环境中提升权限。你首先枚举了系统范围内的 cron 任务,找到了以 root 用户身份运行的任务。然后,你调查了目标脚本,发现其文件权限设置过弱,允许任何用户进行修改。通过向可写脚本注入反向 shell 负载并设置 Netcat 监听器,你成功劫持了自动化进程并获得了 root shell。此练习强调了正确管理文件权限的重要性,特别是对于由高权限自动化进程执行的脚本而言。



