OneForAll是一款功能強大的子域收集工具
作者:Jing Ling

English Document

項目簡介

項目主頁:https://shmilylty.github.io/OneForAll/

項目地址:https://github.com/shmilylty/OneForAll

在滲透測試中信息收集的重要性不言而喻,子域收集是信息收集中必不可少且非常重要的一環,目前網上也開源了許多子域收集的工具,但是總是存在以下部分問題:

  • 不夠強大,子域收集的接口不夠多,不能做到對批量子域自動收集,沒有自動子域解析,驗證,FUZZ以及信息拓展等功能。
  • 不夠友好,固然命令行模塊比較方便,但是當可選的參數很多,要實現的操作復雜,用命令行模式就有點不夠友好,如果有交互良好,高可操作的前端那么使用體驗就會好很多。

  • 缺少維護,很多工具幾年沒有更新過一次,issues和PR是啥,不存在的。

  • 效率問題,沒有利用多進程,多線程以及異步協程技術,速度較慢。

為了解決以上痛點,此項目應用而生,OneForAll一詞是來自我喜歡的一部日漫《我的英雄學院》,它是一種通過一代代的傳承不斷變強的潛力無窮的頂級個性,目前番劇也更新到了第三季了,歡迎大佬們入坑。正如其名,我希望OneForAll是一款集百家之長,功能強大的全面快速子域收集終極神器。

目前OneForAll還在開發中,肯定有不少問題和需要改進的地方,歡迎大佬們提交IssuesPR,用著還行給個小星星吧,目前有一個專門用于OneForAll交流和反饋QQ群:824414244,也可以給我發郵件[admin@hackfun.org]。

功能特性

  • 收集能力強大,詳細模塊請閱讀收集模塊說明

    1. 利用證書透明度收集子域(目前有6個模塊:censys_apispyse_apicertspottercrtshentrustgoogle

    2. 常規檢查收集子域(目前有4個模塊:域傳送漏洞利用axfr,檢查跨域策略文件cdx,檢查HTTPS證書cert,檢查內容安全策略csp,檢查robots文件robots,檢查sitemap文件sitemap,后續會添加檢查NSEC記錄,NSEC3記錄等模塊)

    3. 利用網上爬蟲檔案收集子域(目前有2個模塊:archivecrawlcommoncrawl,此模塊還在調試,該模塊還有待添加和完善)

    4. 利用DNS數據集收集子域(目前有18個模塊:binaryedge_api, circl_api, hackertarget, riddler, bufferover, dnsdb, ipv4info, robtex, chinaz, dnsdb_api, netcraft, securitytrails_api, chinaz_api, dnsdumpster, passivedns_api, ptrarchive, sitedossier,threatcrowd

    5. 利用DNS查詢收集子域(目前有1個模塊:通過枚舉常見的SRV記錄并做查詢來收集子域srv,該模塊還有待添加和完善)

    6. 利用威脅情報平臺數據收集子域(目前有5個模塊:riskiq_apithreatbook_apithreatminervirustotalvirustotal_api該模塊還有待添加和完善)

    7. 利用搜索引擎發現子域(目前有16個模塊:ask, bing_api, fofa_api, shodan_api, yahoo, baidu, duckduckgo, github, google, so, yandex, bing, exalead, google_api, sogou, zoomeye_api),在搜索模塊中除特殊搜索引擎,通用的搜索引擎都支持自動排除搜索,全量搜索,遞歸搜索。

  • 支持子域爆破,該模塊有常規的字典爆破,也有自定義的fuzz模式,支持批量爆破和遞歸爆破,自動判斷泛解析并處理。

  • 支持子域驗證,默認開啟子域驗證,自動解析子域DNS,自動請求子域獲取title和banner,并綜合判斷子域存活情況。
  • 支持子域接管,默認開啟子域接管風險檢查,支持子域自動接管(目前只有Github,有待完善),支持批量檢查。
  • 處理功能強大,發現的子域結果支持自動去除,自動DNS解析,HTTP請求探測,自動篩選出有效子域,拓展子域的Banner信息,最終支持的導出格式有txt, rst, csv, tsv, json, yaml, html, xls, xlsx, dbf, latex, ods
  • 速度極快收集模塊使用多線程調用,爆破模塊使用異步多進程多協程,子域驗證中DNS解析和HTTP請求使用異步多協程,多線程檢查子域接管風險。
  • 體驗良好,日志和終端輸出全使用中文,各大模塊都有進度條,異步保存各模塊結果。

上手指南

由于該項目處于開發中,會不斷進行更新迭代,下載使用最好克隆最新項目,請務必花一點時間閱讀此文檔,有助于你快速熟悉OneForAll!

安裝要求

OneForAll是基于CPython開發的,所以你需要Python環境才能運行,如果你的系統還沒有Python環境你可以參考Python 3 安裝指南,理論上Python 3.6,3.7和3.8都可以正常運行OneForAll,但是許多測試都是在Python 3.7上進行的,所以推薦你使用Python 3.7版本運行OneForAll。運行以下命令檢查Python和pip3版本:

python -V
pip3 -V

如果你看到以下類似輸出便說明Python環境沒有問題:

Python 3.7.4
pip 19.2.2 from C:\Users\shmilylty\AppData\Roaming\Python\Python37\site-packages\pip (python 3.7)

安裝步驟

  1. 下載

    本項目已經在碼云(Gitee)鏡像了一份,國內推薦使用碼云進行克隆比較快:

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

    或者:

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

  2. 安裝

    首先運行以下命令

    你可以通過pip3安裝OneForAll的依賴(如果你熟悉pipenv,那么推薦你使用pipenv安裝依賴),以下為Windows系統下使用pip3安裝依賴的示例:(注意:如果你的Python3安裝在系統Program Files目錄下,如:C:\Program Files\Python37,那么請以管理員身份運行命令提示符cmd執行以下命令!)

    cd OneForAll/ python -m pip install --user -U pip setuptools wheel -i https://mirrors.aliyun.com/pypi/simple/ pip3 install --user -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ cd oneforall/ python oneforall.py --help

    其他系統平臺的請參考依賴安裝,如果在安裝依賴過程中發現編譯某個依賴庫失敗時可以參考Q&A中解決方法,如果還沒有解決歡迎加群反饋。

  3. 更新

    注意:如果你之前已經克隆了項目運行之前請備份自己修改過的文件到項目外的地方(如config.py),然后執行以下命令更新項目:

    git fetch --all git reset --hard origin/master git pull

使用演示

  1. 如果你是通過pip3安裝的依賴則使用以下命令運行示例:

    cd oneforall/ python3 oneforall.py --target example.com run

  2. 如果你通過pipenv安裝的依賴則使用以下命令運行示例:

    cd oneforall/ pipenv run python oneforall.py --target example.com run

使用幫助

命令行參數只提供了一些常用參數,更多詳細的參數配置請見config.py,如果你認為有些參數是命令界面經常使用到的或缺少了什么參數等問題非常歡迎反饋。由于眾所周知的原因,如果要使用一些被墻的收集接口請先到config.py配置代理,有些收集模塊需要提供API(大多都是可以注冊賬號免費獲取),如果需要使用請到config.py配置API信息,如果不使用請忽略有關報錯提示。(詳細模塊請閱讀收集模塊說明

OneForAll命令行界面基于Fire實現,有關Fire更高級使用方法請參閱使用Fire CLI,有任何使用疑惑歡迎加群交流。

oneforall.py是主程序入口,oneforall.py可以調用aiobrute.pytakerover.pydbexport.py等模塊,為了方便進行子域爆破獨立出了aiobrute.py,為了方便進行子域接管風險檢查獨立出了takerover.py,為了方便數據庫導出獨立出了dbexport.py,這些模塊都可以單獨運行,并且所接受參數要更豐富一點。

?注意:當你在使用過程中遇到一些問題或者疑惑時,請先到Issues里使用搜索找找答案,還可以參閱常見問題與回答

1.oneforall.py使用幫助

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

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

   DESCRIPTION
       Version: 0.0.6
       Project: https://git.io/fjHT1

       Example:
           python3 oneforall.py --target example.com run
           python3 oneforall.py --target ./domains.txt run
           python3 oneforall.py --target example.com --brute True run
           python3 oneforall.py --target example.com --verify False run
           python3 oneforall.py --target example.com --valid None run
           python3 oneforall.py --target example.com --port medium run
           python3 oneforall.py --target example.com --format csv run
           python3 oneforall.py --target example.com --show True run

       Note:
           參數valid可選值1,0,None分別表示導出有效,無效,全部子域
           參數verify為True會嘗試解析和請求子域并根據結果給子域有效性打上標簽
           參數port可選值有'small', 'medium', 'large', 'xlarge',詳見config.py配置
           參數format可選格式有'txt', 'rst', 'csv', 'tsv', 'json', 'yaml', 'html',
                             'jira', 'xls', 'xlsx', 'dbf', 'latex', 'ods'
           參數path為None會根據format參數和域名名稱在項目結果目錄生成相應文件

   ARGUMENTS
       TARGET
           單個域名或者每行一個域名的文件路徑(必需參數)

   FLAGS
       --brute=BRUTE
           使用爆破模塊(默認False)
       --verify=VERIFY
           驗證子域有效性(默認True)
       --port=PORT
           請求驗證的端口范圍(默認medium)
       --valid=VALID
           導出子域的有效性(默認1)
       --path=PATH
           導出路徑(默認None)
       --format=FORMAT
           導出格式(默認xlsx)
       --show=SHOW
           終端顯示導出數據(默認False)

2.aiobrute.py使用幫助

關于泛解析問題處理程序首先會訪問一個隨機的子域判斷是否泛解析,如果使用了泛解析則是通過以下判斷處理:

  • 一是主要是與泛解析的IP集合和TTL值做對比,可以參考這篇文章
  • 二是多次解析到同一IP集合次數(默認設置為10,可以在config.py設置大小)。
  • 三是考慮爆破效率問題目前還沒有加上HTTP響應體相似度對比和響應體內容判斷,如果有必要后續添加。

經過不嚴謹測試在16核心的CPU,使用16進程64協程,100M帶寬的環境下,設置任務分割為50000,跑兩百萬字典大概10分鐘左右跑完,大概3333個子域每秒。

   python aiobrute.py --help
   NAME
       aiobrute.py - OneForAll多進程多協程異步子域爆破模塊

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

   DESCRIPTION
       Example:
           python3 aiobrute.py --target example.com run
           python3 aiobrute.py --target ./domains.txt run
           python3 aiobrute.py --target example.com --process 4 --coroutine 64 run
           python3 aiobrute.py --target example.com --wordlist subdomains.txt run
           python3 aiobrute.py --target example.com --recursive True --depth 2 run
           python3 aiobrute.py --target m.{fuzz}.a.bz --fuzz True --rule [a-z] run

       Note:
           參數segment的設置受CPU性能,網絡帶寬,運營商限制等問題影響,默認設置500個子域為任務組,
           當你覺得你的環境不受以上因素影響,當前爆破速度較慢,那么強烈建議根據字典大小調整大小:
           十萬字典建議設置為5000,百萬字典設置為50000
           參數valid可選值1,0,None,分別表示導出有效,無效,全部子域
           參數format可選格式有'txt', 'rst', 'csv', 'tsv', 'json', 'yaml', 'html',
                             'jira', 'xls', 'xlsx', 'dbf', 'latex', 'ods'
           參數path為None會根據format參數和域名名稱在項目結果目錄生成相應文件

   ARGUMENTS
       TARGET
           單個域名或者每行一個域名的文件路徑

   FLAGS
       --process=PROCESS
           爆破的進程數(默認CPU核心數)
       --coroutine=COROUTINE
           每個爆破進程下的協程數(默認64)
       --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配置)
       --export=EXPORT
           是否導出爆破結果(默認True)
       --valid=VALID
           導出子域的有效性(默認None)
       --format=FORMAT
           導出格式(默認xlsx)
       --path=PATH
           導出路徑(默認None)
       --show=SHOW
           終端顯示導出數據(默認False)

3.其他模塊使用請參考使用幫助

主要框架

  • aiodns - 簡單DNS異步解析庫。
  • aiohttp - 異步http客戶端/服務器框架
  • aiomultiprocess - 將Python代碼提升到更高的性能水平(multiprocessing和asyncio結合,實現異步多進程多協程)
  • beautifulsoup4 - 可以輕松從HTML或XML文件中提取數據的Python庫
  • fire - Python Fire是一個純粹根據任何Python對象自動生成命令行界面(CLI)的庫
  • loguru - 旨在帶來愉快的日志記錄Python庫
  • records - Records是一個非常簡單但功能強大的庫,用于對大多數關系數據庫進行最原始SQL查詢。
  • requests - Requests 唯一的一個非轉基因的 Python HTTP 庫,人類可以安全享用。
  • tqdm - 適用于Python和CLI的快速,可擴展的進度條庫

感謝這些偉大優秀的Python庫!

目錄結構

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           利用搜索引擎發現子域模塊

貢獻

非常熱烈歡迎各位大佬一起完善本項目!

后續計劃

  • [ ] 各模塊支持優化和完善
  • [ ] 子域監控(標記每次新發現的子域)
  • [ ] 子域收集爬蟲實現(包括從JS等靜態資源文件中收集子域)
  • [ ] 操作強大交互人性的前端界面實現(暫定:前端:Element + 后端:Flask)

更多詳細信息請閱讀TODO.md

版本控制

該項目使用SemVer語言化版本格式進行版本管理,你可以在Releases查看可用版本。

貢獻者

你可以在CONTRIBUTORS.md中參看所有參與該項目的開發者。

版權

該項目簽署了GPL-3.0授權許可,詳情請參閱LICENSE

鳴謝

感謝網上開源的各個子域收集項目!

感謝A-Team大哥們熱情無私的問題解答!

免責聲明

本工具僅限于合法授權的企業安全建設,在使用本工具過程中,您應確保自己所有行為符合當地的法律法規,并且已經取得了足夠的授權。

如您在使用本工具的過程中存在任何非法行為,您需自行承擔所有后果,本工具所有作者和所有貢獻者不承擔任何法律及連帶責任。

除非您已充分閱讀、完全理解并接受本協議所有條款,否則,請您不要安裝并使用本工具。

您的使用行為或者您以其他任何明示或者默示方式表示接受本協議的,即視為您已閱讀并同意本協議的約束。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1053/