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 前端设计
登录界面:
后台界面:
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设计
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 用户功能
登录:
失败则弹出:
成功跳转到后台
注销:
点击退出后清除token并跳转到登录页
修改密码:
密码修改成功,跳转到登录页面
3.2 字典管理
主界面:
创建字典:
编辑字典信息:
删除字典:
下载字典:
查看字典:
添加字典数据:
字典加权:
删除字典数据:
批量导入字典数据:
社工字典:
3.3 资产管理
主界面:
添加资产:
编辑资产:
资产详情页面:
资产发现:
资产监控:
添加监控目标:
编辑监控信息:
删除监控:
监控详情页面:
3.4 POC管理
主界面:
添加POC:
编辑POC信息:
删除poc:
查看POC:
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