DynaScan - 戴拿 - 实现动态敏感文件扫描

admin 2025年6月10日18:13:08评论24 views字数 7916阅读26分23秒阅读模式
DynaScan 戴拿 (奥特曼)
Dynamic Weak File Scanner 动态敏感文件扫描器
只是刚好为了缩写这个名字,然后他就成为了Dyna奥特曼。
△△△点击上方“蓝字”关注我们了解更多精彩
0x00 前言

首先很抱歉,由于个人时间不足的原因导致团队公众号没有成员运营,当然,以目前的情景来看,我以后时间也不太可能会变多,但是会尽量督促大家做出一些输出吧。
本次工具的产生主要是由于对网站源代码文件扫描的一些动态需求。
这个节点工具很多,但是细节不够完美,作为一个左眼皮跳跳坏事就来到的人,运气和模糊是我不能接受的。
我思考许久,并看了看github上几乎所有的备份文件扫描脚本,最后我决定自己开发这个脚本。
至于为什么用Python,完全是因为比较熟悉,用其他的语言我可能没有办法这么快出个Demo.如果有大佬觉得本工具思路不错,可以重构出来个Golang版本的。
格式问题导致本文不太好看,可以直接[文末]上Github看Readme。
0x01 程序开发目的
1. 基于网站路径【深入的、动态的】检测指定目录下的敏感文件,并支持自动过滤大部分不存在的路径。2. 开发前主要关注于根目录下的备份文件扫描,但对于根目录下其他敏感文件也可以完美支持。3. 支持自动分割带有多个目录层级的为多个基本URL进行扫描,但暂不支持自动递归目录进行扫描。
0x02 功能状态描述
1.能够根据特定的规则生成动态字典文件,主要是实现动态替换(日期、域名、路径等)属性。2.能够根据响应情况,自动筛选出不存在的文件,减少扫描过程中的误报。3.能够自动处理字典的编码逻辑,自动编码访问中文和特殊字符命名的路径。4.能够记录程序的详细日志输出,辅助单独的结果文件进行判断。5.添加字典频率筛选功能,仅加载频率在某一个阈值范围的字典  [新增功能]6.支持简单分析命中的URL,并自动加入hit_xxx.lst加入规则字典  [新增功能]
0x03 更新记录与TODO 
更新记录1. 更新字典文件 备份文件扫描扫描字典 20220217 2. 更新字典文件 SpringBoot路径扫描字典 20220319TODO1.  添加结果关键字匹配,过滤一些确定没有的页面2.  新增常用的根目录敏感文件字典3.  添加【指定字典】或【排除字典】的功能, 默认调用的字典太多4.  修改结构为队列结构,实现WAF禁止检测,自动暂停任务。5.  考虑将字典固定到一个文件内,更好的进行命中添加。
0x04 工具特点
1、扫描字典突出优势
1、支持多种动态规则来动态生成扫描路径(通过基本变量替换+因变量替换+解析正则规则+解析自定义规则实现)。(因变量支持域名、路径和自定义,基本变量支持从文件中读取替换。)(由于规则解析的格式需要,因此对字典内容存在格式要求,具体规则编写办法参考下文)
2、扫描字典添加支持多种方案,不同的需求可以添加到不同的字典目录中。
1、支持添加直接拼接到URL后的字典2、支持笛卡尔组合的目录和字典)3、不同目录下的字典在拼接到URL时,有不同的处理方式,具体参考下文
3、HTTP请求自定义配置
1、对输入的目标URL自动进行格式分析、自动访问检测和协议头自动判断功能。   简单输入——URL或URL文件,支持检测目标是否可以访问   扩展输入——自动分析处理HOST格式[IP:PORT,Domain],自动检测分析请求协议‘2、默认启用中文路径或特殊字符会添加分别以【gb2312、utf-8】作为基础编码进行URL编码。3、请求时大量的参数配置在setting.py中有描述和支持,用户可自定义大部分的参数配置。4、对已经访问过的URL可以进行过滤,不进行多次扫描。5、对输出的多级URL可选拆分为多个目标URL。  情景1:直接获取用户输入的URL作为目标,拼接URL+字典路径进行扫描。  情景2:分别获取http://HOST:PORT、http://HOST:PORT/XXX/、http://HOST:PORT/XXX/YYY/等多个层级作为目标,然后拼接目标进行扫描。6、支持自动进行Refer头更新、HOST头更新,及配置Cookie等请求参数
4、HTTP响应多种过滤基准
有效响应结果筛选可以选择多种筛选方案:1、基本判断规则: 响应状态码丢弃列表,判断响应状态码是否在丢弃列表内。2、动态判断基准: 响应内容前10字节,判断是否与随机测试路径响应内容的前十字节是否相同。 响应内容Hash,判断是否与随机测试路径的响应全文Hash相同。 响应内容实际返回大小,判断是否与随机测试路径的响应内容的实际返回大小相同。 响应内容Content-Length,判断是否与随机测试路径的响应的Content-Length相同。 响应内容Title,判断是否与随机测试路径的响应的标题字段相同。
更多使用配置参数详情参照 [setting.py]
0x05 字典目录结构
1. 所有字典默认存放在dict目录,其目录下存在4个目录(base_var,direct_path,combin_folder,combin_files),存放不同类型的字典文件。2. 字典文件的后缀默认设置为【.lst】,默认只读取目录下该后缀的字典文件。(该参数在setting.py中可以自定义)3. 如有需求,后续可考虑使用sqlite存储字典数据库,但是手动修改目录会变得复杂.4、每一行字典支持追加 【frequency==XXX】 字段用于表明字典频率,用于阈值筛选来决定是否加载该路径。
dict/base目录
base目录存放基础变量字典,每个基础变量字典用于自动替换字典规则中的对应基础变量(由文件名提取)。base目录下字典文件命名和产生的基本变量:字典文件名 file_name.lst ==> 删除后缀 == > file_name ==>变为基本替换规则的键 == > %file_name%对应关系:文件名【xxx.lst】其中的内容,会在初次规则渲染时【用字典内容】替换字典规则中的【%xxx%】变量简单示例情景: direct目录下某个文件字典存在一行字典规则/admin.%backup_ext%base目录下存在文件【backup_ext.lst】文件,该文件每一行内容是一个后缀【rar、zip、tar.gz、...】base目录下字典文件的大致处理过程:1base目录下的字典文件【BACKUP_EXT.lst】会从文件名会提取出【%BACKUP_EXT%】作为替换关键字。2、字典文件内容会在读取后转变为一个后缀列表 ['rar','zip',...]3、字典文件名与内容会转变为一个替换字典 {"%BACKUP_EXT%": ['rar','zip',...],...}4、然后会对后置列表内的每个元素的【{xxx=xx:xxxx}$】规则进行渲染。5、然后在其他类型中进行直接替换,如【/admin.%BACKUP_EXT%】会变为【/admin.rar、/admin.zip、...】base字典添加注意事项:1base字典目录下存放最基础的变量字典,每一行仅且支持一条[{xxx:xx=xxxx}$]格式的动态替换规则,不支持基础变量和因变量。2base字典目录下的字典文件命名【如xxx.lst】和其他目录下的字典规则中的基础变量【%xxx%】有强关联性。
dict/direct目录
direct目录下的字典介绍:direct目录下的文件名无特殊的命名要求,会读取目录下所有符合定义的自定后缀的文件内容。direct目录下的字典处理: dict/direct 目录存放的字典的规则内容会被【规则解析+基本变量替换+因变量替换】,然后直接添加到URL之后。
dict/floders 和 dict/files目录
dict/floders 和 dict/files目录下的字典介绍:dict/floders目录下仅仅存放用于组合的目录字典文件,字典的每一行是一个目录,字典文件名命名除后缀外没有要求。dict/files 目录下仅仅存放用于组合的文件名字典,字典的每一行是一个文件名,字典文件名命名除后缀外没有要求。dict/floders 和 dict/files目录下的字典处理:1、从floders目录下的所有文件读取到一个floder列表,并对列表元素进行【规则解析+基本变量替换】2、从files目录下的所有文件读取到一个file列表,并对列表元素进行【规则解析+基本变量替换】3、对floder列表和file列表,会以/{floder}/{file}的格式进行遍历拼接(笛卡尔集)。PS:所有的因变量替换实际是在循环目标的时候处理的,因为只有此时才能获取到所有的因变量

 

0x06 字典文件内容编写规则
字典渲染顺序:
1. 对每一个行路径进行{xxx=xx:xxxx}$ 规则的解析,每行字典路径仅且支持一句解析规则2. 对基本变量关键字进行替换,每行字典路径支持多个不相同的基本变量3. 对因变量关键字进行替换,每行字典路径支持多个不相同的因变量
基础变量介绍
字典内以 %变量名% 格式出现,变量名是从base目录下的字典文件名中动态获取的。基础变量会在【基本变量替换时】被替换为字典文件的内容。基本变量替换字典示例:backup_ext.lst字典文件衍生规则: {'%backup_ext%': ['rar','zip']}
因变量介绍:
字典内以 %%变量名%% 格式出现,变量名在代码中定义,变量对应的内容获取函数也在代码中定义。目前内置有【%%domain%%、%%path%%】两个变量,会分别获取域名相关的列表和路径相关的列表。因变量会在【因变量替换时】被替换为从URL中动态获取的内容。因变量替换字典示例:解析 https://www.baidu.com 得到因变量字典: {'%%domain%%': ['baidu','baidu_com','www.baidu.com','baidu.com','www_baidu_com']}
动态替换规则:
动态替换规则指字典内以 {规则分类=规则类型(附加参数):实际解析部分}$ 格式出现的字符串。因此在字典中使用规则引擎,需要以 { 括号开头,并以 }$ 结尾,替换规则有【date、int、str、re】四种规则分类,每种规则可能存在多种规则类型。不同的规则的【实际解析部分】有不同的编写格式要求。规则   说明re     正则引擎int    整数str    字符date   日期
date类型替换规则:
{date=日期类型:日期开始-日期结束}$规则类型:year(年) 2005-2015规则示例:RuleParser('{date=year:2017-2018}$').parse()规则输出:['2017', '17', '2018', '18']规则类型:mon(月) 1-12规则示例:RuleParser('{date=mon:9-10}$').parse()规则输出:['9', '09', '10']规则类型:day(日) 0-30 规则示例:RuleParser('{date=day:9-10}$').parse()规则输出:['9', '09', '10']规则类型:year_mon(年月) 200501-201512规则示例:result = RuleParser('{date=year_mon:201709-201712}$').parse() 规则输出:['201709', '20179', '201710', '201711', '201712']规则类型:mon_day(月日) 0101-1231规则示例: result = RuleParser('{date=mon_day:0928-1003}$').parse() 规则输出:['0930', '1001', '0929', '09-29', '1003', '10-01', '09-30', '10-02', '10-03', '1002']规则类型:year_mon_day(年月日) 20050101-20151231规则示例:RuleParser('{date=year_mon_day:20170111-20170112}$').parse() 规则输出:['170112', '20170112', '17-01-12', '2017-01-12']规则类型:mon_day_year(月日年) 01012005-12312015规则示例:RuleParser('{date=mon_day_year:01112017-01122017}$').parse() 规则输出:['2017-01-12', '17-01-12', '170112', '20170112']PS:日期会出现的子分类情况,初始位数补充0911,911
int类型替换规则:
{int=数字类型#元素长度$步长:数字开始-数字结束}$规则类型:series(正常按照顺序递进,支持$步长选项)规则示例:RuleParser('{int=series:1-5}$').parse() 规则输出:['1', '2', '3', '4', '5']规则示例:result = RuleParser('{int=series$2:1-15}$').parse() #使用步长选项规则输出:['1', '3', '5', '7', '9', '11', '13', '15']规则提示:仅series类型支持步长仅series类型长度选项没有实际用处规则类型:digits(连号数字)规则示例:RuleParser('{int=digits#3:1-5}$').parse() 规则输出:['123', '321', '234', '432', '345', '543']规则提示:#3表示数字的长度为3规则类型:overlap(重叠数字)规则示例:RuleParser('{int=overlap#3:1-9}$').parse() 规则输出:['111', '222', '333', '444', '555', '666', '777', '888', '999']规则示例:RuleParser('{int=overlap#3:11-22}$').parse() 规则输出:['111111', '121212', '131313', '141414', '151515', '161616', '171717', '181818', '191919', '202020', '212121', '222222']规则提示:#3表示元素的个数为3
str类型替换规则:
{str=字符类型#元素长度:字符开始-字符结束}$规则类型:letters(按照顺序递进)规则示例:RuleParser('{str=letters#3:a-d}$').parse()规则输出:['abc', 'bcd']规则提示:#3表示字母的长度为3规则类型:overlap(重叠字母)规则示例:RuleParser('{str=overlap#3:A-D}$').parse() 规则输出:['AAA', 'BBB', 'CCC', 'DDD']规则提示:#3表示元素的个数为3
re类型替换规则:
re是正则解析器,会根据正则生成符合正则规则的字符串,是最常用的规则。已知的正则解析生成器有 exrex、sre_yield,解析结果是相同的,只不过有不同的解析算法。{re=引擎类型:正则表达式}$引擎类型:exrex(exrex正则解析引擎)规则示例:RuleParser('{re=exrex:(201[7-9]{1}[1]{1}[8-9]{1})}$').parse() 规则输出:['201718', '201719', '201818', '201819', '201918', '201919']引擎类型:sre_yield(sre_yield正则解析引擎)规则示例:RuleParser('{re=sre_yield:(201[7-9]{1}[1]{1}[8-9]{1})}$').parse()  规则输出:['201718', '201818', '201918', '201719', '201819', '201919']
字典规则编写注意事项
1、字典内的每一行规则最多支持【两个%基本变量%】、【两个%%因变量%%】2、字典内的每一行规则最多 【一个】解析规则3、组合目录字典和组合文件字典在进行初次渲染时,会分别进行一次渲染(1-11-2次),每一行字典也支持如上两项。4.6 字典规则调试和验证 1、如果一行字典规则有问题,会显示错误提示,并忽略解析该条规则。
规则报错示例:
错误内容:    [22:30:20] [-] 每条字典规则仅支持单个{xx=xx:xxxx}$格式规则!!!     Rule: /{date=year:2021-2022}$-{re=exrex:([ABC])(%backup_ext%)}$     Error: too many values to unpack (expected 2)    错误原因:    本规则内带有了两条解析规则,所以导致了错误。
其他字典规则
 1、支持#号注释,对#号开头的行,和频率字符串后面的#号都会进行删除
0x07 其他使用与配置信息
python3 DynaScan.py -husage: DynaScan.py [-h] [-u TARGET] [-f TARGET_FILE] [-p PROXY] [-t thread] [-d] [-v]optional arguments:  -h, --help       show this help message and exit  -u TARGET        指定扫描目标URL, Example: http://www.baidu.com  -f TARGET_FILE   指定扫描目标URL文件, Example: target.txt  -p PROXY         指定请求时使用的HTTPS或SOCKS5的代理, Example: http://127.0.0.1:8080 or socks5://127.0.0.1:1080  -t thread        指定多线程池的最大线程数  -d debug         显示程序运行时的所有调试信息,默认关闭  -v version       显示程序当前版本号Examples:  python3 DynaScan.py -u http://www.baidu.com  python3 DynaScan.py -f target.txt  python3 DynaScan.py -f target.txt -p http://127.0.0.1:8080  其他控制细节参数请通过Setting.py进行配置  T00L Version: Ver 0.0.1
8

 

0x08 使用实例

DynaScan - 戴拿 - 实现动态敏感文件扫描

DynaScan - 戴拿 - 实现动态敏感文件扫描

DynaScan - 戴拿 - 实现动态敏感文件扫描

0x09 程序参考说明
渲染规则部分主要参考ring04的weakfilescan,另外修复Python3环境的一些错误,并分离了因变量和基本变量的替换。weakfilescan原版请访问https://github.com/ring04h/weakfilescan
0x10 Summary 总结
项目地址: WINEZER0/DynaScan:https://github.com/winezer0/DynaScan
1、本团队任何实战文章都已授权、任何技术及工具也仅用于学习分享,请勿用于任何非法、违法活动,如有违背请自行承担后果,感谢大家的支持!!!

2、本团队一贯秉承Free共享的精神,但是也有大家的小愿望,因此本团队所有分享工具,严禁不经过授权的公开分享,被关注就是对我们付出的精力做的最大的支持。

 

原文始发于微信公众号(NOVASEC):DynaScan - 戴拿 - 实现动态敏感文件扫描

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月10日18:13:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DynaScan - 戴拿 - 实现动态敏感文件扫描https://cn-sec.com/archives/850382.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息