千家信息网

如何进行InsectsAwke自动化工具源码分析

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这期内容当中小编将会给大家带来有关如何进行InsectsAwke自动化工具源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。简介InsectsAwke是一个比较
千家信息网最后更新 2024年11月26日如何进行InsectsAwke自动化工具源码分析

这期内容当中小编将会给大家带来有关如何进行InsectsAwke自动化工具源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。


简介

InsectsAwke是一个比较著名的开源的基于Python开发的漏洞扫描系统。启蒙于Bugscan脱胎于Pocsuite。采用FLASK+MongoDB提供WEB服务。初步具备Por的健壮性。

主要功能

  • 漏洞扫描

    • 通过调用创宇的 Pocsuite 进行扫描,扫描插件通过 Seebug

    • 扫描目标只能是单个 IP 或者 URL,不支持网段扫描(公司是中小型公司,就忘写这块需求了),默认有80余个插件,大多是 Seebug 的免费PoC

    • 任务周期可以选择临时、每日、每周或每月

  • 资产管理

    • 可以通过各资产库创建漏洞扫描任务,同样资产库只能是单个 IP 或者 URL。

    • 开启端口发现功能后,后端会定时调用 nmap 对资产进行端口扫描,需要扫描的端口可以在设置里进行配置

  • 域名发现功能

    • 即子域名爆破功能,但目前功能尚不完善,只能通过配置字典进行暴力猜解,域名字典可以在设置处进行配置,项目 tests 文件夹内提供了一份子域名字典(字典来源 ring04h 的 wydomain 项目)

安装过程

  • 安装虚拟机 16.04

  • 更新为国内源

  • 获取项目源码

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

sudo apt updatesudo apt install python python-pip
  • 安装 MongoDB

    • 安装的是企业版MongoDB,普通的MongoDB是无法支持系统运行的

    • 很多人按照freebuf 的安装不成功,是因为载入的是3.4版本的安装源可是当我们执行 sudo apt-get install -y mongodb-enterp的时候,如果没有指定版本号的话,apt默认安装最新的即3.6版本,所以mongodb-enterprise在安装的时候就会出现问题。这里我们加载的是3.6版本的安装源,所以可以安装成功

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5echo "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.listsudo apt-get updatesudo apt-get install -y mongodb-enterprise
  • 其他系统安装参考官方手册:

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

  • 安装 Python 依赖包

cd InsectsAwakesudo pip install pip -Usudo pip install -r requirements.txt
  • 安装nmap

sudo apt install nmap
  • 配置数据库

    sudo mkdir -p  /data/dbsudo service mongod startmongo --host 127.0.0.1:27017


    use InsectsAwakedb.createUser({user:'you username',pwd:'you password',roles:[{role:'dbOwner',db:'InsectsAwake'}]})exit
    • 添加用户

    • 启动数据库

  • 修改扫描器配置

    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'       // 数据库地址    DB_PORT = 27017             // 数据库端口    DB_USERNAME = 'testuser'    // 数据库用户    DB_PASSWORD = 'testpwd'     // 数据库密码    DB_NAME = 'test'            // 数据库名    // 数据库集合名    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 然后就可以愉快的修改文件了

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

  • 初始化数据库

cd /InsectsAwake/migrationpython start.py
  • 运行系统

sudo ./run.sh restart
  • run.sh会出现有关nohup的报错可以参考 https://blog.csdn.net/educast/article/details/28273301 进行适当修改

  • 成功

  • 项目默认运行在127.0.0.1:5000 (可以 修改 默认的 WEB_HOST 及 WEB_PORT),无法外网访问,建议配置 Nginx 或者 Caddy 等Web服务代理访问

  • 后记

    • 系统安装后先更新一遍,推荐清华源

    • 安装mongodb-enterprise的时候建议慢慢来一遍成功,否则安装会很麻烦apt各种报错基本等于报废需要重新来过了。。。

    • 刚刚启动run.sh的时候等一下才能看到web页面

工作流程

下图为系统运行简单SDL流程图

项目结构

├── InsectsAwake│   ├── app.py flask blueprint注册│   ├── __init__.py│   ├── static   网页静态文件夹│   ├── templates 网页html模板文件夹│   └── views  │       ├── asset_management.py  flask资产管理处理页面│       ├── authenticate.py   flask网页认证页面,登录与登出│       ├── dashboard.py   dashboard页面│       ├── index.py   主页│       ├── __init__.py│       ├── lib│       │   ├── __init__.py│       │   ├── mongo_db.py  创建和管理mongo数据库│       ├── modules│       │   ├── discovery   资产发现│       │   │   ├── __init__.py  │       │   │   ├── port_scanner.py   扫描端口和目标服务信息│       │   ├── __init__.py│       │   ├── scanner   漏洞扫描│       │   │   ├── __init__.py│       │   │   ├── pocsuite_plugin   存放漏洞扫描poc插件的文件夹│       │   │   ├── pocsuite_scanner.py  调用pocsuites框架对目标进行漏洞扫描│       │   │   ├── vulnerability_plugin.py 管理漏洞poc插件,向数据库中加入插件信息│       │   ├── subdomain  子域名爆破│       │   │   ├── __init__.py│       │   │   ├── subdomain.py  子域名爆破│       │   └── week_passwd│       │       ├── __init__.py│       │       └── week_http_passwd_test.py  作者还未实现│       ├── plugin_management.py  flask poc插件管理页面│       ├── settings.py   flask 平台参数设置页面,如线程数量,字典│       ├── sql_injection.py  作者还未实现│       ├── subdomain_brute.py  flask 子域名爆破页面│       ├── task_management.py  flask 任务管理页面│       ├── vulnerability_management.py  flask 漏洞扫描结果管理页面 │       ├── weak_passwd_test.py   falsk弱口令管理页面├── InsectsAwake.py  主执行文件├── instance│   ├── config.py   flask 配置和数据库配置│   ├── __init__.py├── LICENSE├── logs│   ├── db.log│   └── log.log├── migration│   ├── DataModels│   └── .py  创建数据库├── requirements.txt├── run.sh  ├── tests│   ├── domain.dict 子域名爆破字典

项目思维导图

主文件分析

def scanner():        调用漏洞扫描模块    :return:         config_db  db_name_conf()[]    scanner_time  int(connectiondb(config_db).find_one()[])    print()    scanner_loop_execute(scanner_time)def manage():        调用flask    :return:         app.runflask_app.config.get(), flask_app.config.get())def discovery():        调用资产发现模块    :return:         print()    scheduler  BlockingScheduler()    try:                scheduler.add_job(MultiProcess().start_port_scan, , , , )        scheduler.start()    except Exception as e:        print(e)def subdomain():        调用子域名爆破模块    :return:         scanner_time      print()    subdomain_loop_execute(scanner_time) __name__  :        开启四个线程执行这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负责将前端接受的关于子域名破解的信息存储和更新到数据库中,而核心的子域名暴力破解程序则使用调度器每隔一段时间循环检查数据库中的配置文件,当数据库中有数据满足暴力破解程序运行的条件时,就开始执行程序,对目标进行子域名暴力破解,并将结果存储在数据库中。

简介

InsectsAwake/views/subdomain_brute.py  核心文件,用于对目标进行子域名查找InsectsAwake/views/modules/subdomain/subdomain.py  flask后端文件,用于接受前端的数据并存储在数据库中执行函数def subdomain():    每30s运行一次子域名爆破程序    scanner_time      print()    subdomain_loop_execute(scanner_time)

细节函数分析

class DomainsBrute:    def __init__(self, target_domain, subdomain_dict, domain_id, domain_name):                初始化类和成员变量        :param target_domain:  目标域名host        :param subdomain_dict: 子域名爆破字典        :param domain_id: 域名在数据库中所对应的IP        :param domain_name: 域名的名字,如百度            def resolver_check(self):                对随机生成一个域名并进行处理,如果这个随机的域名存在就返回解析的结果        :return: [] or False    def handle_domain(self):                组成新的二级或者三级域名        :return: : [u, u, u]                def handle_result(self):                获取处理的结果,如果该二级或者三级域名存在,则存入数据库,        :return:            def save_db(self, result):                将域名爆破结果存储到数据库中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):        解析域名,返回解析结果    :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()

稍微修改了一下,现在可以单独使用了https://github.com/cmustard06/subdomain

端口扫描模块

端口扫描模块依然是与falsk框架分开的,是一个独立运行的模块,数据的交互主要还是通过数据库进行的,循周期性运行程序,通过查看数据库的关于端口扫描模块的配置信息,如果配置满足一定条件时,就开始执行程序。该模块使用使用了第三方模块APScheduler 该模块是一个Python定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务、并以daemon方式运行应用。函数实现的是每天14:47执行这start_port_scan这个函数

cheduler.add_job(MultiProcess().start_port_scan, 'cron', day='1-31', hour=14, minute=47)
def nmap_scanner(target_host):        对目标主机的指定断开进行扫描,返回扫描结果    :param target_host:    :return: [{: , : , : , : },]    原函数中存在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):                不同目标多进程端口扫描,将结果更新到数据库中        :return:             def start_port_scan(self):                从数据库中取出数据,调用start_pool函数        :return:

漏洞扫描模块

漏洞扫描模块使用的是知道创宇的开源扫描框架pocsuite,由于该框架在后期升级维护的过程中修改了很多功能,导致如果使用最新版的pocsuite框架运行程序时可能会出现异常,这里采用的是该框架的2.0.4版。比如在测试的时候由于导入下面模块时出现错误,通过查看原函数发现

from pocsuite.lib.utils.password import genPassword

没有genPassword函数,因此手动修改了password.py文件,修改后文件内容如下

Copyright (c)  pocsuite developers (https://seebug.org)See the file   copying permissionimport stringfrom pocsuite.lib.core.common import getFileItemsfrom pocsuite.lib.core.data import pathsfrom random import choicedef 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)])

修改完成后继续运行测试程序,运行成功。成果获取到了漏洞扫描结果的数据,如下

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

代码分析

函数分析

    def verify_poc(self, target):                poc验证函数        :param target:        :return:    def start_scan(self):                使用多线程进行漏洞扫描        :return:            def periodic_tasks(self):                从数剧库中获取任务信息,跟据配置信息周期性扫描目标        :return:        def scanner_loop_execute(inc):        主程序循环执行模块    :param inc:     :return:

数据库模块

数据库结构


  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 任务状态

  15. end_date 结束时间

  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 扫描结果

  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 资产库集合

  38. asset_date 创建日期

  39. scan_option 资产发现

  40. asset_text 资产

  41. asset_name 资产库名称

  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 资产库ID

  58. port 端口

  59. port_server 服务

  60. banner 指纹(cpe)

  61. scan_date 扫描日期

  62. asset_name 所属资产库

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

  64. # DOMAIN_DB 服务集合

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

  66. domain_text 主域名

  67. scan_option 三级域名扫描

  68. dept_name 域名所属部门

  69. domain_date 创建日期

  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 登录数据包

  88. status 检测状态

  89. week_passwd_count 弱口令数量

  90. error_data 失败标记

  91. success_data 成功标记

  92. username 账号

  93. password 密码

  94. week_passwd_result 存在弱口令的结果

  95. _id ObjectId

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

  97. `

数据库详情

  • test_asset :该表collection用于存储资产信息,通过该表中的信息可以在后面调用漏洞扫描模块和nmap模块对资产进行扫描

  • test_config:该表用于存放域名字典,需要扫描的端口,开启的进程数量等数据

  • test_domain:该表用于存放域名信息,通过该表中的数据对表中的域名进行子域名爆破

  • test_plugin_info:该表用于存放扫描插件信息,包括插件名称,功能,以及插件存放的路径

  • test_server:该表中存储的是资产信息,包括开放的端口信息以及服务

  • test_subdomain:该表用于存放子域名爆破结果

  • test_tasks:该表用于存储漏洞扫描任务信息

该系统使用的所有模块之间都是通过数据库进行数据交互的,每个模块都是相对独立的运行,单独拿出来做测试也是没有问题的,在进行代码分析时也很友好,一个槽点就是漏洞扫描模块使用的pocsuite开源框架有一些问题,每一次版本的迭代都有新的功能被添加,旧的功能被删除,导致了官方的pocsuite poc验证插件容易出问题,老版本的poc插件无法在新的框架下运行!!

上述就是小编为大家分享的如何进行InsectsAwke自动化工具源码分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

数据 数据库 域名 模块 漏洞 插件 资产 子域 任务 文件 漏洞扫描 端口 配置 运行 信息 名称 结果 爆破 服务 函数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器安全防护怎么看 高新区数据网络技术收费 计算机网络安全设计方案结论 宾馆里的无线网络安全吗 网络安全工作自查表 数据库查询慢收缩 动物大战僵尸2服务器 linu数据库连接命令 华为服务器管理口如何配置 树结构数据怎样存数据库 有哪些mysql数据库数据备份 软件开发的计量单位是什么 网络安全机制包括哪8种 网络安全接入指数 贵州点石互联网科技有限公司 网络安全黑客英文宣传片一分钟 网络技术部门工作岗位描述 lfs缓存服务器 大学机房数据库版本 我国网络安全法单位最高罚金 州边锋网络技术有 计算机网络技术和应用技术有什么区别 计算机网络技术英语术语 php高并发数据库筛选文件缓存 大一网络安全知识点 信息网络安全科技馆拍照 神经网络技术路线图模板 以网络安全为主的歌曲 数据库默认值为A001 我国网络安全法单位最高罚金
0