如何进行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:
数据库模块
数据库结构
# PLUGIN_DB 插件集合
------------------------------------
plugin_appversion 影响版本
plugin_vultype 漏洞名称
plugin_vuldate 漏洞日期
plugin_filename 文件路径
plugin_name 插件名
plugin_appname 应用名称
plugin_author 插件作者
_id ObjectId
------------------------------------
# TASKS_DB 任务集合
------------------------------------
task_status 任务状态
end_date 结束时间
scan_target_list 扫描对象(列表)
task_name 任务名称
plugin_id 插件id
_id ObjectId
start_date 任务开始时间
task_plan 扫描计划
------------------------------------
# VULNERABILITY_DB 漏洞集合
------------------------------------
scan_result 扫描结果
target 扫描对象
task_id 任务ID
appname 应用名称
scan_date 扫描日期
poc_name 插件名称
vulversion 漏洞影响版本
poc_vultype 漏洞类型
task_name 任务名称
plugin_id 插件ID
_id ObjectId
------------------------------------
# ASSET_DB 资产库集合
asset_date 创建日期
scan_option 资产发现
asset_text 资产
asset_name 资产库名称
dept_name 部门名称
admin_name 管理员
_id ObjectId
------------------------------------
# CONFIG_DB 配置集合
------------------------------------
port_thread 端口扫描线程
scanner_thread 漏洞检测线程
port_list 端口扫描列表
config_name 配置文件名称
subdomain 子域名字典
------------------------------------
# SERVER_DB 服务集合
------------------------------------
host 主机
asset_id 资产库ID
port 端口
port_server 服务
banner 指纹(cpe)
scan_date 扫描日期
asset_name 所属资产库
------------------------------------
# DOMAIN_DB 服务集合
------------------------------------
domain_text 主域名
scan_option 三级域名扫描
dept_name 域名所属部门
domain_date 创建日期
domain_name 域名名称
_id ObjectId
------------------------------------
# SUBDOMAIN_DB 服务集合
------------------------------------
date 扫描日期
domain 主域名
_id ObjectId
result 子域名
domain_id 主域名ID
domain_name 域名名称
------------------------------------
# WEEKPASSWD_DB 服务集合
------------------------------------
date 扫描日期
target 检测对象
task_name 任务名称
post_data 登录数据包
status 检测状态
week_passwd_count 弱口令数量
error_data 失败标记
success_data 成功标记
username 账号
password 密码
week_passwd_result 存在弱口令的结果
_id ObjectId
------------------------------------
`
数据库详情
test_asset :该表collection用于存储资产信息,通过该表中的信息可以在后面调用漏洞扫描模块和nmap模块对资产进行扫描
test_config:该表用于存放域名字典,需要扫描的端口,开启的进程数量等数据
test_domain:该表用于存放域名信息,通过该表中的数据对表中的域名进行子域名爆破
test_plugin_info:该表用于存放扫描插件信息,包括插件名称,功能,以及插件存放的路径
test_server:该表中存储的是资产信息,包括开放的端口信息以及服务
test_subdomain:该表用于存放子域名爆破结果
test_tasks:该表用于存储漏洞扫描任务信息
该系统使用的所有模块之间都是通过数据库进行数据交互的,每个模块都是相对独立的运行,单独拿出来做测试也是没有问题的,在进行代码分析时也很友好,一个槽点就是漏洞扫描模块使用的pocsuite开源框架有一些问题,每一次版本的迭代都有新的功能被添加,旧的功能被删除,导致了官方的pocsuite poc验证插件容易出问题,老版本的poc插件无法在新的框架下运行!!
上述就是小编为大家分享的如何进行InsectsAwke自动化工具源码分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。