-
Notifications
You must be signed in to change notification settings - Fork 97
User Guide
技术栈
- Spring boot 微服务架构,agent可分布式部署
- Redis、Quartz、MySQL、RabbitMQ、Docker
- VUE,基于前端模板有很大的改动
- 图表统计基于echarts
- JDK 15
- python3.9
功能 | 详情 |
---|---|
图表统计 | 1.折线图包括: 资产ip、资产端口 检测结果、高危资产 2.饼图包括: 检测结果数、检测结果数(未修复) top 100端口数(所有ip端口)、top 100端口数的ip(未下线ip端口) 服务数、服务数(未下线端口) 版本数、版本数(未下线端口) webinfo中server数 高危端口数、高危端口数(未下线) 高危服务数、高危服务数(未下线) 高危版本数、高危版本数(未下线) |
任务管理 | 1.agent信息与心跳检测 2.任务状态实时监控,任务操作 |
资产、检测结果管理 | 1.资产ip、端口 2.内网主机信息 3.插件检测结果 4.web和url信息,包含http头信息 |
联系信息管理 | 1.部门管理 2.项目信息管理 3.联系人管理 4.联系人项目信息管理 |
设置 | 1.批量导入 2.定时任务 3.钉钉群实时推送漏洞信息、资产及漏洞报告邮件通知 4.ua及高危信息 5.用户名密码字典 6.多种白名单机制,可对ip、端口、web title、web页面url做白名单 |
插件管理 | nse插件,python插件,http json插件,java插件 |
漏洞wiki | 包含完整的漏洞描述和修复方案,后续将增加用户前端开放给项目组自行学习 |
其他功能 | 1.Agent基于nmap、masscan的端口扫描,center后续将提供api接入其他系统端口扫描结果及漏洞扫描结果。 2.基于nse插件、自定义插件的安全扫描 3.基于自定义http爬虫的http/https服务,类http服务,未知服务版本的web页面信息抓取,页面链接抓取 4.基于RabbitMQ的任务分发和检测结果收集 5.分布式agent 6.漏洞实时提醒、汇总邮件提醒,资产汇总邮件提醒,可标记高危资产 7.双击 GenPass.bat ,一键初始化所有密码,杜绝默认密码
|
所有内容编码均为utf-8
- 登录口存在爆破
- 未全部做数据合法性校验,所填数据要合法
-
centerapp.jar,运行后会在当前目录生成一个center文件夹,里面是center的日志;发送邮件报告时,会在当前目录生成report文件夹,里面包含asset(资产报告)和vuln(漏洞报告)
-
agentapp.jar,运行后会在当前目录生成一个agent文件夹,里面是agent的日志
访问服务器ip并登录
账号:MagiCude
密码:见newPass.txt(admin那行,用户名是MagiCude,不是admin)
基本的增删改查,页面数据导出等
批量导入功能在设置-批量导入
以任务信息-任务为例
-
新增,如果输入框带搜索功能,需要手动选择之后才能新增,不然会新增空值
-
编辑
若无其他说明,每个页面基本功能基本如上述所示
删除会有确认框
首页有4个折线图和2个饼图,折线图数据每天早上六点统计一次,也可以前往设置-统计报表数据自定义设置统计频率,饼图数据每次查看都会查询数据库
资产ip、资产端口 折线图(如果没有数据则只有标题)
检测结果、高危资产 折线图(如果没有数据则只有标题)
检测结果数、检测结果数(未修复) 饼图(如果没有数据则只有标题,数据量太少的话实际分类可能有误差)
统计中的资产,资产2,高危与上述类似,都是各种饼图
-
可以查看系统当前的Agent信息,agent启动后会自动新增,不需要手动操作,可前往设置-定时任务-agent心跳包监控设置center发送心跳包的频率
-
Agent状态也可以前往注册中心查看,及上节确认服务已注册
-
如果没有Agent在线,则无法执行任务
任务归属,与联系信息中的项目信息不同,联系信息中的项目信息是ip归属的项目信息
创建、执行、查看任务状态等
编辑/新增时,输入框会有具体的说明
由于后端未全部做数据完整性校验,数据格式需要遵循格式说明
如果不明确默认值,可留空新增后查看,然后再重新编辑即可
任务结果说明
各个任务,扫描后结果的具体位置
nmap/mass/mass2Nmap -> 资产管理-资产ip/资产端口/主机
selfd/nse -> 检测结果-检测结果
httpp -> 检测结果-web信息/web和url信息/url
-
支持以下六种任务类型:
端口扫描:nmap、mass、mass2Nmap
插件扫描:nse、selfd
页面抓取:httpp
任务类型 说明 nmap 调用nmap执行端口扫描,支持udp协议端口入库;结果包含ip、端口、协议、状态、服务、版本等信息 mass 调用masscan执行端口扫描;结果包含ip、端口、协议、状态等信息 mass2Nmap 先调用masscan执行端口扫描,再调用nmap对masscan扫描的结果进行端口详细信息扫描;结果包含ip、端口、协议、状态、服务、版本等信息 nse 调用nmap的nse插件进行安全检测,前端可以配置nse插件;结果包含ip端口、漏洞名称、插件名称、风险、检测结果等信息 selfd 调用自定义插件进行安全检测,前端可以配置selfd python3及http访问的json插件;结果包含ip端口、漏洞名称、插件名称、风险、检测结果等信息 httpp 对:like http、为空、null、tcpwrapped、unknown、包含?的端口服务和版本,进行http页面爬取(非JS动态页面);结果包含ip端口,web title,body内容,http头的server、xpoweredby、setcookie、认证方式,页面所有链接等信息 -
支持nse、selfd、httpp三种指定任务的检测类型(可理解为普通的扫描器)
检测类型 说明 nse nse检测任务与nse任务类似,只不过nse检测任务针对的是指定的任务 selfd selfd检测任务与selfd任务类似,只不过selfd检测任务针对的是指定的任务 httpp httpp检测任务与httpp任务类似,只不过httpp检测任务针对的是指定的任务 -
任务可设置线程数量,单个ip扫描次数,ip分组大小,端口分组大小(仅限nmap全端口模式)
-
可设置附加选项
-
目标ip可设置指定ip,ip CIDR,ip地址段,排除ip与此类似
-
目标端口可设置指定端口,端口范围
-
可指定数据库中的资产ip为排除ip,不对数据中的资产ip进行扫描
-
可设置定时任务,基于cron表达式的定时任务
指定目标端口时,不能设置端口分组大小,两者冲突
设置定时任务时,可前往设置-定时任务-cron表达式解析解析cron表达式是否正确(只支持6位)
- 新建namp任务
新建mass和mass2Nmap任务与此类似
- 新建安全检测任务或对指定任务进行安全检测
注意:httpp任务没有插件
- 新建安全检测任务,即对资产ip端口进行安全检测,已nse任务为例,selfd任务类似
保存后才能选择插件
-
对指定任务进行安全检测,即对指定任务的任务ip端口进行安全检测任务
只能对已结束的nmap、mass2Nmap任务进行检测,且开始执行后,会新建对应检测类型的子任务
只有nmap、mass、mass2Nmap任务有PID,其他没有
任务执行过程中ip端口记录,指定任务进行安全检测依赖这个
如没有指定任务安全检测需求,可以定时清空这两个表
查看编辑资产ip信息
可查看指定ip的所有信息,包括部门, 项目信息, 联系人, 资产ip, 资产端口, 主机信息, 位置信息, 漏洞检测结果, web信息, url信息等信息(如果有的话)
安全检测白名单:不会对该ip及ip的端口进行nse、selfd、httpp(端口扫描不受影响,如果不想扫描某个ip,需要加到任务的排除ip中)
资产提醒白名单:该ip及ip的所有端口,不提醒ip负责人(即使端口不在白名单),默认提醒不受限制
查看编辑资产端口信息
可查看指定ip的所有信息,包括部门, 项目信息, 联系人, 资产ip, 资产端口, 主机信息, 位置信息, 漏洞检测结果, web信息, url信息等信息(如果有的话)
使用dns解析host信息,主要针对内网ip
mac地址、OS类型、OS版本、类型字段暂时没有使用
查看检测的漏洞信息,及检测结果对应的漏洞
查看web和url信息时
-
如果title是已知的,可以到白名单设置-标题中加白,系统不会再抓取该title的body内容和页面链接
-
如果页面链接中包含已知域名,可以到白名单设置-域名中加白,则检测结果中的url不记录该链接
可设置部门、联系人、项目信息、联系人项目信息关联
联系人,指的是项目的负责人
项目信息,指的是实际的项目(不是任务信息里的项目)
邮件发资产报告和漏洞报告依赖联系人信息和项目信息
如果一个ip没有对应的项目信息,则代表这个ip没有联系人
一次只能上传一个不超过3M的txt文件, 每行一条数据, 编码为utf-8
如果批量导入的数据包含|
,则只能手动添加
导入的数据需要符合以下格式,前端也有提示,可下载批量导入数据的模板或实际的数据进行导入
-
部门项目信息联系人
- 格式说明
电话不能为空,如无电话,写暂无 部门|项目信息|联系人|邮箱|电话 测试部门|测试项目部|名字|邮箱|暂无
- 实际格式参考
部门|测试项目部|贰拾壹|test@test.com|1234567
-
项目信息ip
- 格式说明
项目信息|ip 项目信息|ip段 项目信息|ip cidr
- 实际格式参考
魔方项目部|192.168.1.1 测试项目|192.168.1.1-192.168.2.11 测试项目|192.168.3.0/24
-
ip端口
- 格式说明
逗号后面没有空格 如果要导入InterScanner的结果https://github.com/er10yi/InterScanner,需修改成当前格式 ip[[端口,协议,状态,服务,版本],[端口,协议,状态,服务,版本]] ip不存在会新增,避免使用新增C段甚至B段的格式,会导致整个C段或B段的ip都导入数据库
- 实际格式参考
192.168.2.1 192.168.2.2-192.168.2.11 192.168.3.0/24 192.168.1.1[[1111,tcp,open,service22,version],[2222,udp,open,ssh,sshversion]]
-
ip主机名
- 格式说明
ip不存在会新增 ip:主机名信息
- 实际格式参考
192.168.1.1:work-testhostname.cor.com
-
漏洞分类
- 格式说明
如果没有二级分类,最后面的 : 也不能省略 一级分类:二级分类1|二级分类2 有二级分类:越权:水平越权|垂直越权 无二级分类:拒绝服务:
- 实际格式参考
越权:水平越权|垂直越权 拒绝服务:
-
漏洞详情
- 格式说明
名称|描述|风险级别|参考|影响范围|一级分类名称|二级分类名称|漏洞示例代码|漏洞POC|修复方案|修复代码示例|修复配置示例|暂无
- 实际格式参考
SSH弱密码|ssh弱密码,可直接远程登录服务器,导致服务器被攻陷|严重||所有SSH版本|失效的身份认证|弱密码|||1.修改ssh密码,使密码符合公司密码复杂度要求,2.配置防火墙,只对业务ip开放ssh访问权限|||暂无
-
插件配置
-
格式说明
可以导入多行插件(不含插件的代码selfd也可以),适用于多个服务,版本,关键字等
风险: 信息, 低危, 中危, 高危, 严重, 致命 如果暂时没有漏洞与插件对应,漏洞名称填默认,不然无法发漏洞报告 名称|参数|风险|类型|超时|服务|版本|关键字|漏洞名称 对应多个服务,版本,关键字,需要多条配置 nse插件:smb-vuln-ms08-067||高危|nse||microsoft-ds||VULNERABLE|默认 自定义(不包含代码,代码需要在selfd插件配置中导入) RedisInfo|info|高危|selfd|5000|redis|Redis key-value store|Server|Redis未授权访问 RedisInfo|info|高危|selfd|5000|redis|Redis key-value store|Clients|Redis未授权访问 RedisInfo|info|高危|selfd|5000|redis|Rdis key-value store|Stats|Redis未授权访问
- 实际格式参考
smb-vuln-ms08-067||高危|nse||microsoft-ds||VULNERABLE|默认 SSHWeakPass|cat /etc/passwd|严重|selfd|3000|ssh|ssh|root|SSH弱密码 SSHWeakPass|cat /etc/passwd|严重|selfd|3000|ssh|ssh|shutdown|SSH弱密码 SSHWeakPass|cat /etc/passwd|严重|selfd|3000|ssh|ssh|nobody|SSH弱密码
-
-
selfd插件配置
- 格式说明
风险: 信息, 低危, 中危, 高危, 严重, 致命 对应多个服务,版本,关键字,需要多条配置,如果暂时没有漏洞,漏洞名称填默认 插件规范:模块只能import或者from开头,否则未安装的模块不会自动安装 辅助验证类型: http,dns 格式如下: 名称|参数|风险|类型|辅助验证类型|超时|服务|版本|关键字|漏洞名称|(这里有个换行) 插件代码
- 实际格式参考
RedisInfo|info|高危|selfd||5000|redis|Redis key-value store|Server|Redis未授权访问| # -*- coding:utf-8 -*- import socket def start(ip, port, cmd, timeout, payload_map): password_list = payload_map.get('password') try: socket.setdefaulttimeout(int(timeout)) for password in password_list: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip, int(port))) s.send(('AUTH ' + password + '\r\n' + cmd + '\r\n').encode()) byte_result = s.recv(1024) str_result = str(byte_result) if 'no password is set' in str_result: return 'RedisWeakPass\nRedis未设置密码' + byte_result.decode() if '+OK' in str_result: return 'RedisWeakPass\n密码:' + password + '\n' + byte_result.decode() except Exception: raise
-
ip端口白名单
- 格式说明
ip|端口|检测白名单|提醒白名单 指定端口:192.168.1.1|3389|1|0 不指定端口(对ip设置白名单):192.168.1.1||1|0
- 实际格式参考
192.168.1.1|3389|1|0 192.168.2.1||1|0
-
项目信息端口白名单
- 格式说明
对项目下的ip和ip端口进行白名单 项目名称|端口|检测白名单|提醒白名单 指定端口:测试项目|3333|0|1 不指定端口(对整个项目设置白名单):测试项目||0|1
- 实际格式参考
测试项目|3333|0|1 魔方项目||0|1
-
域名白名单
- 格式说明
实际的域名,如果是根域名,则包含根域名的链接都不会记录 qq.com www.baidu.com
- 实际格式参考
qq.com www.baidu.com
-
标题白名单
- 格式说明
实际的web title,包含该字符的title的web相关信息不记录 Welcome to nginx Apache Tomcat
- 实际格式参考
Welcome to nginx Apache Tomcat
-
ua
httpp任务和http json插件agent会随机取ua
- 实际格式参考
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36 OPR/60.0.3255.84
-
高危端口
- 格式说明
实际的端口,资产报告会根据这个标记高危端口,统计-高危信息由这个得出 22 23
- 实际格式参考
22 23 6379
-
高危服务
- 格式说明
具体的服务,资产报告会根据这个标记高危服务,统计-高危信息由这个得出 ssh redis
- 实际格式参考
ssh redis
-
高危版本
- 格式说明
具体的版本,资产报告会根据这个标记高危版本,统计-高危信息由这个得出 Redis key-value store Redis key-value store 5.0.8 Memcached
- 实际格式参考
Redis key-value store Redis key-value store 5.0.8 Memcached
-
字典用户名
- 格式说明
字典用户名,所有weakPass插件都会用到 admin root
- 实际格式参考
admin root
-
字典密码
- 格式说明
字典密码,所有weakPass插件都会用到 admin toor
- 实际格式参考
admin toor
支持六位cron表达式模拟解析,也可用来查看系统时间是否正确
任务 | 说明 |
---|---|
任务状态监控 | 监控系统所有任务状态,用于更新任务结束时间,刷新任务的redis缓存 |
agent心跳包监控 | 监控agent在线状态,刚启动系统或新增agent时,如果agent没有在线,可以设置较短的时间,正常后再恢复 |
邮件资产报告 | 向项目负责人和默认提醒邮箱发资产报告 |
邮件漏洞报告 | 向项目负责人和默认提醒邮箱发漏洞报告 |
每天执行一次的任务 | dns解析获取hostname nse结果获取hostname 根据ip更新白名单 根据项目更新白名单 |
统计报表数据 | 首页折线图所依赖的数据 |
邮件漏洞报告只包括在风险等级中的漏洞,如果不想让项目组收到邮件,将风险等级清空即可
当前采用的是钉钉机器人群消息推送,由于发送频率限制,每条消息发送前休眠7秒
- 新建钉钉群
- 在桌面端钉钉,打开群设置,并新增自定义机器人(通过Webhook接入自定义服务)
- 机器人名字随意填写,安全设置选 加签,密钥复制到前端设置-通知设置-IM通知-秘钥处
- Webhook 地址复制到前端设置-通知设置-IM通知-消息地址处
配置成功后,需要开启通知才能推送漏洞消息,并且只有在风险等级里的风险才会提醒
-
8000
-
增加邮件配置
前端设置-通知设置-邮件通知-邮箱host,填写host
前端设置-通知设置-邮件通知-账号,填写账号
前端设置-通知设置-邮件通知-密码/授权码,填写密码/授权码
前端设置-通知设置-邮件通知-提醒邮箱列表,填写提醒邮箱列表
-
修改定时任务
前端设置-定时任务-邮件资产报告,增加邮件资产报告的cron表达式
前端设置-定时任务-邮件漏洞报告,增加邮件漏洞报告的cron表达式
-
之后等任务时间触发即可
非自建邮服可能有发信频率限制,没实际测
提醒邮箱列表为默认提醒邮箱,接收所有的资产报告(包括在提醒白名单中的)
漏洞报告只接收在风险等级中的
域名白名单(如果web页面的链接在域名白名单中,则检测结果中的url不记录该链接),标题白名单(如果web页面的title在标题白名单中,则检测结果中的web信息不记录该页面的body内容),ua(httpp任务和HTTP json插件会随机取ua),高危端口,高危服务,高危版本,字典用户名,字典密码
插件类型:
- nse插件,可前端新增,需要自己配置
- java自定义插件,无法前端新增,只能后端新增后,重新编译jar包
- python3自定义插件,可前端新增,需要自己配置,或下载最新的插件配置.txt导入
- json格式插件(使用http/https方式访问的插件,插件名需要以HTTP开头),可前端新增,需要自己配置,或下载最新的插件配置.txt导入
说明:
-
插件建议仔细阅读插件说明,并本地测试过实际的ip后,再新增
-
插件也可以从批量导入新增
-
插件的风险要与漏洞wiki中的风险一致
-
nse插件和自定义插件可以重复
-
一个插件只能对应一个漏洞,否则导出报告sql语句会出错, 虽然数据库设计是多对多的... 比如,xxxWeakPass,对应两个漏洞
-
weakPass所用的账号密码在设置-字典用户名/字典密码中设置
-
nse
插件 漏洞名称 memcached-info Memcached未授权访问 mysql-empty-password MySQL弱密码/未授权访问 mysql-vuln-cve2012-2122 默认 rdp-vuln-ms12-020 默认 redis-info Redis弱密码/未授权访问 smb-vuln-ms08-067 默认 smb-vuln-ms17-010 默认 x11-access 默认 -
java selfd自定义插件
插件 漏洞名称 JavaFTPWeakPass FTP弱密码/未授权访问 JavaMemcachedStats Memcached未授权访问 JavaMongoDbListDb MongoDB未授权访问 JavaMsSqlServerWeakPass MS SQL Server弱密码/未授权访问 JavaMysqlWeakPass MySQL弱密码/未授权访问 JavaNginxVerDetect Nginx版本低于最新版/已不受支持 JavaOracleWeakPass Oracle弱密码/未授权访问 JavaPostgresSqlWeakPass PostgreSQL弱密码/未授权访问 JavaRedisWeakPass Redis弱密码/未授权访问 JavaSambaWeakPass Samba弱密码/未授权访问 JavaSSHWeakPass SSH弱密码 JavaZookeeperEnvi Zookeeper未授权访问 注意:OracleWeakPass插件会导致oracle账户锁定...建议不要在生产环境使用
-
python3 selfd自定义插件
插件 漏洞名称 FTPWeakPass FTP弱密码/未授权访问 MemcachedStats Memcached未授权访问 MongoDbListDb MongoDB未授权访问 MysqlWeakPass MySQL弱密码/未授权访问 NginxVerDetect Nginx版本低于最新版/已不受支持 RedisWeakPass Redis弱密码/未授权访问 SSHWeakPass SSH弱密码 ZookeeperEnvi Zookeeper未授权访问 -
json selfd自定义插件(插件名需以HTTP开头)
插件 漏洞名称 HTTPElasticsearchUnauth 默认
-
可以在selfd插件配置批量导入
-
模块导入说明,模块只能import或者from开头,否则未安装的模块不会自动安装
如:import socket
或:from pexpect import pxssh
-
python插件未安装的模块,会自动从以下源获取安装,最后一次会尝试默认源
https://pypi.douban.com/simple/ https://pypi.mirrors.ustc.edu.cn/simple/ https://pypi.tuna.tsinghua.edu.cn/simple/ https://pypi.hustunique.com/ https://mirrors.aliyun.com/pypi/simple/
-
payloadMap:
Map<String, List<String>> payloadMap
-
插件名称必须包含WeakPass,才有
username_list = payload_map.get('username') password_list = payload_map.get('password')
-
辅助验证为http:
http_validate_list = payload_map.get('http_validate') http_validate = http_validate_list[0]
-
辅助验证为dns:
dns_validate_list = payload_map.get('dns_validate') dns_validate = dns_validate_list[0]
- 可以在selfd插件配置批量导入,json写在插件代码中
- 没想好json怎么格式化,先暂且用python的
- 使用http/https方式访问的插件,插件名需要以HTTP开头
- 其他信息填写在插件代码里,与Python3插件类似
支持get、post、put、delete、patch、head、options、trace
方法,目前只测试了get和post
格式说明如下:
http or https get
{
"protocol":"http", # 只能是http或者https
"method":"get", # 可以是 get、post、put、delete、patch、head、options、trace
"url":"/info.php?id=1&user=test",
headers:{
"host":"127.0.0.1",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36", # UA不配置,则会从ua表中随机
"Content-Type":"text/plain"
}
}
http or https post
{
"protocol":"http",
"method":"post",
"url":"/info.php?id=1&user=test",
headers:{
"host":"127.0.0.1",
"Content-Type":"text/plain" # 常规参数
},
data:{
"username":"test",
"password":"passwd"
}
}
http or https post
{
"protocol":"http",
"method":"post",
"url":"/info.php",
headers:{
"host":"127.0.0.1",
"Content-Type":"application/json" # json参数
},
data:{
"username":"test",
"password":"passwd"
}
}
others
{
"protocol":"http",
"method":"delete",
"url":"/info.php?id=1",
headers:{
"host":"127.0.0.1",
"Content-Type":"text/plain"
}
}
都可以批量导入
如果要对项目信息设置白名单,不建议对高危端口设置
默认用户为管理员用户,普通用户不能访问用户管理的数据(可以点进前端,懒得在前端判断权限了)
其他没什么不同
头像地址暂时用不上
只包括项目负责人和钉钉群消息实时推送的日志
计划用来给项目组查看的漏洞wiki,减少沟通,提高效率,不过还没写用户前端
默认分类和默认漏洞不能删除,默认存在的意义:可以新增一个插件暂时不用写漏洞wiki,将插件的信息指向默认既可,上述已有说明
与任务相关的一些多表
与插件相关的一些多表
漏洞wiki中的风险要与插件的风险一致
与漏洞wiki相关的一些多表
- 目标ip为ipNoPort、unknownPortSerVer、ipAllPort的这三个任务尽量不要同时启动,因为都涉及对数据库大量查询
- mass2Nmap任务状态,mass未完成时,为mass的状态,mass完成后为nmap的状态
- 目标数较多和涉及对数据库大量查询的任务,需要时间处理目标,点击开始后,等待系统处理即可,页面可能会超时(但任务已执行),请勿多次点击开始,否则将会开启多个任务
- selfd、httpp任务中途停止后,仍然会有线程残留,因为没有线程的pid,只是结束了线程池...
- OracleWeakPass插件会导致oracle账户锁定...建议不要在生产环境使用
- 其他注意事项,遵循之前章节里描述的
扫描下方二维码,关注公众号,回复自己的微信号+魔方,即刻拥有!