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