InsectsAwke|自动化工具源码分析(二)
字数 1586 2025-08-18 11:37:19

InsectsAwake 漏洞扫描系统详细教学文档

一、系统概述

InsectsAwake 是一个基于 Python 开发的著名开源漏洞扫描系统,启蒙于 Bugscan,脱胎于 Pocsuite。系统采用 FLASK+MongoDB 架构提供 WEB 服务,具备 PoC 的健壮性。

主要功能

  1. 漏洞扫描:调用创宇的 Pocsuite 进行扫描,使用 Seebug 的免费 PoC
  2. 资产管理:创建漏洞扫描任务,支持单个 IP 或 URL
  3. 端口发现:定时调用 nmap 进行端口扫描
  4. 域名发现:子域名爆破功能(目前功能尚不完善)

二、系统安装

环境准备

  • 操作系统:Ubuntu 16.04
  • 更新国内源(推荐清华源)

安装步骤

  1. 获取项目源码

    git clone https://github.com/jeffzh3ng/InsectsAwake.git
    
  2. 安装 Python 及 pip

    sudo apt update
    sudo apt install python python-pip
    
  3. 安装 MongoDB 企业版

    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
    

    注意:必须安装 MongoDB 企业版,普通版无法支持系统运行

  4. 安装 Python 依赖包

    cd InsectsAwake
    sudo pip install pip -U
    sudo pip install -r requirements.txt
    
  5. 安装 nmap

    sudo apt install nmap
    

数据库配置

  1. 启动数据库服务

    sudo mkdir -p /data/db
    sudo service mongod start
    mongo --host 127.0.0.1:27017
    
  2. 创建数据库用户

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

系统配置

修改配置文件 InsectsAwake-Project/instance/config.py

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'

初始化数据库

cd /InsectsAwake/migration
python start.py

运行系统

sudo ./run.sh restart

注意:系统默认运行在 127.0.0.1:5000,如需外网访问,建议配置 Nginx 或 Caddy 反向代理

三、系统架构分析

项目结构

InsectsAwake/
├── app.py                  # Flask 主程序
├── __init__.py
├── static/                 # 网页静态文件
├── templates/              # 网页HTML模板
├── views/
│   ├── asset_management.py  # 资产管理处理
│   ├── authenticate.py      # 网页认证
│   ├── dashboard.py         # 仪表盘
│   ├── index.py             # 主页
│   ├── lib/
│   │   ├── __init__.py
│   │   └── mongo_db.py      # MongoDB 数据库管理
│   ├── modules/
│   │   ├── discovery/       # 资产发现模块
│   │   │   ├── __init__.py
│   │   │   └── port_scanner.py  # 端口扫描
│   │   ├── scanner/         # 漏洞扫描模块
│   │   │   ├── __init__.py
│   │   │   ├── pocsuite_plugin/  # PoC插件存放
│   │   │   ├── pocsuite_scanner.py  # Pocsuite调用
│   │   │   └── vulnerability_plugin.py  # PoC插件管理
│   │   ├── subdomain/       # 子域名爆破
│   │   │   ├── __init__.py
│   │   │   └── subdomain.py
│   │   └── week_passwd/     # 弱口令检测
│   │       ├── __init__.py
│   │       └── week_http_passwd_test.py
│   ├── plugin_management.py  # PoC插件管理
│   ├── settings.py          # 平台参数设置
│   ├── subdomain_brute.py   # 子域名爆破
│   ├── task_management.py   # 任务管理
│   ├── vulnerability_management.py  # 漏洞管理
│   └── weak_passwd_test.py  # 弱口令管理
├── instance/
│   ├── config.py            # 配置文件
│   └── __init__.py
├── LICENSE
├── logs/
│   ├── db.log
│   └── log.log
├── migration/
│   ├── DataModels
│   └── start.py             # 数据库初始化
├── requirements.txt
├── run.sh                   # 启动脚本
└── tests/
    └── domain.dict          # 子域名字典

主程序流程

系统启动时会开启四个线程分别执行不同模块:

def scanner():
    """漏洞扫描模块"""
    config_db = db_name_conf()['config_db']
    scanner_time = int(connectiondb(config_db).find_one()['scanner_time'])
    print('Scanner is start...')
    scanner_loop_execute(scanner_time)

def manage():
    """Flask WEB服务"""
    app.run(host=flask_app.config.get('WEB_HOST'), 
           port=flask_app.config.get('WEB_PORT'))

def discovery():
    """资产发现模块"""
    print('Discovery is start...')
    scheduler = BlockingScheduler()
    try:
        # 每天14:47执行端口扫描
        scheduler.add_job(MultiProcess().start_port_scan, 'cron', 
                         day='1-31', hour=14, minute=47)
        scheduler.start()
    except Exception as e:
        print(e)

def subdomain():
    """子域名爆破模块"""
    scanner_time = 30
    print('Subdomain is start...')
    subdomain_loop_execute(scanner_time)

if __name__ == "__main__":
    # 开启四个线程执行不同模块
    t1 = threading.Thread(target=scanner, args=())
    t2 = threading.Thread(target=manage, args=())
    t3 = threading.Thread(target=subdomain, args=())
    t4 = threading.Thread(target=discovery, args=())
    t1.start()
    t2.start()
    t3.start()
    t4.start()
    t1.join()
    t2.join()
    t3.join()
    t4.join()

四、核心模块详解

1. 子域名爆破模块

工作流程

  • Flask 负责将前端接受的子域名破解信息存储到数据库
  • 核心子域名破解程序定时检查数据库配置
  • 满足条件时执行暴力破解,结果存入数据库

关键代码分析

class DomainsBrute:
    def __init__(self, target_domain, subdomain_dict, domain_id, domain_name):
        """初始化爆破参数"""
        
    def resolver_check(self):
        """检查域名解析"""
        
    def handle_domain(self):
        """生成二级/三级域名列表"""
        
    def handle_result(self):
        """处理扫描结果并存入数据库"""
        
    def save_db(self, result):
        """将结果存入test_subdomain集合"""
        
    def run_multi(self):
        """多进程解析域名"""
        self.handle_domain()  # 生成子域名字典
        scanner_pool = multiprocessing.Pool(processes=100)  # 100个进程池
        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):
    """解析单个域名"""
    
def start_brute(inc_time):
    """定时任务入口"""
    schedule.enter(inc_time, 1, start_brute, (inc_time,))
    # 从数据库获取配置
    subdomain_list = connectiondb(config_db).find_one()['subdomain']
    for domain_text in connectiondb(domain_db).find():
        if domain_text['scan_status'] == "Preparation":
            domain_list = domain_text['domain_text']
            domain_id = domain_text['_id']
            domain_name = domain_text['domain_name']
            # 更新状态为Running
            connectiondb(domain_db).update_one(
                {'_id': ObjectId(domain_id)},
                {'$set': {'scan_status': 'Running'}})
            
            # 执行爆破
            for target in domain_list:
                start = DomainsBrute(target, subdomain_list, domain_id, domain_name)
                start.run_multi()
            
            # 三级域名扫描
            if domain_text['scan_option'] == "Enable":
                for result in connectiondb(subdomain_db).find(
                    {'domain_id': ObjectId(domain_id)}):
                    next_subdomain = eval(result['result']).keys()[0]
                    start = DomainsBrute(next_subdomain, subdomain_list, 
                                       domain_id, domain_name)
                    start.run_multi()
            
            # 更新状态为Done
            connectiondb(domain_db).update_one(
                {'_id': ObjectId(domain_id)},
                {'$set': {'scan_status': 'Done'}})

def subdomain_loop_execute(inc):
    """循环执行入口"""
    schedule.enter(inc, 0, start_brute, (inc,))
    schedule.run()

2. 端口扫描模块

工作流程

  • 使用 APScheduler 定时任务框架
  • 每天14:47自动执行端口扫描
  • 使用 nmap 进行扫描

关键代码分析

def nmap_scanner(target_host):
    """使用nmap扫描目标端口"""
    
class MultiProcess:
    def __init__(self):
        self.target_list = []
        self.server_db = db_name_conf()['server_db']
        self.asset_db = db_name_conf()['asset_db']
        self.processes_count = int(connectiondb(config_db).find_one()['port_thread'])
        self.asset_id = ''
        self.asset_name = ''
    
    def scan_pool(self):
        """多进程端口扫描"""
        
    def start_port_scan(self):
        """从数据库获取目标并执行扫描"""
        for asset_text in connectiondb(self.asset_db).find():
            if asset_text['scan_option'] == "Enable":
                self.asset_id = asset_text['_id']
                self.asset_name = asset_text['asset_name']
                self.target_list = asset_text['asset_text']
                self.scan_pool()

3. 漏洞扫描模块

注意事项

  • 使用 Pocsuite 2.0.4 版本
  • 新版 Pocsuite 可能导致兼容性问题
  • 需要手动修复 password.py 文件

修复方法

修改 pocsuite/lib/utils/password.py

def genPassword(length=8, chars=string.letters + string.digits):
    return "".join([choice(chars) for _ in range(length)])

关键代码分析

def verify_poc(self, target):
    """PoC验证函数"""
    
def start_scan(self):
    """多线程漏洞扫描"""
    
def periodic_tasks(self):
    """周期性扫描任务"""
    while True:
        for task_text in connectiondb(tasks_db).find():
            if task_text['task_status'] == "Preparation":
                # 更新状态为Running
                connectiondb(tasks_db).update_one(
                    {'_id': ObjectId(task_text['_id'])},
                    {'$set': {'task_status': 'Running'}})
                
                # 执行扫描
                self.start_scan()
                
                # 更新状态为Done
                connectiondb(tasks_db).update_one(
                    {'_id': ObjectId(task_text['_id'])},
                    {'$set': {'task_status': 'Done'}})
        time.sleep(60)

def scanner_loop_execute(inc):
    """主循环"""
    schedule.enter(inc, 0, start_brute, (inc,))
    schedule.run()

五、数据库结构详解

主要集合说明

  1. test_plugin_info - 插件信息

    plugin_appversion: 影响版本
    plugin_vultype: 漏洞名称
    plugin_vuldate: 漏洞日期
    plugin_filename: 文件路径
    plugin_name: 插件名
    plugin_appname: 应用名称
    plugin_author: 插件作者
    _id: ObjectId
    
  2. test_tasks - 扫描任务

    task_status: 任务状态
    end_date: 结束时间
    scan_target_list: 扫描对象(列表)
    task_name: 任务名称
    plugin_id: 插件id
    _id: ObjectId
    start_date: 任务开始时间
    task_plan: 扫描计划
    
  3. test_vuldb - 漏洞结果

    scan_result: 扫描结果
    target: 扫描对象
    task_id: 任务ID
    appname: 应用名称
    scan_date: 扫描日期
    poc_name: 插件名称
    vulversion: 漏洞影响版本
    poc_vultype: 漏洞类型
    task_name: 任务名称
    plugin_id: 插件ID
    _id: ObjectId
    
  4. test_asset - 资产库

    asset_date: 创建日期
    scan_option: 资产发现开关
    asset_text: 资产列表
    asset_name: 资产库名称
    dept_name: 部门名称
    admin_name: 管理员
    _id: ObjectId
    
  5. test_server - 服务信息

    host: 主机
    asset_id: 资产库ID
    port: 端口
    port_server: 服务
    banner: 指纹(cpe)
    scan_date: 扫描日期
    asset_name: 所属资产库
    
  6. test_subdomain - 子域名结果

    date: 扫描日期
    domain: 主域名
    _id: ObjectId
    result: 子域名
    domain_id: 主域名ID
    domain_name: 域名名称
    
  7. test_config - 系统配置

    port_thread: 端口扫描线程数
    scanner_thread: 漏洞检测线程数
    port_list: 端口扫描列表
    config_name: 配置文件名称
    subdomain: 子域名字典
    

六、常见问题解决

  1. MongoDB 安装失败

    • 确保使用正确的安装源(3.6版本)
    • 按顺序执行安装命令
    • 如失败建议重装系统后再次尝试
  2. nohup 报错

    • 参考解决方案:https://blog.csdn.net/educast/article/details/28273301
  3. Pocsuite 兼容性问题

    • 使用 2.0.4 版本
    • 手动修改 password.py 文件
    • 检查其他依赖版本
  4. WEB 服务无法访问

    • 默认只监听 127.0.0.1
    • 修改 config.py 中的 WEB_HOST
    • 或配置 Nginx/Caddy 反向代理

七、总结

InsectsAwake 是一个功能完善的漏洞扫描系统,具有以下特点:

  1. 模块化设计:各功能模块独立运行,通过数据库交互
  2. 定时任务:使用 APScheduler 实现周期性扫描
  3. 多进程/线程:提高扫描效率
  4. 可扩展性:可单独提取模块进行二次开发

系统适合中小型企业使用,但需要注意:

  • 仅支持单个 IP/URL 扫描,不支持网段
  • 子域名爆破功能尚不完善
  • Pocsuite 版本兼容性问题需要特别关注

通过本教学文档,您应该能够完成系统的安装部署,并理解其核心工作原理,为进一步定制开发打下基础。

InsectsAwake 漏洞扫描系统详细教学文档 一、系统概述 InsectsAwake 是一个基于 Python 开发的著名开源漏洞扫描系统,启蒙于 Bugscan,脱胎于 Pocsuite。系统采用 FLASK+MongoDB 架构提供 WEB 服务,具备 PoC 的健壮性。 主要功能 漏洞扫描 :调用创宇的 Pocsuite 进行扫描,使用 Seebug 的免费 PoC 资产管理 :创建漏洞扫描任务,支持单个 IP 或 URL 端口发现 :定时调用 nmap 进行端口扫描 域名发现 :子域名爆破功能(目前功能尚不完善) 二、系统安装 环境准备 操作系统:Ubuntu 16.04 更新国内源(推荐清华源) 安装步骤 获取项目源码 安装 Python 及 pip 安装 MongoDB 企业版 注意:必须安装 MongoDB 企业版,普通版无法支持系统运行 安装 Python 依赖包 安装 nmap 数据库配置 启动数据库服务 创建数据库用户 系统配置 修改配置文件 InsectsAwake-Project/instance/config.py : 初始化数据库 运行系统 注意:系统默认运行在 127.0.0.1:5000,如需外网访问,建议配置 Nginx 或 Caddy 反向代理 三、系统架构分析 项目结构 主程序流程 系统启动时会开启四个线程分别执行不同模块: 四、核心模块详解 1. 子域名爆破模块 工作流程 Flask 负责将前端接受的子域名破解信息存储到数据库 核心子域名破解程序定时检查数据库配置 满足条件时执行暴力破解,结果存入数据库 关键代码分析 2. 端口扫描模块 工作流程 使用 APScheduler 定时任务框架 每天14:47自动执行端口扫描 使用 nmap 进行扫描 关键代码分析 3. 漏洞扫描模块 注意事项 使用 Pocsuite 2.0.4 版本 新版 Pocsuite 可能导致兼容性问题 需要手动修复 password.py 文件 修复方法 修改 pocsuite/lib/utils/password.py : 关键代码分析 五、数据库结构详解 主要集合说明 test_ plugin_ info - 插件信息 test_ tasks - 扫描任务 test_ vuldb - 漏洞结果 test_ asset - 资产库 test_ server - 服务信息 test_ subdomain - 子域名结果 test_ config - 系统配置 六、常见问题解决 MongoDB 安装失败 确保使用正确的安装源(3.6版本) 按顺序执行安装命令 如失败建议重装系统后再次尝试 nohup 报错 参考解决方案:https://blog.csdn.net/educast/article/details/28273301 Pocsuite 兼容性问题 使用 2.0.4 版本 手动修改 password.py 文件 检查其他依赖版本 WEB 服务无法访问 默认只监听 127.0.0.1 修改 config.py 中的 WEB_ HOST 或配置 Nginx/Caddy 反向代理 七、总结 InsectsAwake 是一个功能完善的漏洞扫描系统,具有以下特点: 模块化设计 :各功能模块独立运行,通过数据库交互 定时任务 :使用 APScheduler 实现周期性扫描 多进程/线程 :提高扫描效率 可扩展性 :可单独提取模块进行二次开发 系统适合中小型企业使用,但需要注意: 仅支持单个 IP/URL 扫描,不支持网段 子域名爆破功能尚不完善 Pocsuite 版本兼容性问题需要特别关注 通过本教学文档,您应该能够完成系统的安装部署,并理解其核心工作原理,为进一步定制开发打下基础。