浅析工具dirpro v1.2源码
字数 1849 2025-08-10 12:17:58

DirPro v1.2 目录扫描工具深度解析与使用指南

工具概述

DirPro 是一款基于 Python 开发的高效目录扫描工具,专为渗透测试和安全审计设计。其主要特点包括:

  • 高度自动化:自动根据返回状态码和返回长度进行结果筛选
  • 多线程支持:可自定义线程数量
  • 批量扫描:支持导入 URL 文件进行批量扫描
  • 智能结果处理:自动整理扫描结果并生成报告
  • 多种扫描模式:支持常规扫描和快速扫描模式

项目地址:GitHub - coleak2021/dirpro

功能特性

核心功能

  1. 自定义线程控制:通过 -t 参数设置并发线程数(默认30)
  2. 批量扫描:支持通过文件导入多个目标URL
  3. 进度显示:每完成10%扫描进度自动显示
  4. 字典自定义:可指定自定义字典文件路径
  5. 代理支持:可通过 -a 参数设置代理
  6. 随机User-Agent:每次请求使用随机用户代理
  7. URL格式规范化:自动规范输入的目标URL格式
  8. 动态目录生成:根据输入URL智能生成敏感目录

结果处理

  1. 状态码分析:自动识别429状态码并提示调整线程
  2. 长度去重:基于返回内容长度进行结果筛选
  3. 自动保存:结果以"域名+时间"格式保存,防止覆盖
  4. 分类统计:统计不同状态码和长度的分布情况

安装与使用

基本命令格式

python dirpro.py [选项]

参数说明

参数 说明 示例
-h 显示帮助信息 -h
-u 指定目标URL -u http://example.com
-t 设置线程数(默认30) -t 50
-w 指定字典文件路径 -w ./wordlist.txt
-a 设置代理 -a 127.0.0.1:7890
-f 指定包含多个URL的文件 -f urls.txt
-b 启用快速扫描模式 -b

技术实现解析

核心模块结构

  1. dirpro.py:主入口文件,处理命令行参数
  2. start.py:初始化扫描任务,管理线程
  3. backup.py:生成敏感目录和备份文件列表
  4. rely.py:核心扫描功能实现
  5. results.py:结果处理与保存
  6. end.py:扫描结束处理

关键代码分析

1. 参数处理与初始化

if not args.f:
    rooturl = args.u.strip('/')
    (time1,ret)=__start(args,rooturl)
    __end(rooturl,time1,ret)
else:
    urlfile=open(args.f, 'r')
    urls = urlfile.read().splitlines()
    for rooturl in urls:
        rooturl = rooturl.strip('/')
        (time1,ret) = __start(args, rooturl)
        __end(rooturl,time1,ret)
  • 自动去除URL末尾的斜杠
  • 支持单个URL和URL文件两种输入方式
  • 对每个URL调用__start开始扫描,__end处理结果

2. 线程控制与任务分发

sem = threading.Semaphore(args.t)  # 限制最大线程数

# 快速扫描模式
if args.b:
    sem = threading.Semaphore(5)  # 快速模式限制为5线程
    searchdir(urlList,sem,rooturl)
else:
    # 加载字典文件
    if not args.w:
        defaultword = './wordlist/default'
    else:
        defaultword = args.w
    f = open(defaultword, 'r')
    files = f.read().splitlines()
    for file in files:
        urlList.append(f'{rooturl}/{file}')
    f.close()
    searchdir(urlList,sem,rooturl)
  • 使用threading.Semaphore控制最大并发数
  • 快速扫描模式(-b)自动限制为5线程
  • 自动加载默认字典或用户指定字典

3. 敏感目录生成逻辑

# 备份文件生成
FILE_LIST = ['index', 'admin', 'login', 'test']  # 示例,实际更长
for file in FILE_LIST:
    urlList.append(f'{rootUrl}/{file}')
    urlList.append(f'{rootUrl}/{file}.bak')
    urlList.append(f'{rootUrl}/{file}~')
    urlList.append(f'{rootUrl}/{file}.swp')
    urlList.append(f'{rootUrl}/.{file}.swp')
    urlList.append(f'{rootUrl}/.{file}.un~')

# 源代码泄露文件
SOURCE_LIST = [
    '.svn', '.svn/wc.db', '.svn/entries',
    '.git/', '.git/HEAD', '.git/index',
    # ...其他源代码相关路径
]

# 压缩文件生成
suffixList = ['.rar','.zip','.tar','.tar.gz', '.7z']
keyList = ['www','wwwroot','site','web','backup','database']
# 从域名中提取关键部分
num1 = rootUrl.find('.')
num2 = rootUrl.find('.', num1 + 1)
keyList.append(rootUrl[num1 + 1:num2])
# 生成组合
for key in keyList:
    for suff in suffixList:
        urlList.append(f'{rootUrl}/{key}{suff}')

4. 核心扫描功能

def __get(url):
    count = 0
    global d
    with _sem:  # 信号量控制并发
        while count < 3:  # 重试机制
            try:
                r = requests.get(url,headers=__random_agent(),proxies=proxies)
            except:
                count += 1
                continue
            break
        
        # 请求失败处理
        if count >= 3:
            print(f'visit failed:{url}')
            return
        
        l = len(r.text)
        # 结果过滤
        if r.status_code != 404 and r.status_code != 429:
            log = f'{r.status_code:<6}{l:<7}{url}'
            print(log)
        elif r.status_code == 429:
            print('Too Many Requests 429 so that Request terminated,please Set up smaller threads')
            os._exit(0)  # 直接退出程序
        
        # 进度显示
        d += 1
        if d in _list:
            print(f"[*]已经扫描{(_list.index(d)+1)*10}%")
        
        # 结果保存
        ret.append({
            'status_code': r.status_code,
            'length': l,
            'url': url
        })
  • 实现3次重试机制
  • 自动过滤404和429状态码
  • 遇到429状态码直接退出程序
  • 每完成10%进度显示扫描状态
  • 保存状态码、内容长度和URL信息

5. 结果处理与保存

# 文件名生成
t = f"./scan_result/{rooturl.split('//')[1].replace('/', '_')}_{int(time.time())}"

# 状态码和长度统计
statusCodeMap = {}
lenMap = {}
for result in ret:
    statusCode = result['status_code']
    length = result['length']
    statusCodeMap[statusCode] = statusCodeMap.get(statusCode, 0) + 1
    lenMap[length] = lenMap.get(length, 0) + 1

# 找出最常见的返回长度
maxLength = max(lenMap, key=lenMap.get)

# 写入非常见长度的结果
for result in ret:
    if result['length'] != maxLength:
        __log(f'{result["status_code"]:<6}{result["length"]:<7}{result["url"]}')
  • 自动生成包含时间戳的结果文件名
  • 统计不同状态码和长度的分布
  • 基于长度进行结果去重,排除常见长度的响应

最佳实践指南

1. 基本扫描

python dirpro.py -u http://example.com -t 50

2. 使用自定义字典

python dirpro.py -u http://example.com -w ./custom_wordlist.txt

3. 批量扫描

准备urls.txt文件:

http://site1.com
http://site2.com/subpath

执行命令:

python dirpro.py -f urls.txt -t 20

4. 快速扫描模式

python dirpro.py -u http://example.com -b

5. 使用代理

python dirpro.py -u http://example.com -a 127.0.0.1:8080

性能优化建议

  1. 线程数设置

    • 内网环境可设置较高线程(50-100)
    • 外网目标建议20-50线程
    • 出现429错误应降低线程数
  2. 字典选择

    • 常规测试使用默认top10000字典
    • 针对性测试准备行业相关字典
    • 快速确认使用-b参数
  3. 结果分析

    • 重点关注非200状态码
    • 相同长度不同URL可能是重定向
    • 异常长度响应可能包含敏感信息

注意事项

  1. 合法性:仅在授权范围内使用,避免未授权扫描
  2. 429处理:遇到429状态码应降低线程数或添加延迟
  3. 扫描影响:高线程可能对目标服务造成影响
  4. 结果验证:自动化工具结果需人工验证,避免误报
  5. 字典维护:定期更新字典文件以提高检出率

扩展开发建议

  1. 新增功能

    • 添加递归扫描选项
    • 支持正则匹配过滤
    • 添加请求延迟控制
    • 实现结果自动分类保存
  2. 性能优化

    • 实现异步IO模型
    • 添加连接池复用
    • 支持断点续扫
  3. 结果分析

    • 添加HTML报告生成
    • 实现结果自动对比
    • 集成漏洞验证功能

通过深入理解DirPro的实现原理和功能特性,安全研究人员可以更有效地进行目录枚举和敏感文件发现,同时为工具的功能扩展和性能优化提供基础。

DirPro v1.2 目录扫描工具深度解析与使用指南 工具概述 DirPro 是一款基于 Python 开发的高效目录扫描工具,专为渗透测试和安全审计设计。其主要特点包括: 高度自动化:自动根据返回状态码和返回长度进行结果筛选 多线程支持:可自定义线程数量 批量扫描:支持导入 URL 文件进行批量扫描 智能结果处理:自动整理扫描结果并生成报告 多种扫描模式:支持常规扫描和快速扫描模式 项目地址: GitHub - coleak2021/dirpro 功能特性 核心功能 自定义线程控制 :通过 -t 参数设置并发线程数(默认30) 批量扫描 :支持通过文件导入多个目标URL 进度显示 :每完成10%扫描进度自动显示 字典自定义 :可指定自定义字典文件路径 代理支持 :可通过 -a 参数设置代理 随机User-Agent :每次请求使用随机用户代理 URL格式规范化 :自动规范输入的目标URL格式 动态目录生成 :根据输入URL智能生成敏感目录 结果处理 状态码分析 :自动识别429状态码并提示调整线程 长度去重 :基于返回内容长度进行结果筛选 自动保存 :结果以"域名+时间"格式保存,防止覆盖 分类统计 :统计不同状态码和长度的分布情况 安装与使用 基本命令格式 参数说明 | 参数 | 说明 | 示例 | |------|------|------| | -h | 显示帮助信息 | -h | | -u | 指定目标URL | -u http://example.com | | -t | 设置线程数(默认30) | -t 50 | | -w | 指定字典文件路径 | -w ./wordlist.txt | | -a | 设置代理 | -a 127.0.0.1:7890 | | -f | 指定包含多个URL的文件 | -f urls.txt | | -b | 启用快速扫描模式 | -b | 技术实现解析 核心模块结构 dirpro.py :主入口文件,处理命令行参数 start.py :初始化扫描任务,管理线程 backup.py :生成敏感目录和备份文件列表 rely.py :核心扫描功能实现 results.py :结果处理与保存 end.py :扫描结束处理 关键代码分析 1. 参数处理与初始化 自动去除URL末尾的斜杠 支持单个URL和URL文件两种输入方式 对每个URL调用 __start 开始扫描, __end 处理结果 2. 线程控制与任务分发 使用 threading.Semaphore 控制最大并发数 快速扫描模式( -b )自动限制为5线程 自动加载默认字典或用户指定字典 3. 敏感目录生成逻辑 4. 核心扫描功能 实现3次重试机制 自动过滤404和429状态码 遇到429状态码直接退出程序 每完成10%进度显示扫描状态 保存状态码、内容长度和URL信息 5. 结果处理与保存 自动生成包含时间戳的结果文件名 统计不同状态码和长度的分布 基于长度进行结果去重,排除常见长度的响应 最佳实践指南 1. 基本扫描 2. 使用自定义字典 3. 批量扫描 准备urls.txt文件: 执行命令: 4. 快速扫描模式 5. 使用代理 性能优化建议 线程数设置 : 内网环境可设置较高线程(50-100) 外网目标建议20-50线程 出现429错误应降低线程数 字典选择 : 常规测试使用默认top10000字典 针对性测试准备行业相关字典 快速确认使用 -b 参数 结果分析 : 重点关注非200状态码 相同长度不同URL可能是重定向 异常长度响应可能包含敏感信息 注意事项 合法性 :仅在授权范围内使用,避免未授权扫描 429处理 :遇到429状态码应降低线程数或添加延迟 扫描影响 :高线程可能对目标服务造成影响 结果验证 :自动化工具结果需人工验证,避免误报 字典维护 :定期更新字典文件以提高检出率 扩展开发建议 新增功能 : 添加递归扫描选项 支持正则匹配过滤 添加请求延迟控制 实现结果自动分类保存 性能优化 : 实现异步IO模型 添加连接池复用 支持断点续扫 结果分析 : 添加HTML报告生成 实现结果自动对比 集成漏洞验证功能 通过深入理解DirPro的实现原理和功能特性,安全研究人员可以更有效地进行目录枚举和敏感文件发现,同时为工具的功能扩展和性能优化提供基础。