推荐 | 一款功能强大的子域收集工具
2019-08-13 03:08:34 Author: mp.weixin.qq.com(查看原文) 阅读量:46 收藏


👊OneForAll是一款功能强大的子域收集工具

🎉项目简介

在渗透测试中信息收集的重要性不言而喻,子域收集是信息收集中必不可少且非常重要的一环,目前网上也开源了许多子域收集的工具,但是总是存在以下部分问题:

  • 不够强大,子域收集的接口不够多,不能做到对批量子域自动收集,没有自动子域解析,验证,FUZZ以及信息拓展等功能。

  • 不够友好,固然命令行模块比较方便,但是当可选的参数很多,要实现的操作复杂,用命令行模式就有点不够友好,如果有交互良好,高可操作的前端那么使用体验就会好很多。

  • 缺少维护,很多工具几年没有更新过一次,issues和PR是啥,不存在的。

  • 效率问题,没有利用多进程,多线程以及异步协程技术,速度较慢。

👍功能特性

  • 收集能力强大,详细模块请阅读收集模块说明。

    1. 利用证书透明度收集子域(目前有6个模块:censys_apicertdb_apicertspottercrtshentrustgoogle

    2. 常规检查收集子域(目前有4个模块:域传送漏洞利用axfr,检查跨域策略文件cdx,检查HTTPS证书cert,检查内容安全策略csp,检查robots文件robots,检查sitemap文件sitemap,后续会添加检查NSEC记录,NSEC3记录等模块)

    3. 利用网上爬虫档案收集子域(目前有2个模块:archivecrawlcommoncrawl,此模块还在调试,该模块还有待添加和完善)

    4. 利用DNS数据集收集子域(目前有16个模块:binaryedge_apicircl_apihackertargetriddlerbufferoverdnsdbipv4inforobtexchinazdnsdb_apinetcraftsecuritytrails_apichinaz_apidnsdumpsterptrarchivesitedossier

    5. 利用DNS查询收集子域(目前有1个模块:通过枚举常见的SRV记录并做查询来收集子域srv,该模块还有待添加和完善)

    6. 利用威胁情报平台数据收集子域(目前有5个模块:riskiq_apithreatbook_apithreatminervirustotalvirustotal_api该模块还有待添加和完善)

    7. 利用搜索引擎发现子域(目前有15个模块:askbing_apifofa_apishodan_apiyahoobaiduduckduckgogooglesoyandexbingexaleadgoogle_apisogouzoomeye_api),在搜索模块中除特殊搜索引擎,通用的搜索引擎都支持自动排除搜索,全量搜索,递归搜索。

  • 处理功能强大,发现的子域结果支持自动去除,自动DNS解析,HTTP请求探测,自动移除无效子域,拓展子域的Banner信息,最终支持的导出格式有csvtsvjsonyamlhtmlxlsxlsxdbflatexods

  • 速度极速,收集模块使用多线程调用,爆破模块使用异步多进程多协程,DNS解析和HTTP请求使用异步多协程。

🚀上手指南

由于该项目处于开发中,会不断进行更新迭代,下载使用最好克隆最新项目。

🐍安装要求

  1. Python 3.6-3.7

✔安装步骤

  1. 下载更新

    git clone https://github.com/shmilylty/OneForAll.git

    ❗如果你之前已经克隆了项目运行之前请备份自己修改过的文件到项目外的地方(如config.py),然后执行以下命令更新项目:

    git fetch --all
    git reset --hard origin/master
    git pull
  2. 安装依赖

    • 使用pipenv

      pip3 install pipenv
      cd OneForAll/
      pipenv install --python 3.7
      cd oneforall
      pipenv run python3 oneforall.py --help
    • 使用pip3

      cd OneForAll/
      pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
      cd oneforall/
      python3 oneforall.py --help

如果在安装依赖过程中发现编译某个依赖库失败时可以参考编译失败解决方法,如果还没有解决欢迎加群反馈。

本地测试:

推荐使用Kali安装

git clone https://github.com/shmilylty/OneForAll.git

然后执行

pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/

使用演示【以sina为例】

python3 oneforall.py --target sina.com run

运行结束:

文件位置:

成功收集到6000多个子域名:

然后自己再用Whatweb看下网站Title以及服务器版本信息等等

🤔使用帮助

命令行参数只提供了一些常用参数,更多详细的参数配置请见config.py,如果你认为有些参数是命令界面经常使用到的或缺少了什么参数等问题非常欢迎反馈。由于众所周知的原因,如果要使用一些被墙的收集接口请先到config.py配置代理,有些收集模块需要提供API(大多都是可以注册账号免费获取),如果需要使用请到config.py配置API信息,如果不使用请忽略有关报错提示。(详细模块请阅读收集模块说明)

OneForAll命令行界面基于Fire实现,有关Fire更高级使用方法请参阅使用Fire CLI,有任何使用疑惑欢迎加群交流。

oneforall.py是主程序入口,oneforall.py里有调用aiobrute.py和dbexport.py,为了方便进行子域爆破和数据库导出独立出了aiobrute.py和dbexport.py,这两个文件可以单独运行,并且所接受参数要更丰富一点。

  1. oneforall.py使用帮助

    pipenv run python oneforall.py --help
    NAME
    oneforall.py - OneForAll是一款功能强大的子域收集工具

    SYNOPSIS
    oneforall.py --target=TARGET <flags>

    DESCRIPTION
    Version: 0.0.2
    Project: https://github.com/shmilylty/OneForAll/

    Example:
    python oneforall.py --target example.com run
    python oneforall.py --target example.com --brute True --port medium --valid 1 run
    python oneforall.py --target ./domains.txt --format csv --path= ./result.csv --output True run

    Note:
    参数valid可选值有1,0,None,分别表示导出有效,无效,全部子域
    参数port可选值有'small', 'medium', 'large', 'xlarge',详见config.py配置
    参数format可选格式有'csv','tsv','json','yaml','html','xls','xlsx','dbf','latex','ods'
    参数path为None会根据format参数和域名名称在项目结果目录生成相应文件

    ARGUMENTS
    TARGET
    单个域名或者每行一个域名的文件路径

    FLAGS
    --brute=BRUTE
    是否使用爆破模块(默认禁用)
    --port=PORT
    HTTP请求验证的端口范围(默认medium)
    --valid=VALID
    导出子域的有效性(默认1)
    --path=PATH
    导出路径(默认None)
    --format=FORMAT
    导出格式(默认xlsx)
    --output=OUTPUT
    是否将导出数据输出到终端(默认False)

  2. aiobrute.py使用帮助

    关于泛解析问题处理程序首先会访问一个随机的子域判断是否泛解析,如果使用了泛解析则是通过以下判断处理:

    pipenv run python aiobrute.py --help
     NAME
    aiobrute.py - OneForAll多进程多协程异步子域爆破模块

    SYNOPSIS
    aiobrute.py COMMAND | --target=TARGET <flags>

    DESCRIPTION
    Example:
    python aiobrute.py --target example.com run
    python aiobrute.py --target ./domains.txt run
    python aiobrute.py --target example.com --processes 4 --coroutine 64 --wordlist data/subdomains.txt run
    python aiobrute.py --target example.com --recursive True --depth 2 --namelist data/next_subdomains.txt run
    python aiobrute.py --target www.{fuzz}.example.com --fuzz True --rule [a-z][0-9] run

    Note:
    参数segment的设置受CPU性能,网络带宽,运营商限制等问题影响,默认设置500个子域为一任务组,
    当你觉得你的环境不受以上因素影响,当前爆破速度较慢,那么强烈建议根据字典大小调整大小:
    十万字典建议设置为5000,百万字典设置为50000

    ARGUMENTS
    TARGET
    单个域名或者每行一个域名的文件路径

    FLAGS
    --processes=PROCESSES
    爆破的进程数(默认CPU核心数)
    --coroutine=COROUTINE
    每个爆破进程下的协程数(默认16)
    --wordlist=WORDLIST
    指定爆破所使用的字典路径(默认使用config.py配置)
    --segment=SEGMENT
    爆破任务分割(默认500)
    --recursive=RECURSIVE
    是否使用递归爆破(默认False)
    --depth=DEPTH
    递归爆破的深度(默认2)
    --namelist=NAMELIST
    指定递归爆破所使用的字典路径(默认使用config.py配置)
    --fuzz=FUZZ
    是否使用fuzz模式进行爆破(默认False,开启必须指定fuzz正则规则)
    --rule=RULE
    fuzz模式使用的正则规则(默认使用config.py配置)

    • 一是主要是与泛解析的IP集合和TTL值做对比,可以参考这篇文章。

    • 二是多次解析到同一IP集合次数(默认设置为10,可以在config.py设置大小)

    • 考虑爆破效率问题目前还没有加上HTTP响应体相似度对比和响应体内容判断 经过测试在16核心的CPU,使用16进程64协程,100M带宽的环境下,设置任务分割为50000,跑两百万字典大概10分钟左右跑完,大概3333个子域每秒。

  3. dbexport.py使用帮助

    pipenv run python dbexport.py --help
    NAME
    dbexport.py - OneForAll数据库导出模块

    SYNOPSIS
    dbexport.py TABLE <flags>

    DESCRIPTION
    Example:
    python dbexport.py --db result.db --table name --format csv --output False
    python dbexport.py --db result.db --table name --format csv --path= ./result.csv

    Note:
    参数valid可选值1,0,None,分别表示导出有效,无效,全部子域
    参数format可选格式:'csv', 'tsv', 'json', 'yaml', 'html', 'xls', 'xlsx', 'dbf', 'latex', 'ods'
    参数path为None会根据format参数和域名名称在项目结果目录生成相应文件

    POSITIONAL ARGUMENTS
    TABLE
    要导出的表

    FLAGS
    --db=DB
    要导出的数据库路径(默认为results/result.sqlite3)
    --valid=VALID
    导出子域的有效性(默认None)
    --path=PATH
    导出路径(默认None)
    --format=FORMAT
    导出格式(默认xlsx)
    --output=OUTPUT
    是否将导出数据输出到终端(默认False)

    NOTES
    You can also use flags syntax for POSITIONAL ARGUMENTS

🌲目录结构

D:.
|
+---.github
+---docs
| collection_modules.md 收集模块说明
+---images
\---oneforall
| aiobrute.py 异步多进程多协程子域爆破模块,可以单独运行
| collect.py 各个收集模块上层调用
| config.py 配置文件
| dbexport.py 数据库导出模块,可以单独运行
| domains.txt 要批量爆破的域名列表
| oneforall.py OneForAll主入口,可以单独运行
| __init__.py
|
+---common 公共调用模块
+---data 存放一些所需数据
| next_subdomains.txt 下一层子域字典
| public_suffix_list.dat 顶级域名后缀
| srv_names.json 常见SRV记录前缀名
| subdomains.txt 子域爆破常见字典
|
\---modules
+---certificates 利用证书透明度收集子域模块
+---check 常规检查收集子域模块
+---crawl 利用网上爬虫档案收集子域模块
+---datasets 利用DNS数据集收集子域模块
+---dnsquery 利用DNS查询收集子域模块
+---intelligence 利用威胁情报平台数据收集子域模块
\---search 利用搜索引擎发现子域模块

🙏贡献

非常热烈欢迎各位大佬一起完善本项目!

⌛后续计划

  •  子域收集模块优化

  •  子域接管功能实现

  •  子域收集爬虫实现

  •  操作强大交互人性的前端界面实现

更多详情请阅读readme文档:

https://github.com/shmilylty/OneForAll/blob/master/README.md

Github地址:

https://github.com/shmilylty/OneForAll

喜欢记得点个Star哦

亲测确实好用,目前还有些bug,期待后续更新


文章来源: https://mp.weixin.qq.com/s/LOgzi6jBjdhk0VkISe8siw
如有侵权请联系:admin#unsafe.sh