1 研究背景

近几年来,随着国家对网络安全的重视,网络安全行业逐渐走向规范化,网络安全也吸引了更多人注意。随着安全行业人员水平的逐渐升高,与过去参差不齐的现象已经有很大的不同了。而渗透测试工具得益于互联网的蓬勃发展和安全行业人员技术水平的提高也如雨后春笋。

网络安全监测平台类似的工具GitHub有不少,但是这些工具的功能上各具特色,但是架构上往往比较中规中矩,可扩展性不高。所以本课题试图以前后端分离的方式,以RESTful api接口规范设计一个综合性工具,即网络安全监测平台。

2 系统分析设计与实现

2.1 功能需求

作为网络安全监测平台,主要拥有以下功能:
1)资产管理:所谓资产管理,这里指域名资产,作为标识一个网站和其所属主体来说,域名是一种很重要的资产。资产收集是信息收集过程中的重要步骤。
2)资产监控:随着企业和机构对网络安全的重视,从效率上来讲,单纯对已经上线很久的网站进行测试效率是比较低的,因为这个网站可能已经被很多人所测试过。而当网站发生更新,新上线网站来说是更容易发现漏洞的。
3)字典管理:随着各式各样的网站泄露的密码数据,字典数据越来越多,而对于不同的服务拥有不同的字典,所以字典管理对于渗透测试过程也是十分重要的。同时,在字典的不断使用中,对于经常出现的密码可以对其进行加权,提升其在字典集中的位置以优化密码爆破。
4)社工密码:随着网站安全意识的提升,越来越多的系统要求用户输入更加复杂的密码,例如包含符号,大小写数字,字母等,对于这种系统,使用常见的字典集就有些力有未逮了,所以通过社会工程学的角度动态生成伪弱口令字典是比较有效的。
5)POC管理,作为一个网络监测平台,不仅需要对资产进行一般性检查,还需要及时添加新的POC,以便及时的检测资产漏洞。
6)POC检测:POC检测功能主要为批量检测。6)口令爆破:对于常见服务,可以设置批量检测弱口令的功能。

2.2技术架构

2.2.1 Vue.js

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

2.2.2 ElementUI

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。其设计原则为:
1)一致性
与现实生活一致:与现实生活的流程、逻辑保持一致,遵循用户习惯的语言和概念;
在界面中一致:所有的元素和结构需保持一致,比如:设计样式、图标和文本、元素的位置等。
2)反馈
控制反馈:通过界面样式和交互动效让用户可以清晰的感知自己的操作;
页面反馈:操作后,通过页面元素的变化清晰地展现当前状态。
3)效率
简化流程:设计简洁直观的操作流程;
清晰明确:语言表达清晰且表意明确,让用户快速理解进而作出决策;
帮助用户识别:界面简单直白,让用户快速识别而非回忆,减少用户记忆负担。
4)可控
用户决策:根据场景可给予用户操作建议或安全提示,但不能代替用户进行决策;
结果可控:用户可以自由的进行操作,包括撤销、回退和终止当前操作等。

2.2.3 Flask

Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。

2.3 系统设计

系统使用Vue+ElementUI+Flask+Mysql架构,使用前后端分离模式,采用RESTful api进行接口开发。整个系统界面主要分为两个,一个前台登录界面,一个后台界面。

2.3.1 前端设计

登录界面:
Pro: 信息安全实践与综合训练 - 图1
后台界面:
Pro: 信息安全实践与综合训练 - 图2

2.3.2 数据库设计

用户表:

表名 user
数据库用户 root
主键 id
外键
排序字段 id
索引字段 username
字段名称 数据类型 允许为空 唯一
id INT N Y
username VARCHAR(32) N N
password_hash VARCHAR(128) N N


字典表:

表名 dic
数据库用户 root
主键 id
外键
排序字段 id
索引字段 name
字段名称 数据类型 允许为空 唯一
id INT N Y
name VARCHAR(32) N N
info VARCHAR(128) N N


字典信息表:

表名 dic_data
数据库用户 root
主键 id
外键 dic_id
排序字段 id
索引字段 dic
字段名称 数据类型 允许为空 唯一
id INT N Y
dic VARCHAR(32) N N
value INT N N
dic_id INT N N


资产信息表:

表名 domain
数据库用户 root
主键 id
外键
排序字段 id
索引字段 name
字段名称 数据类型 允许为空 唯一
id INT N Y
name VARCHAR(32) N N
info VARCHAR(128) N N


域名数据表:

表名 domain_data
数据库用户 root
主键 domain
外键 domain_Id
排序字段 domain
索引字段 domain
字段名称 数据类型 允许为空 唯一
domain VARCHAR(64) N Y
domain_id INT N N


POC信息表:

表名 poc
数据库用户 root
主键 poc_Id
外键
排序字段 poc_id
索引字段 poc_name
字段名称 数据类型 允许为空 唯一
poc_id INT N Y
poc_name VARCHAR(32) N N
poc_info VARCHAR(128) Y N
component VARCHAR(32) Y N
version VARCHAR(32) Y N
time DATETIME Y N


资产监控任务表:

表名 monitor
数据库用户 root
主键 m_id
外键
排序字段 m_id
索引字段 m_name
字段名称 数据类型 允许为空 唯一
m_id INT N Y
m_name VARCHAR(32) N N
m_info VARCHAR(64) N N
m_target INT N Y
m_cycle INT N N
m_port INT N N
m_status VARCHAR(20) N N
m_time DATETIME N N


资产状态表:

表名 assets_status
数据库用户 root
主键 m_id,s_domain
外键 m_id
排序字段 m_id
索引字段 m_domain
字段名称 数据类型 允许为空 唯一
m_id INT N Y
s_domain VARCHAR(64) N N
s_ip VARCHAR(64) Y N
s_status INT Y N
s_title VARCHAR(32) Y N
s_change INT Y N
s_sensitive VARCHAR(64) Y N
s_cdn VARCHAR(32) Y N
s_port VARCHAR(256) Y N
s_time DATETIME N N
s_patch VARCHAR(256) Y N


敏感词表:

表名 sensitive
数据库用户 root
主键 word
外键
排序字段 word
索引字段 word
字段名称 数据类型 允许为空 唯一
word VARCHAR(32) N Y


全局配置表:

表名 config
数据库用户 root
主键 id
外键
排序字段 config
索引字段 config
字段名称 数据类型 允许为空 唯一
config VARCHAR(32) N Y
value VARCHAR(64) N N

2.3.3 API设计

接口地址 http://127.0.0.1:5000/user/register
返回格式 json
请求方法 POST
接口备注 注册用户
请求参数 username,password
接口地址 http://127.0.0.1:5000/user/login
返回格式 json
请求方法 POST
接口备注 登录
请求参数 username,password
接口地址 http://127.0.0.1:5000/user/update
返回格式 json
请求方法 POST
接口备注 修改密码
请求参数 oldpass,newpass
接口地址 http://127.0.0.1:5000/dic/dic
返回格式 json
请求方法 GET
接口备注 获取字典信息
请求参数 None
接口地址 http://127.0.0.1:5000/dic/delete_dic
返回格式 json
请求方法 POST
接口备注 删除字典
请求参数 id
接口地址 http://127.0.0.1:5000/dic/edit_dic
返回格式 json
请求方法 POST
接口备注 删除字典
请求参数 id,name,info
接口地址 http://127.0.0.1:5000/dic/download_dic
返回格式 json
请求方法 GET
接口备注 下载字典
请求参数 id
接口地址 http://127.0.0.1:5000/dic/upload_dic
返回格式 json
请求方法 POST
接口备注 导入字典
请求参数 file,name,info
接口地址 http://127.0.0.1:5000/dic/dic_data
返回格式 json
请求方法 POST
接口备注 字典详情
请求参数 id
接口地址 http://127.0.0.1:5000/delete_dic_data
返回格式 json
请求方法 POST
接口备注 删除字典
请求参数 id
接口地址 http://127.0.0.1:5000/dic/add_dic_value
返回格式 json
请求方法 POST
接口备注 字典加权
请求参数 id
接口地址 http://127.0.0.1:5000/dic/search_dic
返回格式 json
请求方法 POST
接口备注 搜索字典
请求参数 id,name
接口地址 http://127.0.0.1:5000/dic/insert_one_data
返回格式 json
请求方法 POST
接口备注 插入一条数据
请求参数 dic,id
接口地址 http://127.0.0.1:5000/dic/insert_many_data
返回格式 json
请求方法 POST
接口备注 导入数据
请求参数 dic,file
接口地址 http://127.0.0.1:5000/domain/get_domains_info
返回格式 json
请求方法 POST
接口备注 获取域名信息
请求参数 None
接口地址 http://127.0.0.1:5000/domain/delete_domain
返回格式 json
请求方法 POST
接口备注 删除域名信息
请求参数 id
接口地址 http://127.0.0.1:5000/domain/edit_domain
返回格式 json
请求方法 POST
接口备注 修改域名信息
请求参数 id,name,info
接口地址 http://127.0.0.1:5000/domain/download_domain
返回格式 json
请求方法 GET
接口备注 下载域名信息
请求参数 id
接口地址 http://127.0.0.1:5000/domain/upload_domain
返回格式 json
请求方法 POST
接口备注 导入域名
请求参数 file,name,info


接口地址 http://127.0.0.1:5000/domain/domain_data
返回格式 json
请求方法 POST
接口备注 资产详情
请求参数 id
接口地址 http://127.0.0.1:5000/domain/delete_domain_data
返回格式 json
请求方法 POST
接口备注 删除域名数据
请求参数 domain,domain_id
接口地址 http://127.0.0.1:5000/domain/search_domain
返回格式 json
请求方法 POST
接口备注 搜索域名
请求参数 id,domain
接口地址 http://127.0.0.1:5000/domain/insert_one_domain
返回格式 json
请求方法 POST
接口备注 插入一条数据
请求参数 domain,id
接口地址 http://127.0.0.1:5000/domain/insert_many_domain
返回格式 json
请求方法 POST
接口备注 批量导入数据
请求参数 id,file
接口地址 http://127.0.0.1:5000/domain/oneforall
返回格式 json
请求方法 POST
接口备注 调用oneforall进行资产发现
请求参数 domain,id
接口地址 http://127.0.0.1:5000/poc/get_poc
返回格式 json
请求方法 GET
接口备注 获取POC信息
请求参数 None
接口地址 http://127.0.0.1:5000/poc/delete_poc
返回格式 json
请求方法 POST
接口备注 删除poc
请求参数 poc_id
接口地址 http://127.0.0.1:5000/poc/edit_poc
返回格式 json
请求方法 POST
接口备注 删除poc
请求参数 poc_id,poc_name,poc_info,component,version
接口地址 http://127.0.0.1:5000/poc/download_poc
返回格式 json
请求方法 GET
接口备注 下载poc
请求参数 poc_id
接口地址 http://127.0.0.1:5000/poc/upload_poc
返回格式 json
请求方法 POST
接口备注 上传poc
请求参数 file,poc_name,poc_info,component,version
接口地址 http://127.0.0.1:5000/poc/search_poc
返回格式 json
请求方法 POST
接口备注 搜索poc
请求参数 poc_name
接口地址 http://127.0.0.1:5000/poc/show_poc
返回格式 json
请求方法 POST
接口备注 显示poc代码
请求参数 poc_id
接口地址 http://127.0.0.1:5000/monitor/get_monitor
返回格式 json
请求方法 GET
接口备注 获取监控信息
请求参数 None
接口地址 http://127.0.0.1:5000/monitor/edit_monitor
返回格式 json
请求方法 POST
接口备注 修改监控信息
请求参数 m_id,m_name,m_info,m_cycle,m_port
接口地址 http://127.0.0.1:5000/monitor/add_assets
返回格式 json
请求方法 POST
接口备注 新建监控对象
请求参数 name,info,target,cycle,port
接口地址 http://127.0.0.1:5000/monitor/delete_monitor
返回格式 json
请求方法 POST
接口备注 删除监控对象
请求参数 m_id
接口地址 http://127.0.0.1:5000/monitor/get_assets_status
返回格式 json
请求方法 POST
接口备注 获取资产状态
请求参数 m_id
接口地址 http://127.0.0.1:5000/monitor/search_assets
返回格式 json
请求方法 POST
接口备注 搜索资产
请求参数 s_domain,m_id
接口地址 http://127.0.0.1:5000/edit_patch
返回格式 json
请求方法 POST
接口备注 添加备注
请求参数 m_id,s_domain,s_patch
接口地址 http://127.0.0.1:5000/monitor/scan
返回格式 json
请求方法 POST
接口备注 进行扫描
请求参数 m_id

2.4 小组分工

2.4.1 xxx

工作内容: 前端、POC管理相关接口、资产管理与监控相关接口
前端主要有11个页面组成,其中一个页面为header,为顶部导航栏,一个页面为aside,为侧边导航栏。通过elementUI将两个component组合在一起。
前端与后端通信采用axios,使用Vue router控件进行路由跳转。

2.4.2 xxx

工作内容: oneforall接口、字典理相关接口
OneForAll是一款功能强大的子域名收集工具。在渗透测试的信息收集过程中,子域名收集非常重要,我自己平时也都是直接用在线收集工具来扫的,或使用谷歌或进行子域名爆破来收集,效率都不是很高。米斯特安全团队发布的开源项目OneForAll,作用是用来收集和爆破子域名的,接口和模块很多很全面,扫描效率也很高,结果令人满意。所以将oneforall组装进平台是个不错的选择。
1)修改了oneforall部分代码,以方便我们的的程序调用
原来的oneforall除了搜集子域名还会收集其它信息,这些信息对我们是不需要的,所以我们通过修改oneforall数据导出部分,只导出子域名这一个字段。
2)通过subprocess子进程调用oneforall
由于工作路径问题,oneforall代码无法直接使用,所以只能通过shell调用的方式运行oneforall。
3)字典管理部分相关接口编写,通过Flask-SQLALchemy ORM框架把关系数据库的表结构映射到对象上。通过josonfiy函数返回json格式的数据。同时,使用marshmallow-sqlalchemy中的SQLAlchemyAutoSchema实现生成数据与数据表的关系映射功能。然后是基本的增删查该,文件上传下载等功能。

2.4.3 xxx

工作内容: 社工密码相关接口、JWT登录校验、定时任务功能
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利。流程如下:
Ø 用户使用用户名密码来请求服务器
Ø 服务器进行验证用户的信息
Ø 服务器通过验证发送给用户一个token
Ø 客户端存储token,并在每次请求时附送上这个token值
Ø 服务端验证token值,并返回数据
这个token必须要在每次请求时传递给服务端,它应该保存在请求头里, 另外,服务端要支持CORS(跨来源资源共享)策略,一般我们在服务端这么做就可以了Access-Control-Allow-Origin: *
1)编写了user表及jwt校验代码以及用户相关操作接口
使用werkzeug.security下的generatepassword_hash, check_password_hash函数对用户密码进行加密和验证。同时使用generate_auth_token产生token,token过期时间默认为10分钟。
2)编写登录校验装饰器
如果对每个函数里进行登录校验,会增添很多重复代码,所以使用flask装饰器来对token进行校验,将校验函数封装为装饰器,其它函数使用只需要@login_required即可。
3)设置定时任务,以完成对资产的监控
Apscheduler可以帮助完成这个功能。Apscheduler全称Advanced Python Scheduler,作用为在指定的时间规则执行指定的作业。指定时间规则的方式可以是间隔多久执行,可以是指定日期时间的执行,也可以类似Linux系统中Crontab中的方式执行任务。指定的任务就是一个Python函数。
我们设置一个cron类型的定时任务,每天去执行扫描调度函数,对不同周期的资产进行扫描。在函数里通过比对上一次扫描日期以判断此次是否进行扫描。
4)社工密码生成,生成针对性弱口令
根据输入的个人信息,将每条信息进行截取,然后与其他部分的信息进行排列组合。可以将上述密码构成分为3项:信息项、符号项、弱字符串项。其中,信息项为:和目标有关的信息,如:Admin、Huawei等; 符号项为:密码组合中会用到的符号,如:空格、@、
、!、#、$等; 弱字符项为:密码组合中常用到的“弱口令”字符串,如:123、001、abc、2012等。

3 系统测试

3.1 用户功能

登录:
Pro: 信息安全实践与综合训练 - 图3
失败则弹出:
Pro: 信息安全实践与综合训练 - 图4
成功跳转到后台
Pro: 信息安全实践与综合训练 - 图5
注销:
Pro: 信息安全实践与综合训练 - 图6
点击退出后清除token并跳转到登录页
修改密码:
Pro: 信息安全实践与综合训练 - 图7
密码修改成功,跳转到登录页面
Pro: 信息安全实践与综合训练 - 图8

3.2 字典管理

主界面:
Pro: 信息安全实践与综合训练 - 图9
创建字典:
Pro: 信息安全实践与综合训练 - 图10
编辑字典信息:
Pro: 信息安全实践与综合训练 - 图11
删除字典:
Pro: 信息安全实践与综合训练 - 图12
下载字典:
Pro: 信息安全实践与综合训练 - 图13
查看字典:
Pro: 信息安全实践与综合训练 - 图14
添加字典数据:
Pro: 信息安全实践与综合训练 - 图15
字典加权:
Pro: 信息安全实践与综合训练 - 图16
删除字典数据:
Pro: 信息安全实践与综合训练 - 图17
批量导入字典数据:
Pro: 信息安全实践与综合训练 - 图18
社工字典:
Pro: 信息安全实践与综合训练 - 图19

3.3 资产管理

主界面:
Pro: 信息安全实践与综合训练 - 图20
添加资产:
Pro: 信息安全实践与综合训练 - 图21
编辑资产:
Pro: 信息安全实践与综合训练 - 图22
资产详情页面:
Pro: 信息安全实践与综合训练 - 图23
资产发现:
Pro: 信息安全实践与综合训练 - 图24
资产监控:
Pro: 信息安全实践与综合训练 - 图25
添加监控目标:
Pro: 信息安全实践与综合训练 - 图26
编辑监控信息:
Pro: 信息安全实践与综合训练 - 图27
删除监控:
Pro: 信息安全实践与综合训练 - 图28
监控详情页面:
Pro: 信息安全实践与综合训练 - 图29

3.4 POC管理

主界面:
Pro: 信息安全实践与综合训练 - 图30
添加POC:
Pro: 信息安全实践与综合训练 - 图31
编辑POC信息:
Pro: 信息安全实践与综合训练 - 图32
删除poc:
Pro: 信息安全实践与综合训练 - 图33
查看POC:
Pro: 信息安全实践与综合训练 - 图34

4 结论与展望

本课题完成了一部分,消息通知、POC检测、控制面板、server酱微信通知等功能留待以后完成。

5 参考文献

[1]https://github.com/knownsec/pocsuite3
[2]https://github.com/TideSec/Mars
[3]https://github.com/zgjx6/SocialEngineeringDictionaryGenerator
[4] https://github.com/Echocipher/AUTO-EARN
[5] https://dormousehole.readthedocs.io/en/latest/
[6] https://element.eleme.cn/#/zh-CN
[7] https://cn.vuejs.org/
[8] https://github.com/miguelgrinberg/REST-auth

代码

frontend.rarbackend.rar