InsectsAwke|自动化工具源码分析(二)
字数 1586 2025-08-18 11:37:19
InsectsAwake 漏洞扫描系统详细教学文档
一、系统概述
InsectsAwake 是一个基于 Python 开发的著名开源漏洞扫描系统,启蒙于 Bugscan,脱胎于 Pocsuite。系统采用 FLASK+MongoDB 架构提供 WEB 服务,具备 PoC 的健壮性。
主要功能
- 漏洞扫描:调用创宇的 Pocsuite 进行扫描,使用 Seebug 的免费 PoC
- 资产管理:创建漏洞扫描任务,支持单个 IP 或 URL
- 端口发现:定时调用 nmap 进行端口扫描
- 域名发现:子域名爆破功能(目前功能尚不完善)
二、系统安装
环境准备
- 操作系统:Ubuntu 16.04
- 更新国内源(推荐清华源)
安装步骤
-
获取项目源码
git clone https://github.com/jeffzh3ng/InsectsAwake.git -
安装 Python 及 pip
sudo apt update sudo apt install python python-pip -
安装 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 企业版,普通版无法支持系统运行
-
安装 Python 依赖包
cd InsectsAwake sudo pip install pip -U sudo pip install -r requirements.txt -
安装 nmap
sudo apt install nmap
数据库配置
-
启动数据库服务
sudo mkdir -p /data/db sudo service mongod start mongo --host 127.0.0.1:27017 -
创建数据库用户
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()
五、数据库结构详解
主要集合说明
-
test_plugin_info - 插件信息
plugin_appversion: 影响版本 plugin_vultype: 漏洞名称 plugin_vuldate: 漏洞日期 plugin_filename: 文件路径 plugin_name: 插件名 plugin_appname: 应用名称 plugin_author: 插件作者 _id: ObjectId -
test_tasks - 扫描任务
task_status: 任务状态 end_date: 结束时间 scan_target_list: 扫描对象(列表) task_name: 任务名称 plugin_id: 插件id _id: ObjectId start_date: 任务开始时间 task_plan: 扫描计划 -
test_vuldb - 漏洞结果
scan_result: 扫描结果 target: 扫描对象 task_id: 任务ID appname: 应用名称 scan_date: 扫描日期 poc_name: 插件名称 vulversion: 漏洞影响版本 poc_vultype: 漏洞类型 task_name: 任务名称 plugin_id: 插件ID _id: ObjectId -
test_asset - 资产库
asset_date: 创建日期 scan_option: 资产发现开关 asset_text: 资产列表 asset_name: 资产库名称 dept_name: 部门名称 admin_name: 管理员 _id: ObjectId -
test_server - 服务信息
host: 主机 asset_id: 资产库ID port: 端口 port_server: 服务 banner: 指纹(cpe) scan_date: 扫描日期 asset_name: 所属资产库 -
test_subdomain - 子域名结果
date: 扫描日期 domain: 主域名 _id: ObjectId result: 子域名 domain_id: 主域名ID domain_name: 域名名称 -
test_config - 系统配置
port_thread: 端口扫描线程数 scanner_thread: 漏洞检测线程数 port_list: 端口扫描列表 config_name: 配置文件名称 subdomain: 子域名字典
六、常见问题解决
-
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 版本兼容性问题需要特别关注
通过本教学文档,您应该能够完成系统的安装部署,并理解其核心工作原理,为进一步定制开发打下基础。