前言

前段时间遇到公司的一个项目,说到服务器需要做漏洞扫描,防止服务器在公网上访问有漏洞导致后期出现问题。然后我找了一圈,找到了一些扫描工具,但是达到的效果都不是我要的结果。之后寻找,发现了一个工具,能扫描系统,然后列出CVE漏洞,这不就是我要的效果吗?
所以就有了今天的文,因为工具是由日本人用Golang(我最喜欢的开发语言了)开发的,也因此有了今天的带日语文字的标题。工具支持CVE和日本漏洞库标准,支持02年到现在的漏洞数据库,扫描速度经过使用尚可。它的名声也不低,在国内也有人去接触,它就是vuls
本文对此工具不做太多介绍和解释,主要是做一个使用记录,因为当时找了一圈国内的文章,大多数就是大篇幅的介绍这个东西的用途和基本原理(这些基本在官方文档都能查到-->文档连接(英文)),对于实际使用的比较少,所以自己查阅官方文档,自己对工具进行编译安装使用。
头一次自己编译使用日本人开发的开源工具,这次来感受一下日本开发者做的东西好不好用吧。

正片

雷区

先说说自己遇到的雷区。

  1. Docker安装:官方是提供Docker安装的,基本上全程使用Docker操作,但是由于Docker本身的原因,如果需要容器里面的工具对外部进行扫描,就需要使用SSH连接到宿主机上,但是有一点比较麻烦的是,Vuls登录SSH官方文档里面是使用证书的,密码登录我没试过,不过证书登录是可以做免密的,所以就会需要用户先去整一个证书,然后写好配置文件,然后再挂载到docker里面,过程比较麻烦,所以个人并不推荐使用Docker。而且工具本身就是一个二进制文件,没有什么乱七八糟的额外文件,所以二进制执行起来也很方便了。
  2. 下载Github打包好的安装:Package官方并没有教程,基本来说操作就是从github上面下载官方自己动态编译的二进制文件,然后本地执行,但是官方直接执行二进制文件,由于是动态编译,会有部分老一点的系统出现动态库版本不够的问题,主要是动态编译官方的环境依赖版本比较高,这些以来有些系统可以升级,有些没办法升级,重新编译glibc动态库的话,会有很多事情需要去做,例如需要手动更新make,还要手动更新ggc等等,所以有这些功夫,要么就自己根据系统编译vuls,要么就硬着头皮升级系统啥的,步骤繁多,而且像ggc这种编译耗时很长,所以这里也不支持。

编译教程

实际上编译过程非常简单,官方文档也解释的非常的明白。主要分为三个工具要编译:go-cve-dictionarygoval-dictionaryVuls
这里提一嘴:官方是有推荐使用--gost,这个官方解释如下:

version Vuls 0.5.0 now possible to detect vulnerabilities that patches
have not been published from distributors using new data source named
gost.

大致意思就是,0.5.0版本的vuls可以通过这个gost工具,获得一些还没有发布补丁的漏洞,这个可编译也可以不编译,官方仓库里面是没有编译的教程的,但是vuls官方文档上面有编译教程,这里最后简单的说一下,但是这个工具貌似国内编译的时候会出现网络问题,所以失败就算了。
后面官方还有两个工具:go-exploitdbgo-msfdb,这两个玩意玩网安的估计都知道,metasploit和exoloit db,这两个主要是显示漏洞的一些复现原理之类的,对于知识用来做漏洞检测的,就没有那个必要了。
不过有意思的是,这玩意本来是用来生成数据库的,我不知道为什么我没有编译这个俩东西,也生成了相应的数据库,可能后期官方把这俩东西直接内置到vuls了,所以根本就不用编译了(猜的),所以还是直接忽视吧。

需要工具

  1. 搭载Linux系统的编译环境(推荐Linux,Windows自然也可以,不过环境要自行调整,需要GCC和Make)
  2. Golang 1.16(这里官方挖了个坑,文档写着1.13最低,实际上代码已经用到了1.16的特性了)
  3. go-cve-dictionarygoval-dictionaryVuls 源码包
  4. SQLite3Git

编译开始

Golang的配置环境和用法这里省略不说,就是下载源码包安装,修改gopath,国内环境的话修改goproxy
实际上基本都是一样的,这里直接简单翻译一下官方的编译方法:
先贴上官方编译文档:Vuls手动(编译)安装
Step1:拉取go-cve-dictionarygoval-dictionaryVuls 源码
直接贴上连接:
go-cve-dictionary
goval-dictionary
vuls
这里再贴一下git的拉取连接(git拉取需要配置git网络代理,国内的话建议还是直接下载源码包吧)

git clone https://github.com/kotakanbe/go-cve-dictionary.git
git clone https://github.com/kotakanbe/goval-dictionary.git
git clone https://github.com/future-architect/vuls.git

Step2:编译
拉取下来后,如果是压缩包先进行解压,这些简单的操作步骤就不说了,如果不熟悉linux操作使用个人推荐还是先去学着用了在看这些操作。
按照官方给的教程,基本上全都是下载下来之后,进入各自源码文件夹里面,执行命令:

make install

三个都一样的操作,这里就不做过多叙述了。

目前遇到的坑
每次都会到golint上面卡住,这有一个解决方案,如果在遇到提示某个依赖包安装超时的时候,先找到该依赖包的仓库(仓库连接一般会在报错信息上面显示),使用go get拉取下来,或者手动从源码托管的地址上面下载,进行安装,然后调整安装脚本调用。
以下用golint作为例子:

go get -u golang.org/x/lint/golint //用go拉取该依赖包
//一般常规的golang标准库,国内环境配置了goproxy的话能正常下载
//但是有些第三方标准库不在goproxy可下范围或者因为其他问题无法下载的话
//就请到源码仓库里面手动下载,解压到 $GOPATH/src 里面,并按源url配置文件夹
//例如golint就是:$GOPATH/src/golang.org/x/lint/golint
//具体不做过多叙述,vuls目前没遇到这个问题,有遇到的话麻烦查询一下相关的规则
go install golang.org/x/lint/golint //安装该依赖包

这时候安装完成的话它会在$GOPATH/bin下就能找到生成的二进制文件。然后回到正在编译的vuls工具里的源码文件夹,找到GUNMakefile,找到golint安装那一栏:

lint:
$(GO_OFF) get -u golang.org/x/lint/golint
golint $(PKGS)

先注释掉原来的go get拉取,然后修改下面执行golint命令,在golint命令前加上刚刚生成的golint的绝对路径
(请自行修改补全$GOPATH

lint:
# $(GO_OFF) get -u golang.org/x/lint/golint
$GOPATH/bin/golint $(PKGS)

然后重新执行以下make install应该就没问题了。后期遇到问题的话我会继续在这里补充。

Step3 获取生成文件
golang编译成功后生成的文件基本都在$GOPATH/bin/下,自行打开到里面测试,记得把权限给755

那么编译教程到这里就先结束了,因为官方提供的方法都比较简单,所以具体多的不说,其实我个人认为应该是支持go build或者直接go install的,但是官方脚本基本上都做好了,这两个也没啥好测试了,有兴趣的时候再测一下吧。

使用教程

编译教程结束了,这里就开始使用教程了,使用的话其实也不难,官方文档的指南做的还不错。(这日本开发者写的文档太对东方人了,简直是懒鬼福音)。先贴上官方指南:官方指南列表
简单的流程是这样的:执行漏洞库拉取工具拉取漏洞数据库,配置好配置文件,然后执行vuls的文件进行扫描,最后执行report命令出报告。下面就按照这个流程做简单说明。

拉取漏洞数据库

Step1 拉取go-cve-dictionary的数据库
该工具官方的解释如下(谷歌翻译):此工具用于构建NVD(国家漏洞数据库)和日本JVN的本地副本,其中根据CVE标识符,包含安全漏洞,包括详尽的信息和风险评分。本地副本是以sqlite格式生成的,该工具有一个服务器模式(自建漏洞库),便于查询。
官方仓库:go-cve
进入go-cve-dictionary所在的目录,执行以下命令:

//JVN库,1998指的是在1998年开始到今年,按照需求修改这个数字,就能拉取从该年开始到现在的JVN漏洞数据库
for i in `seq 1998 $(date +"%Y")`; do go-cve-dictionary fetchjvn -years $i; done
//NVD库,2002的含义和JVN的1998同理,不做叙述
for i in `seq 2002 $(date +"%Y")`; do go-cve-dictionary fetchnvd -years $i; done
//具体其他命令可以用-h或者help查看。例如数据库的类型,数据库的位置等。

Step2 拉取goval-dictionary
该工具官方的解释如下(谷歌翻译):此工具用于构建OVAL的本地副本。本地副本是以sqlite格式生成的,该工具有一个服务器模式(自建漏洞库),便于查询。
官方仓库:goval
进入go-cve-dictionary所在的目录,执行以下命令:

goval-dictionary fetch-SYSTEM SYSTEM-VERSION...
//SYSTEM指的是Linux的发行版名称,如果是CentOS就用redhat,具体其他可以用-h或者help查看。
//SYSTEM-VERSION 是发行版的版本,CentOS7此部分就用7,...代表可以同时多版本,用空格隔开
//具体支持版本请看官方的文档
//具体其他命令可以用-h或者help查看。例如数据库的类型,数据库的位置等。

同时如果因为网络问题无法拉取,可以配置相关代理:

goval-dictionary fetch-SYSTEM SYSTEM-VERSION... -http-proxy=proxy_server

Step3 拉取gost
这里是额外的,上面没有做gost的配置,不过还是简单的说一下这个东西。
gost工具可以获得一些还没有发布补丁的漏洞,因为暂时也没有解决方案所以可以不管,但是对网安感兴趣的,可以去研究一下。下面是拉取的方法

gost fetch SYSTEM
//SYSTEM是系统类型,目前包含:Redhat、Debian、Ubuntu、Microsoft。用小写即可。
//如果用microsoft还需要 --apikey

配置config.toml

一般默认是没有这个文件的,需要自己新建一个,目录随意(后期可指定),然后先贴上官方文档的格式:Config.toml配置
简单配置的话就是如下(按照只配置了go-cve和goval而言):

[cveDict]
type = ["sqlite3", "mysql", "postgres", "redis", "http" ]
sqlite3Path = "/path/to/cve.sqlite3"
url        = ""
#Type指代数据库类型,一般用sqlite3。如果是自建服务器的漏洞数据库,就用http
#sqlite3Path就是数据库路径了,如果是自建服务器的漏洞数据库,这条可以删除或注释掉
#url是当type使用http的时候,用来说明自建服务器的漏洞数据库的IP地址

[ovalDict]
type = ["sqlite3", "mysql", "postgres", "redis", "http" ]
sqlite3Path = "/path/to/oval.sqlite3"
url        = ""
#Type指代数据库类型,一般用sqlite3。如果是自建服务器的漏洞数据库,就用http
#sqlite3Path就是数据库路径了,如果是自建服务器的漏洞数据库,这条可以删除或注释掉
#url是当type使用http的时候,用来说明自建服务器的漏洞数据库的IP地址

[server]
#toml格式的文件,子项采用的是[父项.子项]的格式,此处子项标题可以自定义

[server.localhost]
host                = "127.0.0.1"
scanMode            = ["fast", "fast-root", "deep", "offline"]
#scanMode是扫描模式,默认是快扫,如果想深入挖掘服务器漏洞,最好用deep,offline是调用本地数据库的。

[server.remotehost]
host                = ""
port               = "22"
user               = "root"
sshConfigPath      = "/home/username/.ssh/config"
keyPath            = "/home/username/.ssh/id_rsa"
scanMode           = ["fast", "fast-root", "deep", "offline"]
#host是远程IP地址,远程采用SSH的方式连接,需要使用密钥连接,端口默认是22(可根据实际修改)
#sshConfigPath和Keypath就是密钥信息的路径参数,根据需要修改
#scanMode是扫描模式,默认是快扫,如果想深入挖掘服务器漏洞,最好用deep,offline是调用本地数据库的。

更多配置信息请直接参考官方配置文件模板。这里就不详细说明了。

执行扫描和生成报告

执行扫描很简单,直接运行命令:

vuls scan

即可扫描(当然前提是配置文件和vuls在同一目录下),但是其实可以在后面加flag调整功能。
具体常用命令如下:

[-config=/path/to/config.toml]                   //指定配置文件 
[-results-dir=/path/to/results]                  //指定结果输出位置
[-log-to-file]                                   //生成日志 
[-log-dir=/path/to/log]                          //生成日志路径 
[-http-proxy=http://192.168.0.1:8080]            //代理服务器   

扫描完成后一定要手动执行生成报告,否则无法显示内容,输入以下命令:

vuls report

同样,该命令还有很多flag,下面三个能直接输出结果到控制台:

[-format-one-line-text]
[-format-list]
[-format-full-text]

其他flag以后用到了再补充吧。

信息输出

整个使用流程就是差不多这个样子,使用起来很简单,报告的格式也具有不错的阅读性,它支持tui和web端输出报告。
tui比较简单,执行命令vuls tui即可。
Web端报告输出
web端的话,是另外的一个工具,在官方文档也有,叫Vulsrepo的,连接在这->Vulsrepo,里面有详细的使用说明。
这里应一吊毛的需求,简单说明一下如何访问到web端查看信息,最简单就是,下载仓库源码,修改配置文件,然后启动运行。
具体操作如下:
Step1:
下载仓库源码->vulsrepo源码,源码拉取方法参考上文,git也好直接下载也好随你喜欢。源码包含一个内置的webserver和主页面等web文件,不需要额外配置webserver。
Step2:
下载下来之后,解压打开源码目录的server文件夹,然后输入命令:

cp vulsrepo-config.toml.sample vulsrepo-config.toml && vim vulsrepo-config.toml

Step3:
输入上面的命令后,将会复制一份配置文件同时重命名去掉sample,并打开显示以下内容

[Server]
rootPath = "/home/vuls-user/vulsrepo"
resultsPath  = "/opt/vuls/results"
serverPort  = "5111"
#serverIP = "127.0.0.1"
#serverSSL = "yes"
#serverCert = "cert.pem"
#serverKey = "key.pem"

//rootPath:根目录,这里指的是vulsrepo源码的根目录,错误将无法正常显示页面。
//resultsPath:输出结果的文件夹路径,是vuls的结果输出路径。
//注意:首次使用vuls扫描过后会默认在当前目录或者指定目录自动生成一个result文件夹。
//如从未用vuls扫描,在运行vulsrepo之前需要根据vuls的默认或配置文件手动建立一个result文件夹。
//serverPort:监听的端口,默认5111。
//serverIP:服务器的IP,默认localhost。
//serverSSL、Cert、Key这三个是证书访问,说白了就是建立https连接。
//一般而言如果只是本地使用,后面四个IP、SSL、Cert、Key一般不用配置,保留注释就好。

Step4:
运行当前目录下的:vulsrepo-server文件

./vulsrepo-server &

让它在后台运行,然后就可以了。接下来在浏览器输入:

http://serverIP:serverPort 
//serverIP就是当前机子的本地IP,serverPort就是你指定的服务器端口

接着后面的话直接web操作即可,这里就不做过多说明了,玩玩就会了。

trivy

这里再推荐一个附加的工具,用来扫描docker镜像的---trivy,仓库连接放在这里->Trivy仓库
然后这个是Trivy的官方文档->Trivy官方文档
这是全日语的教程文档->Trivy文档
工具支持直接yum安装,但是需要配置仓库信息,这里不展开了,直接看文档吧->安装方法
使用方法也非常简单,运行此命令即可:

trivy image 镜像名称

总结

总的来说,整体使用还是比较简单的,当时挖了很多坑,但是慢慢还是摸透了这个玩意,我看官方还有一些图形界面的工具,我找不到,不知道怎么弄,这个以后再慢慢研究吧。这个软件还不错,也达到了我的需求,后期应该扫描漏洞都会用到的了。记录就到这里,之后想到什么再做补充吧。