溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行InsectsAwke自動化工具源碼分析

發(fā)布時間:2021-11-18 15:53:04 來源:億速云 閱讀:145 作者:柒染 欄目:網(wǎng)絡管理

這期內(nèi)容當中小編將會給大家?guī)碛嘘P如何進行InsectsAwke自動化工具源碼分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。


簡介

InsectsAwke是一個比較著名的開源的基于Python開發(fā)的漏洞掃描系統(tǒng)。啟蒙于Bugscan脫胎于Pocsuite。采用FLASK+MongoDB提供WEB服務。初步具備Por的健壯性。

主要功能

  • 漏洞掃描

    • 通過調(diào)用創(chuàng)宇的 Pocsuite 進行掃描,掃描插件通過 Seebug

    • 掃描目標只能是單個 IP 或者 URL,不支持網(wǎng)段掃描(公司是中小型公司,就忘寫這塊需求了),默認有80余個插件,大多是 Seebug 的免費PoC

    • 任務周期可以選擇臨時、每日、每周或每月

  • 資產(chǎn)管理   

    • 可以通過各資產(chǎn)庫創(chuàng)建漏洞掃描任務,同樣資產(chǎn)庫只能是單個 IP 或者 URL。

    • 開啟端口發(fā)現(xiàn)功能后,后端會定時調(diào)用 nmap 對資產(chǎn)進行端口掃描,需要掃描的端口可以在設置里進行配置

  • 域名發(fā)現(xiàn)功能

    • 即子域名爆破功能,但目前功能尚不完善,只能通過配置字典進行暴力猜解,域名字典可以在設置處進行配置,項目 tests 文件夾內(nèi)提供了一份子域名字典(字典來源 ring04h 的 wydomain 項目)

安裝過程

  • 安裝虛擬機 16.04

  • 更新為國內(nèi)源

  • 獲取項目源碼

 git clone https://github.com/jeffzh4ng/InsectsAwake.git
  • 安裝 Python 及 pip

sudo apt update
sudo apt install python python-pip

  • 安裝 MongoDB

    • 安裝的是企業(yè)版MongoDB,普通的MongoDB是無法支持系統(tǒng)運行的

    • 很多人按照freebuf 的安裝不成功,是因為載入的是3.4版本的安裝源可是當我們執(zhí)行 sudo apt-get install -y mongodb-enterp的時候,如果沒有指定版本號的話,apt默認安裝最新的即3.6版本,所以mongodb-enterprise在安裝的時候就會出現(xiàn)問題。這里我們加載的是3.6版本的安裝源,所以可以安裝成功

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5
echo "deb [ arch=amd64,arm64,ppc64el,s390x ] http://repo.mongodb.com/apt/ubuntu xenial/mongodb-enterprise/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-enterprise.list
sudo apt-get update
sudo apt-get install -y mongodb-enterprise

  • 其他系統(tǒng)安裝參考官方手冊:

https://docs.mongodb.com/manual/installation/

  • 安裝 Python 依賴包

cd InsectsAwake
sudo pip install pip -U
sudo pip install -r requirements.txt
  • 安裝nmap

sudo apt install nmap
  • 配置數(shù)據(jù)庫

    sudo mkdir -p  /data/db
    sudo service mongod start
    mongo --host 127.0.0.1:27017


    use InsectsAwake
    db.createUser({user:'you username',pwd:'you password',roles:[{role:'dbOwner',db:'InsectsAwake'}]})
    exit

    • 添加用戶

    • 啟動數(shù)據(jù)庫

  • 修改掃描器配置

    class Config():
        WEB_USER = 'admin'          // 掃描器登錄用戶
        WEB_PASSWORD = 'whoami'     // 掃描器登錄密碼
        WEB_HOST = '127.0.0.1'      // 本地訪問
        WEB_PORT = 5000             // Web服務端口
        POCSUITE_PATH = basedir + '/../InsectsAwake/views/modules/scanner/pocsuite_plugin/'
    
    class ProductionConfig(Config):
        DB_HOST = '127.0.0.1'       // 數(shù)據(jù)庫地址
        DB_PORT = 27017             // 數(shù)據(jù)庫端口
        DB_USERNAME = 'testuser'    // 數(shù)據(jù)庫用戶
        DB_PASSWORD = 'testpwd'     // 數(shù)據(jù)庫密碼
        DB_NAME = 'test'            // 數(shù)據(jù)庫名
    
        // 數(shù)據(jù)庫集合名
        PLUGIN_DB = 'test_plugin_info'
        TASKS_DB = 'test_tasks'
        VULNERABILITY_DB = 'test_vuldb'
        ASSET_DB = 'test_asset'
        CONFIG_DB = 'test_config'
        SERVER_DB = 'test_server'
        SUBDOMAIN_DB = 'test_subdomain'
        DOMAIN_DB = 'test_domain'
        WEEKPASSWD_DB = 'test_weekpasswd'

    比較懶,clone下來直接chmod  -R 777 然后就可以愉快的修改文件了 如何進行InsectsAwke自動化工具源碼分析

    • 掃描器配置文件路徑:InsectsAwake-Project/instance/config.py

  • 初始化數(shù)據(jù)庫

cd /InsectsAwake/migration
python start.py
  • 運行系統(tǒng)

sudo ./run.sh restart
  • run.sh會出現(xiàn)有關nohup的報錯可以參考如何進行InsectsAwke自動化工具源碼分析 https://blog.csdn.net/educast/article/details/28273301 進行適當修改

  • 成功

  • 項目默認運行在127.0.0.1:5000 (可以 修改 默認的 WEB_HOST 及 WEB_PORT),無法外網(wǎng)訪問,建議配置 Nginx 或者 Caddy 等Web服務代理訪問

  • 后記

    • 系統(tǒng)安裝后先更新一遍,推薦清華源

    • 安裝mongodb-enterprise的時候建議慢慢來一遍成功,否則安裝會很麻煩apt各種報錯基本等于報廢需要重新來過了。。。

    • 剛剛啟動run.sh的時候等一下才能看到web頁面

       

工作流程

下圖為系統(tǒng)運行簡單SDL流程圖

項目結(jié)構(gòu)

├── InsectsAwake
│   ├── app.py flask blueprint注冊
│   ├── __init__.py
│   ├── static   網(wǎng)頁靜態(tài)文件夾
│   ├── templates 網(wǎng)頁html模板文件夾
│   └── views  
│       ├── asset_management.py  flask資產(chǎn)管理處理頁面
│       ├── authenticate.py   flask網(wǎng)頁認證頁面,登錄與登出
│       ├── dashboard.py   dashboard頁面
│       ├── index.py   主頁
│       ├── __init__.py
│       ├── lib
│       │   ├── __init__.py
│       │   ├── mongo_db.py  創(chuàng)建和管理mongo數(shù)據(jù)庫
│       ├── modules
│       │   ├── discovery   資產(chǎn)發(fā)現(xiàn)
│       │   │   ├── __init__.py  
│       │   │   ├── port_scanner.py   掃描端口和目標服務信息
│       │   ├── __init__.py
│       │   ├── scanner   漏洞掃描
│       │   │   ├── __init__.py
│       │   │   ├── pocsuite_plugin   存放漏洞掃描poc插件的文件夾
│       │   │   ├── pocsuite_scanner.py  調(diào)用pocsuites框架對目標進行漏洞掃描
│       │   │   ├── vulnerability_plugin.py 管理漏洞poc插件,向數(shù)據(jù)庫中加入插件信息
│       │   ├── subdomain  子域名爆破
│       │   │   ├── __init__.py
│       │   │   ├── subdomain.py  子域名爆破
│       │   └── week_passwd
│       │       ├── __init__.py
│       │       └── week_http_passwd_test.py  作者還未實現(xiàn)
│       ├── plugin_management.py  flask poc插件管理頁面
│       ├── settings.py   flask 平臺參數(shù)設置頁面,如線程數(shù)量,字典
│       ├── sql_injection.py  作者還未實現(xiàn)
│       ├── subdomain_brute.py  flask 子域名爆破頁面
│       ├── task_management.py  flask 任務管理頁面
│       ├── vulnerability_management.py  flask 漏洞掃描結(jié)果管理頁面 
│       ├── weak_passwd_test.py   falsk弱口令管理頁面
├── InsectsAwake.py  主執(zhí)行文件
├── instance
│   ├── config.py   flask 配置和數(shù)據(jù)庫配置
│   ├── __init__.py
├── LICENSE
├── logs
│   ├── db.log
│   └── log.log
├── migration
│   ├── DataModels
│   └── .py  創(chuàng)建數(shù)據(jù)庫
├── requirements.txt
├── run.sh  
├── tests
│   ├── domain.dict 子域名爆破字典

項目思維導圖

如何進行InsectsAwke自動化工具源碼分析

主文件分析

def scanner():
    
    調(diào)用漏洞掃描模塊
    :return: 
    
    config_db  db_name_conf()[]
    scanner_time  int(connectiondb(config_db).find_one()[])
    print()
    scanner_loop_execute(scanner_time)


def manage():
    
    調(diào)用flask
    :return: 
    
    app.runflask_app.config.get(), flask_app.config.get())


def discovery():
    
    調(diào)用資產(chǎn)發(fā)現(xiàn)模塊
    :return: 
    
    print()
    scheduler  BlockingScheduler()
    try:
        
        scheduler.add_job(MultiProcess().start_port_scan, , , , )
        scheduler.start()
    except Exception as e:
        print(e)


def subdomain():
    
    調(diào)用子域名爆破模塊
    :return: 
    
    scanner_time  
    print()
    subdomain_loop_execute(scanner_time)


 __name__  :
    
    開啟四個線程執(zhí)行這4個模塊
    
    t1  threading.Threadscanner, ())
    t2  threading.Threadmanage, ())
    t3  threading.Threadsubdomain, ())
    t4  threading.Threaddiscovery, ())
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t1.join()
    t2.join()
    t3.join()
    t4.join()

子域名爆破模塊

該模塊與服務器Flask是分開的。Flask負責將前端接受的關于子域名破解的信息存儲和更新到數(shù)據(jù)庫中,而核心的子域名暴力破解程序則使用調(diào)度器每隔一段時間循環(huán)檢查數(shù)據(jù)庫中的配置文件,當數(shù)據(jù)庫中有數(shù)據(jù)滿足暴力破解程序運行的條件時,就開始執(zhí)行程序,對目標進行子域名暴力破解,并將結(jié)果存儲在數(shù)據(jù)庫中。

簡介

InsectsAwake/views/subdomain_brute.py  核心文件,用于對目標進行子域名查找
InsectsAwake/views/modules/subdomain/subdomain.py  flask后端文件,用于接受前端的數(shù)據(jù)并存儲在數(shù)據(jù)庫中

執(zhí)行函數(shù)
def subdomain():
    每30s運行一次子域名爆破程序
    scanner_time  
    print()
    subdomain_loop_execute(scanner_time)

細節(jié)函數(shù)分析

class DomainsBrute:
    def __init__(self, target_domain, subdomain_dict, domain_id, domain_name):
        
        初始化類和成員變量
        :param target_domain:  目標域名host
        :param subdomain_dict: 子域名爆破字典
        :param domain_id: 域名在數(shù)據(jù)庫中所對應的IP
        :param domain_name: 域名的名字,如百度
        
    def resolver_check(self):
        
        對隨機生成一個域名并進行處理,如果這個隨機的域名存在就返回解析的結(jié)果
        :return: [] or False

    def handle_domain(self):
        
        組成新的二級或者三級域名
        :return: <type >: [u, u, u]
        
    
    def handle_result(self):
        
        獲取處理的結(jié)果,如果該二級或者三級域名存在,則存入數(shù)據(jù)庫,
        :return:
        

    def save_db(self, result):
        
        將域名爆破結(jié)果存儲到數(shù)據(jù)庫中test_subdomain
        :param result:
        :return:
        

    def run_multi(self):
        
        多進程解析域名
        :return:
        
        self.handle_domain()  
        scanner_pool  multiprocessing.Pool)  
        self.result  scanner_pool.map(ha_resolver_domain, self.domain_list) 
        scanner_pool.close()
        scanner_pool.join()
        self.handle_result()  

def ha_resolver_domain(domain):
    
    解析域名,返回解析結(jié)果
    :param domain:
    :return: {: [, ]} or {}
    
def start_brute(inc_time):
    
    
    :param inc_time:
    :return:
    
    schedule.enter(inc_time, , start_brute, (inc_time,)) 
  
    subdomain_list  connectiondb(config_db).find_one()[] 
     domain_text  connectiondb(domain_db).find(): 
        
         domain_text[]  :  
            domain_list  domain_text[]  
            domain_id  domain_text[]  
            domain_name  domain_text[]  
            print()
            start_date  datetime.now()
            
            connectiondb(domain_db).update_one({: ObjectId(domain_id)}, {: {: }})
             target  domain_list:
                  DomainsBrute(target, subdomain_list, domain_id, domain_name)
                .run_multi()
            
             domain_text[]  :
                 result  connectiondb(subdomain_db).find({: ObjectId(domain_id)}):
                    next_subdomain  eval(result[]).keys()[0]  
                      DomainsBrute(next_subdomain, subdomain_list, domain_id, domain_name)
                    .run_multi()
         
            connectiondb(domain_db).update_one({: ObjectId(domain_id)}, {: {: }})
            scan_time  datetime.now()  start_date
            print(, scan_time.total_seconds())

def subdomain_loop_execute(inc,):

    schedule.enter(inc, , start_brute, (inc,))  
    schedule.run()

稍微修改了一下,現(xiàn)在可以單獨使用了https://github.com/cmustard06/subdomain

端口掃描模塊

端口掃描模塊依然是與falsk框架分開的,是一個獨立運行的模塊,數(shù)據(jù)的交互主要還是通過數(shù)據(jù)庫進行的,循周期性運行程序,通過查看數(shù)據(jù)庫的關于端口掃描模塊的配置信息,如果配置滿足一定條件時,就開始執(zhí)行程序。該模塊使用使用了第三方模塊APScheduler 該模塊是一個Python定時任務框架,使用起來十分方便。提供了基于日期、固定時間間隔以及crontab類型的任務,并且可以持久化任務、并以daemon方式運行應用。函數(shù)實現(xiàn)的是每天14:47執(zhí)行這start_port_scan這個函數(shù)

cheduler.add_job(MultiProcess().start_port_scan, 'cron', day='1-31', hour=14, minute=47)
def nmap_scanner(target_host):
    
    對目標主機的指定斷開進行掃描,返回掃描結(jié)果
    :param target_host:
    :return: [{: , : , : , : },]
    原函數(shù)中存在bug,修改
    port_scanner.scan(target_host, .join( % port  port  eval(target_ports))) 
    

class MultiProcess:
    def __init__(self):
        self.target_list  []
        self.server_db  db_name_conf()[]
        self.asset_db  db_name_conf()[]
        self.processes_count  int(connectiondb(config_db).find_one()[])
        self.asset_id  
        self.asset_name  

    def scan_pool(self):
        
        不同目標多進程端口掃描,將結(jié)果更新到數(shù)據(jù)庫中
        :return: 
        

    def start_port_scan(self):
        
        從數(shù)據(jù)庫中取出數(shù)據(jù),調(diào)用start_pool函數(shù)
        :return:

漏洞掃描模塊

漏洞掃描模塊使用的是知道創(chuàng)宇的開源掃描框架pocsuite,由于該框架在后期升級維護的過程中修改了很多功能,導致如果使用最新版的pocsuite框架運行程序時可能會出現(xiàn)異常,這里采用的是該框架的2.0.4版。比如在測試的時候由于導入下面模塊時出現(xiàn)錯誤,通過查看原函數(shù)發(fā)現(xiàn)

from pocsuite.lib.utils.password import genPassword

沒有genPassword函數(shù),因此手動修改了password.py文件,修改后文件內(nèi)容如下

Copyright (c)  pocsuite developers (https://seebug.org)
See the file   copying permission

import string
from pocsuite.lib.core.common import getFileItems
from pocsuite.lib.core.data import paths
from random import choice

def getWeakPassword():
    return getFileItems(paths.WEAK_PASS)


def getLargeWeakPassword():
    return getFileItems(paths.LARGE_WEAK_PASS)


def genPassword, string.letters  string.digits):
    return .join([choice(chars)  _  range(length)])

修改完成后繼續(xù)運行測試程序,運行成功。成果獲取到了漏洞掃描結(jié)果的數(shù)據(jù),如下

(, , , , , (0, ), , )

代碼分析

函數(shù)分析

    def verify_poc(self, target):
        
        poc驗證函數(shù)
        :param target:
        :return:

    def start_scan(self):
        
        使用多線程進行漏洞掃描
        :return:
        
    def periodic_tasks(self):
        
        從數(shù)劇庫中獲取任務信息,跟據(jù)配置信息周期性掃描目標
        :return:
        
def scanner_loop_execute(inc):
    
    主程序循環(huán)執(zhí)行模塊
    :param inc: 
    :return:

數(shù)據(jù)庫模塊

數(shù)據(jù)庫結(jié)構(gòu)


  1. # PLUGIN_DB 插件集合

  2. ------------------------------------

  3. plugin_appversion       影響版本

  4. plugin_vultype          漏洞名稱

  5. plugin_vuldate          漏洞日期

  6. plugin_filename         文件路徑

  7. plugin_name             插件名

  8. plugin_appname          應用名稱

  9. plugin_author           插件作者

  10. _id                     ObjectId

  11. ------------------------------------

  12. # TASKS_DB 任務集合

  13. ------------------------------------

  14. task_status             任務狀態(tài)

  15. end_date                結(jié)束時間

  16. scan_target_list        掃描對象(列表)

  17. task_name               任務名稱

  18. plugin_id               插件id

  19. _id                     ObjectId

  20. start_date              任務開始時間

  21. task_plan               掃描計劃

  22. ------------------------------------

  23. # VULNERABILITY_DB 漏洞集合

  24. ------------------------------------

  25. scan_result             掃描結(jié)果

  26. target                  掃描對象

  27. task_id                 任務ID

  28. appname                 應用名稱

  29. scan_date               掃描日期

  30. poc_name                插件名稱

  31. vulversion              漏洞影響版本

  32. poc_vultype             漏洞類型

  33. task_name               任務名稱

  34. plugin_id               插件ID

  35. _id                     ObjectId

  36. ------------------------------------

  37. # ASSET_DB 資產(chǎn)庫集合

  38. asset_date              創(chuàng)建日期

  39. scan_option             資產(chǎn)發(fā)現(xiàn)

  40. asset_text              資產(chǎn)

  41. asset_name              資產(chǎn)庫名稱

  42. dept_name               部門名稱

  43. admin_name              管理員

  44. _id                     ObjectId

  45. ------------------------------------

  46. # CONFIG_DB 配置集合

  47. ------------------------------------

  48. port_thread             端口掃描線程

  49. scanner_thread          漏洞檢測線程

  50. port_list               端口掃描列表

  51. config_name             配置文件名稱

  52. subdomain               子域名字典

  53. ------------------------------------

  54. # SERVER_DB 服務集合

  55. ------------------------------------

  56. host                    主機

  57. asset_id                資產(chǎn)庫ID

  58. port                    端口

  59. port_server             服務

  60. banner                  指紋(cpe)

  61. scan_date               掃描日期

  62. asset_name              所屬資產(chǎn)庫

  63. ------------------------------------

  64. # DOMAIN_DB 服務集合

  65. ------------------------------------

  66. domain_text             主域名

  67. scan_option             三級域名掃描

  68. dept_name               域名所屬部門

  69. domain_date             創(chuàng)建日期

  70. domain_name             域名名稱

  71. _id                     ObjectId

  72. ------------------------------------

  73. # SUBDOMAIN_DB 服務集合

  74. ------------------------------------

  75. date                    掃描日期

  76. domain                  主域名

  77. _id                     ObjectId

  78. result                  子域名

  79. domain_id               主域名ID

  80. domain_name             域名名稱

  81. ------------------------------------

  82. # WEEKPASSWD_DB 服務集合

  83. ------------------------------------

  84. date                    掃描日期

  85. target                  檢測對象

  86. task_name               任務名稱

  87. post_data               登錄數(shù)據(jù)包

  88. status                  檢測狀態(tài)

  89. week_passwd_count       弱口令數(shù)量

  90. error_data              失敗標記

  91. success_data            成功標記

  92. username                賬號

  93. password                密碼

  94. week_passwd_result      存在弱口令的結(jié)果

  95. _id                     ObjectId

  96. ------------------------------------

  97. `

數(shù)據(jù)庫詳情

  • test_asset :該表collection用于存儲資產(chǎn)信息,通過該表中的信息可以在后面調(diào)用漏洞掃描模塊和nmap模塊對資產(chǎn)進行掃描

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

  • test_config:該表用于存放域名字典,需要掃描的端口,開啟的進程數(shù)量等數(shù)據(jù)

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

  • test_domain:該表用于存放域名信息,通過該表中的數(shù)據(jù)對表中的域名進行子域名爆破

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

  • test_plugin_info:該表用于存放掃描插件信息,包括插件名稱,功能,以及插件存放的路徑

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

  • test_server:該表中存儲的是資產(chǎn)信息,包括開放的端口信息以及服務

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

  • test_subdomain:該表用于存放子域名爆破結(jié)果

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

  • test_tasks:該表用于存儲漏洞掃描任務信息

如何進行InsectsAwke自動化工具源碼分析

如何進行InsectsAwke自動化工具源碼分析

該系統(tǒng)使用的所有模塊之間都是通過數(shù)據(jù)庫進行數(shù)據(jù)交互的,每個模塊都是相對獨立的運行,單獨拿出來做測試也是沒有問題的,在進行代碼分析時也很友好,一個槽點就是漏洞掃描模塊使用的pocsuite開源框架有一些問題,每一次版本的迭代都有新的功能被添加,舊的功能被刪除,導致了官方的pocsuite poc驗證插件容易出問題,老版本的poc插件無法在新的框架下運行??!

上述就是小編為大家分享的如何進行InsectsAwke自動化工具源碼分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI