0x00 前言
GVM漏洞管理框架是Greenbone Vulnerability Manager的简称,是德国绿骨公司的漏洞管理框架(下文中将以GVM代指),它的前身是openvas扫描器。截至本文发布,绿骨公司还在对GVM的组件进行快速迭代和重命名,以后的一些名称可能会与现在的不同。
一些重要的名称解释:
GVM-libs:绿骨漏洞管理解决方案的库模块相互进行沟通的重要API
GVMD(Greenbone Vulnerability Manager Daemon):管理守护进程
OSP(Open Scanner Protocol):是用于控制各种漏洞扫描器的XML格式通信协议
OSPD(Open Scanner Protocol Daemon): 是通过OSP协议通信控制扫描器的框架
GMP(Greenbone Management Protocol):一个基于XML的软件内部通信协议(通过该协议可以用来控制GVMD)
VTS(Vulnerability Tests):漏洞测试
NVTS(Network Vulnerability Tests):网络漏洞测试(nasl脚本)
GSA(Greenbone Security Assistant):用于生成web界面,并为Web应用程序提供API
本文将着重分析GVM的三个主要模块(图中圈出部分):
1.OpenVAS Scanner(下文将简称为scan模块):
Scan模块是一个功能齐全的扫描引擎,可以针对目标系统执行漏洞测试(VT)。为此,它使用每日更新和全面的提要:全功能、广泛的商业绿骨安全提要(Greenbone Security Feed),或免费提供的绿骨社区提要(Greenbone Community Feed)。
Scan模块由组件ospd-openvas和openvas-scanner组成。scan模块由ospd-openvas通过一个基于XML的软件内部通信协议制(OSP)控制openvas-scanner,并将执行报告、扫描结果发送到管理后台程序(GVMD)。
Github项目地址:https://github.com/greenbone/openvas-scanner
2.Greenbone漏洞管理器守护进程(下文将简称为GVMD模块):
GVMD模块是中央服务,它整合普通漏洞扫描成一个完整的漏洞管理解决方案。GVMD通过开放扫描器协议(OSP) 控制scan模块。该服务本身提供基于XML的无状态Greenbone管理协议(GMP)。GVMD还控制一个SQL数据库(PostgreSQL),所有配置和扫描结果数据都集中存储在其中。此外,GVMD还处理用户管理,包括对组和角色的权限控制。最后,该服务具有用于计划任务和其他事件的内部运行时系统。
Github项目地址:https://github.com/greenbone/gvmd
3.GVM-libs:
GVM-libs是绿骨漏洞管理解决方案的库模块。它用于绿骨安全管理器设备并提供各种功能来支持集成服务守护进程。简单来说GVM-libs是一个C库,提供XML解析和网络通信等基本功能是从源码部署时最先安装的模块。是其他GVM模块运行的重要依赖。它用于扫描器scan模块、管理进程GVMD模块和用于生成web界面的GSA模块之间。包括对redis知识库的操作都是在gvm-libs模块进行的。
Github项目地址:https://github.com/greenbone/gvm-libs
4.GVM其他组成模块(这些模块在扫描器框架中占有重要角色但本文不做重点进行分析):
绿骨安全助理(GSA)
GSA是GVM的一个用户控制扫描Web界面和访问与漏洞的信息。它是GVM用户的主要联系点。它通过Web服务器Greenbone Security Assistant Daemon (GSAD) 连接到GVMD,以提供用于漏洞管理的全功能Web应用程序。使用绿骨管理协议(GMP)进行通信,用户也可以使用不同的工具直接与之通信。
OSP 扫描仪
用户可以使用通用的OSPD扫描器框架开发和连接他们自己的OSP扫描器。可在此处找到可用作OSP扫描仪模板的(通用)OSP扫描仪示例。
GMP 客户端
GVM工具是一个工具集与远程控制帮助绿骨安全管理器(GSM)设备及其基础绿骨漏洞管理器守护程序(GVMD)。这些工具有助于访问通信协议GMP(绿骨管理协议)和OSP(开放扫描协议)。该模块由交互式和非交互式客户端组成。交互式脚本直接支持编程语言Python。但也可以在不使用Python编程的情况下发出远程GMP/OSP命令。
0x01 安装踩坑
GVM框架采用C语言进行编写,由于其采用了一些只有在linux中才可以使用的第三方库,所以目前GVM只可以在linux中安装使用。
源码部署踩坑
GVM在linux中的安装一般采用源码部署,源码可以从github中拉取,拉取时最好加个代理,我使用的是第三方代理工具ProxyChains。
参照手册:https://greenbone.github.io/docs/gvm-21.04/index.html
使用的主机Ubuntu-21.04
部署过程:
首先按照上方连接中的手册内容创建用户和组,并且要设置安装路径,期间若不报错应该就是没有问题。
之后可以导入Greenbone签名密钥,导入秘钥主要是为了验证下载的文件是原始文件。这里我选择导入秘钥,避免以后程序下载东西的时候需要校验。
GVM-libs中有一些很重要的依赖库,需要最先安装,按照手册中的内容复制粘贴应该是没有问题的,下载时可以使用curl命令-x参数添加代理设置。
源码部署完毕后按照手册将redis和postgresql配置好,将手册中的三个服务开启来就可以初始化使用了。
源码部署中的一些问题:
1.源码部署未完成时就重启设备后发现之前的设置都失效了:
重新安装手册中对安装路径、软件版本进行设置就可以解决。
2.按照手册中设置了相应的软件版本,但在下载时却报错404:
是指定的版本不存在导致的,去github上看一下现有的版本然后更改一下设置版本的位置export GVM_VERSION=XXXX。
3.安装GVMD时报错缺少libical >= 1.0.0:
是由于手册中的软件包名称与apt下载时名称不一致导致的,可以使用命令 apt-get Install libical-dev 解决。如果出现类似的错误可以到对应的github项目中的install.md里查看一下有没有特定需要的说明。
4.安装GVMD时报错缺少postgresql-server-dev-11:
可以按照postgresql官方导库方法https://www.postgresql.org/download/linux/ubuntu/导入软件库,之后apt 安装。
5.安装GSA时yarn版本错误:
可以参照https://classic.yarnpkg.com/en/docs/install#debian-stable中的方法:
首先删除原有的yarn;
sudo apt remove yarn
按照参考配置软件库然后再使用下面命令进行安装。
sudo apt install yarn
6.在部署完毕后需要安装并启动postgresql,直接sudo apt install -y postgresql下来的是最新版,与GVM漏洞管理框架所需的版本不符:
可以在apt下载时使用命令apt-get install postgresql-11指定所需要的11版本,不要直接使用文档里的命令。
7.在设置PostgreSQL 用户和数据库时会切换用户,在以非root用户操作创建用户时需要加 sudo 但并不知道用户postgres的密码:
需要先切换到root用户中设置一下linux用户postgres的密码。
kali apt install 踩坑
GVM默认在kali的软件库中,在kali上只要apt-get install gvm -y 就可以进行安装,所依赖的环境会自动进行安装。
kali中apt安装时可能存在的一些问题:
kali自动安装时所安装的软件版本大多是最新的,版本与GVM所需要的版本不符合。需要先删除原有版本然后再下载所需要的版本即可。
比如我在kali-2021.3中使用apt自动下载GVM漏洞管理框架时所下载的postgresql版本不正确,无法使用。我首先尝试了apt remove不正确的版本,但并不能清除干净依然无法使用。然后我又尝试了apt autoremove结果把一并安装的GVM也给删除了。
所以最后可以这样解决:
vim /etc/postgresql/13/main/postgresql.conf将侦听端口改为不是5432的端口vim /etc/postgresql/14/main/postgresql.conf将侦听端口改为是5432的端口
kali中GVM整体的日志在/var/log/gvm/目录下。通过日志可以查看gvm当前进行了哪些操作出现了哪些错误,对研究其运行有很大的帮助。
在kali中初始化启动
gvm-setup//会自动检测安装的软件是否正确,如果出现报错会将解决方案一并给出,可以按照给出的方案执行解决。runuser -u gvm — gvmd –user=admin –new-password=admin //修改web界面密码为admin ###gvm-feed-update//更新特征库进一段时间不建议使用使用此命令在更新成功前会删除原有scan 标识等,会导致gvm无法使用(更新成功没有问题),最近绿骨公司服务器不太稳定(不用挂代理,使不了就是他们服务器挂了)
如果按照以上方法都不可以正常使用还可以通过docker拉取的方式使用,docker仓库中可以使用的很多,缺点是并不是很新。另外绿骨公司还有vmware和virtualbox版的虚拟机版本可以直接下载使用,缺点是无法像linux那样控制全部内容。
0x02 Scan模块
Scan模块是绿骨漏洞管理(GVM)解决方案的开放漏洞评估扫描器(OpenVAS),所以现在很多人管这个scan模块叫做OpenVAS,它用于绿骨安全管理器设备,是一个功能齐全的扫描引擎,可以执行网络漏洞测试脚本(NVT)并且会持续更新该脚本库。scan模块主要包含redis数据库,VTS和SCAP三个部分。
1.redis数据库:
默认redis.sock路径为:/run/redis-openvas/redis-server.sock使用redis-cli -s/run/redis-openvas/redis-server.sock 对redis数据库进行连接
2.VTS(nasl脚本部分,部署GVM后默认没有,需要在gvm-setup的时候进行下载)
3.SCAP(SCAP漏洞关联信息,部署GVM后默认没有,需要在gvm-setup的时候进行下载)
重要文件的存储路径如下:
nasl脚本默认存放目录:/var/lib/openvas/pluginsscap-data默认存放目录:/var/lib/gvm/scap-data/
具体的文件结构列表可以查看镜像站:
http://mirror.ufs.ac.za/misc/openvas-nvt-feed/
http://mirror.ufs.ac.za/misc/openvas-scap-data/
在整套的GVM中scan模块不会单独使用而是使用web端的图形界面对scan模块进行控制,使用方便显示直观。但scan作为一个独立的模块可以单独运行。
scan模块官方预留的一些调试接口:
源码位置 |
接口说明 |
调用命令 |
openvas.c |
可以在linux shell中使用命令 openvas 调用 |
可以在linux shell中使用命令 openvas 调用 |
nasl.c |
GVM scan模块预留的可以对nasl进行调试的接口,可以单独使用 |
在linux shell中使用命令 openvas-nasl 调用 |
nasl_lint.c |
针对nasl脚本语言的一种静态代码分析工具 |
在linux shell中使用命令 openvas-nasl-lint 调用 |
0x03 GVMD模块
GVMD管理漏洞的配置信息和扫描的结果。通过基于XML的绿骨管理协议(GMP)提供对数据、控制命令和工作流程的访问。通过开放扫描器协议(OSP)控制OpenVAS(上文中的scan模块)扫描器。
GVMD包含一个postgresql数据库用来存放用户输入的信息、测试完成的结果、脚本的信息、漏洞与应用关联的信息,一套证书机制(用来将所有与GVMD进行的通信使用TLS加密以及进行身份验证和授权),一套脚本更新机制进行更新SCAP漏洞信息以及nasl脚本,和供其他工具模块连接的套接字接口。
如果是在kali中直接apt-get gvm则无法知道postgresql数据库的密码,可以通过如下命令对数据库密码进行修改:(登录到数据库是为了方便观察GVM漏洞管理框架中数据库所存储数据的内容,更改数据库的密码并不会影响GVM漏洞管理框架的运行)
root@kali:/home/user# sudo -u postgres bashpostgres@kali:/home/user$ psql gvmdpsql (14.0 (Debian 14.0-1))输入 “help” 来获取帮助信息.gvmd=#ALTER USER postgres WITH PASSWORD ‘postgres’;
GVMD模块预留的一些接口:
源码位置 |
接口说明 |
调用命令 |
gvmd.c |
管理进程的入口,其中可使用的功能包括设置web界面的管理用户及密码,更新脚本和漏洞信息,设置资源所有者,设置日志信息,设置等. |
可以在linux shell中使用命令 gvmd 调用 |
gvm-manage-certs |
负责进行证书的管理 |
可以在linux shell中使用命令gvm-manage-certs调用 |
gvm-feed-update |
负责对网络测试脚本,漏洞库进行更新 |
在linux shell中使用命令 gvm-feed-update 调用 |
0x04 GVM web界面介绍
GVM漏洞管理框架web界面由GSA模块生成,GSA(Greenbone Security Assistant)是基于React框架开发的web界面,使用GMP软件内部协议与后台GVMD进行通信。GVM web界面默认开启端口:9392 https协议,只可以本机访问。可以更改/lib/systemd/system/greenbone-security-assistant.service配置文件中的信息改变监听ip和端口。
创建扫描任务步骤如下:
1.登录web页面,依次点击【scans】【tasks】【新建任务按钮】
2.在new task中可以添加扫描信息,这里的Min QoD会决定之后生成的报告中显示的数量
3.添加目标主机信息处可以指定IP地址端口以及登录凭证。这里支持SSH、SMB、ESXi、SNMP
4.最后点击【save】进行保存
这些信息将会被写入GVMD模块控制的postgresql数据库的数据public结构中。添加完毕后可以在底部看到新增的扫描,之后可以开始进行扫描。扫描器需要一段时间进行准备,之后就会开始扫描进程。
当扫描结束时生成的扫描报告分为这几个部分:
1.Results字段中存放漏洞信息,这里注意有一个124 of 162代表一共从162份报告中挑选了124份进行显示。报告的挑选与之前在添加目标时选择的min QoD有关。
具体内容将在以后的文章中进行讲解
请持续关注本公众号!
2.Hosts字段中存放主机信息,Auth字段的小盾牌代表远程登录成功。
3.此外还有端口信息、主机安装的应用(以CPE的方式进行显示可以点击链接对该CPE进行漏洞关联)。
4.操作系统信息也会使用CPE来表示、CVEs为漏洞编号与描述、closed CVEs是在初始扫描时探测到可能的漏洞但在后续的探测中发现应该不存在此漏洞、TLS信息、报错信息和用户标签。
0x05参考链接
https://greenbone.github.io/docs/architecture.html
https://greenbone.github.io/docs/glossary.html#term-VT
https://docs.greenbone.net/GSM-Manual/gos-20.08/en/index.html
https://greenbone.github.io/docs/gvm-21.04/index.html
https://www.postgresql.org/download/linux/ubuntu/
https://classic.yarnpkg.com/en/docs/install#debian-stable
https://blog.csdn.net/qq_40846669/article/details/119034841
更多技术文章,微信公众号搜索“云影实验室”。
顺便插下招聘广告,安全研究员1名和安全开发工程师1名,有意者可以私信公众号。