浅析工具dirpro v1.2源码

news2024/12/25 23:50:12

文章目录

    • 前言
    • 源码分析
      • dirpro.py
      • start.py
      • backup.py
      • rely.py
      • results.py
      • end.py

前言

工具简介

dirpro 是一款由 python 编写的目录扫描器专业版,操作简单,功能强大,高度自动化
自动根据返回状态码和返回长度,对扫描结果进行二次整理和判断,准确性非常高

项目地址

项目已在github开源,求个star嘻嘻嘻

https://github.com/coleak2021/dirpro

已实现功能

  • 可自定义扫描线程
  • 导入url文件进行批量扫描并分别保存结果
  • 状态码429检测,自动退出程序并提示设置更小的线程
  • 每扫描10%自动显示扫描进度
  • 可自定义扫描字典文件
  • 可自定义代理流量
  • 自动使用随机的User-Agent
  • 自动规范输入的目标url格式,根据输入的url动态生成敏感目录
  • 强大的默认字典top10000
  • 自动根据返回状态码和返回长度对扫描结果进行二次整理和判断
  • 扫描结果自动生成 域名+时间 格式的防同名文件名 并保存到scan_result目录中

扫描参数

options:
  -h, --help  show this help message and exit
  -u U        url
  -t T        thread:default=30
  -w W        dirfile path
  -a A        proxy,such as 127.0.0.1:7890
  -f F        urlfile,urls in the file
  -b          fastly to find backup files and sensitive files

源码分析

目录结构

在这里插入图片描述

dirpro.py

项目入口,接受传入的参数,并调用函数进行后续操作

    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末尾的/,调用__start(args,rooturl)返回(time1,ret),然后调用__end(rooturl,time1,ret)对扫描结果进行处理

start.py

    sem = threading.Semaphore(args.t)
    urlList = []
    urlList.extend(searchFiles(rooturl))

限制线程的最大数,清空urlList(防止多url文件扫描时前面生成的urllist影响后续url扫描),调用searchFiles(rooturl)生成敏感目录并将结果加入到urllist中

    if args.a:
        proxies['http'] = f"http://{args.a}"
        proxies['https'] = f"http://{args.a}"

判断是否加入代理

    if args.b:
        sem = threading.Semaphore(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)

    return (time_1,ret)

判断扫描方式是快速扫描还是普通扫描,快速扫描需要设置小的线程(快速扫描自带的字典比较小),普通扫描判断是否传入字典文件,将字典中的dir加载到url中,调用 searchdir(urlList,sem,rooturl),最后返回(time_1,ret)

backup.py

searchFiles(rooturl)生成敏感目录并将结果加入到urllist中

    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', # svn
        '.git/', '.git/HEAD', '.git/index', '.git/config', '.git/description', '.gitignore' # git
        '.hg/', # hg
        'CVS/', 'CVS/Root', 'CVS/Entries', # cvs
        '.bzr', # bzr
        'WEB-INF/web.xml', 'WEB-INF/src/', 'WEB-INF/classes', 'WEB-INF/lib', 'WEB-INF/database.propertie', # java
        '.DS_Store', # macos
        'README', 'README.md', 'README.MD', # readme
        '_viminfo', '.viminfo', # vim
        '.bash_history',
        '.htaccess'
    ]
    for source in SOURCE_LIST:
        urlList.append(f'{rootUrl}/{source}')

加入源代码文件目录

    suffixList = ['.rar','.zip','.tar','.tar.gz', '.7z']
    keyList = ['www','wwwroot','site','web','website','backup','data','mdb','WWW','新建文件夹','ceshi','databak',
    'db','database','sql','bf','备份','1','2','11','111','a','123','test','admin','app','bbs','htdocs','wangzhan']
    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}')

加入压缩文件目录

rely.py

扫描功能集中在这个文件

def __random_agent():
    user_agent_list = [{'User-Agent': 'Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1; .NET CLR 3.0.04506.30)'},{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'},
......]
    return random.choice(user_agent_list)

使用随机user_agent

def searchdir(urlList,sem,rooturl):
    global d
    global _sem
    global _list
    d=0
    _sem=sem
    thread_array = []
    n=len(urlList)
    k=int (n/10)
    for i in range(1,10):
        _list.append(k*i)
    print(f"[*]开始扫描{rooturl}")
    for i in urlList:
        t = Thread(target= __get,args=(i,))
        thread_array.append(t)
        t.start()
    for t in thread_array:
        t.join()

_list存放进度条信息,for循环将调用get方法加入线程列表,通过t.join()设置除非子线程全部运行完毕,否则主线程一直挂起

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
    ret.append({
        'status_code': r.status_code,
        'length': l,
        'url': url
    })

with _sem相当于 sem.acquire(), sem.release()

锁定信号的变量sem在线程内阻塞,等待前面的线程执行结束。就是说实际上有多少任务就会开多少线程,只是超过限制的部分线程在线程内阻塞

os._exit(0)

这里判断返回码出现429则退出整个程序,如果用exit()则只能退出子线程

results.py

对扫描结果进行二次整理和判断

    t=f"./scan_result/{rooturl.split('//')[1].replace(':', '')}{int (time.time())}"
    try:
        f = open(t, 'w',encoding="utf-8")
    except:
        f = open(f"{int (time.time())}", 'w',encoding="utf-8")

设置保存扫描结果的文件名

    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

统计返回长度和状态码的个数

    for result in ret:
        if result['length'] != maxLength:
            __log(f'{result["status_code"]:<6}{result["length"]:<7}{result["url"]}')
    f.close()
    return t

打印异常的状态码和长度对于的url

end.py

    result = __Results(rooturl,ret)
    time2 = time.time()
    print("总共花费: ", time2 - time1, "秒,", f"结果保存在{result}")
    ret.clear()

将ret清空以免影响后续的扫描

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动手学深度学习-Pytorch版】注意力汇聚:Nadaraya-Watson 核回归

注意力机制中的查询、键、值 在注意力机制的框架中包含了键、值与查询三个主要的部分&#xff0c;其中键与查询构成了注意力汇聚&#xff08;有的也叫作注意力池化&#xff09;。 键是指一些非意识的线索&#xff0c;例如在序列到序列的学习中&#xff0c;特别是机器翻译&…

基于Python+Django的热门旅游景点数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

JAVA:实现Excel和PDF上下标

1、简介 最近项目需要实现26个小写字母的上下标功能,自己去网上找了所有Unicode的上下标形式,缺少一些关键字母,顾后面考虑自己创建上下标字体样式,以此来记录。 2、Excel Excel本身是支持上下标,我们可以通过Excel单元格的样式来设置当前字体上下标,因使用的是POI的m…

YOLOv5:修改backbone为ACMIX

YOLOv5&#xff1a;修改backbone为ACMIX 前言前提条件相关介绍ACMIXYOLOv5修改backbone为ACMIX修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评…

【软件设计师-从小白到大牛】上午题基础篇:第四章 法律法规与知识产权

文章目录 前言章节提要一、保护期限真题链接 二、知识产权人确定真题链接 三、侵权判定真题链接 四、标准化基础知识 前言 ​ 本系列文章为观看b站视频以及b站up主zst_2001系列视频所做的笔记&#xff0c;感谢相关博主的分享。如有侵权&#xff0c;立即删除。 视频链接&#xf…

Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例

Qt5开发及实例V2.0-第二十三章-Qt-多功能文档查看器实例 第23章 多功能文档查看器实例23.1. 简介23.2. 界面与程序框架设计23.2.1. 图片资源23.2.2. 网页资源23.2.3. 测试用文件 23.3 主程序代码框架23.4 浏览网页功能实现23.4.1 实现HtmIHandler处理器 23.5. 部分代码实现23.5…

git 本地分支基础操作

&#xff08;1&#xff09;建立分支 a:基于某个commit建立分支 然后切换 git branch test_branch 6435675ad32c035ed4d9cb6c351de5cbaecddd99 git checkout test_branchb: git checkout 建立分支然后切换 git checkout -b checkout_branchc:分支建立 然后切换 git branch …

【Amazon】AI 代码生成器—Amazon CodeWhisperer初体验 | 开启开挂编程之旅

使用 AI 编码配套应用程序更快、更安全地构建应用程序 文章目录 1.1 Amazon CodeWhisperper简介1.2 Amazon CodeWhisperer 定价2.1 打开VS Code2.2 安装AWS ToolKit插件 一、前言 1.1 Amazon CodeWhisperper简介 1️⃣更快地完成更多工作 CodeWhisperer 经过数十亿行代码的训…

网络分层模型和常见协议介绍

文章目录 网络分层模型和常见协议介绍网络分层模型介绍常见各层协议介绍 网络分层模型和常见协议介绍 理解性记忆&#xff1a;这是我自己创造的一个理解性记忆口诀&#xff0c;大家别笑我&#x1f604; 七层&#xff1a;因为七层协议并没有得到应用&#xff0c;所以物&#xff…

【算法】相向双指针

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

【GO】LGTM_Grafana_gozero_配置trace(4)_代码实操及追踪

最近在尝试用 LGTM 来实现 Go 微服务的可观测性&#xff0c;就顺便整理一下文档。 Tempo 会分为 4 篇文章&#xff1a; Tempo 的架构官网测试实操跑通gin 框架发送 trace 数据到 tempogo-zero 微服务框架发送数据到 tempo 本文就是写一下如何在 go-zero 微服务框架里面配置 t…

套接字socket编程的基础知识点

目录 前言&#xff08;必读&#xff09; 网络字节序 网络中的大小端问题 为什么网络字节序采用的是大端而不是小端&#xff1f; 网络字节序与主机字节序之间的转换 字符串IP和整数IP 整数IP存在的意义 字符串IP和整数IP相互转换的方式 inet_addr函数&#xff08;会自…

83、SpringBoot --- 下载和安装 MSYS2、 Redis

★ 下载和安装MSYS2&#xff08;作用&#xff1a;可在Windows模拟一个Linux的编译环境&#xff09; 得到Redis的编译环境——在Linux平台上&#xff0c;这一步可以省略。&#xff08;1&#xff09;登录MSYS2官网&#xff08;http://repo.msys2.org/distrib/ &#xff09;下载M…

前端新轮子Nue,号称替代Vue、React和Svelte

新的简约前端开发工具集Nue.js 于周三发布。在 Hacker News 上介绍它时&#xff0c;前端开发者和Nue.js 的创作者Tero Piirainen表示&#xff0c;它是 React、Vue、Next.js、Vite、Svelte 和 Astro 的替代品。他在 Nue.js的 FAQ 中进一步解释说&#xff0c;它是为网站和响应式用…

【Vue.js】使用Element搭建登入注册界面axios中GET请求与POST请求跨域问题

一&#xff0c;ElementUI是什么&#xff1f; Element UI 是一个基于 Vue.js 的桌面端组件库&#xff0c;它提供了一套丰富的 UI 组件&#xff0c;用于构建用户界面。Element UI 的目标是提供简洁、易用、美观的组件&#xff0c;同时保持灵活性和可定制性 二&#xff0c;Element…

Spring学习笔记6 Bean的实例化方式

Spring学习笔记5 GoF之工厂模式_biubiubiu0706的博客-CSDN博客 Spring为Bean提供了多种实例化方式,通常包括4中(目的:更加灵活) 1.通过构造方法实例化 2.通过简单工厂模式实例化 3.通过factory-bean实例化 4.通过FactoryBean接口实例化 新建模块 spring-005 依赖 <!--S…

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service 的…

github想传至远程仓库显示fatal: remote origin already exists. (远程来源已经存在 解决办法)

参考:https://blog.csdn.net/qq_40428678/article/details/84074207 在当我们输入git remote add origin https://gitee.com/(github/码云账号)/(github/码云项目名).git 就会报如下的错 fatal: remote origin already exists. 翻译过来就是&#xff1a;致命&#xff1a;远程…

zabbix自定义监控、钉钉、邮箱报警 (五十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、实验准备 二、安装 三、添加监控对象 四、添加自定义监控项 五、监控mariadb 1、添加模版查看要求 2、安装mariadb、创建用户 3、创建用户文件 4、修改监控模版 5、…

新版Chromedriver在哪下载(Chromedriver 116.0.5845.188的寻找之旅)

不知道什么时候Chrome自动升级到116.0.5845.188了&#xff0c;害得我原来的Chromedriver 114无法使用了&#xff0c;无奈之下只好重新去下载。 可寻遍网络&#xff0c;都没找到Chromedriver116的版本。网上大多网友给的下载网址是chromedriver.storage.googleapis.com/index.ht…