Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

Posted MottoIN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器相关的知识,希望对你有一定的参考价值。

项目主页

视频演示:

简介

对于系统管理员来说,每天进行安全漏洞分析和软件更新是每日必需的基本活动。为了避免生产环境中的故障,对系统管理员来说选择不使用由保管理器提供的自动更新选项并执行手动更新非常常见。但是这会导致以下问题的发生:

  • 系统管理员必需不断提防NVD(国际漏洞数据库)中所有新的安全漏洞等。对于系统管理员来说

  • 如果在服务器上安装了大量的软件,那么监控所有的软件基本是不可能的。

  • 通过执行分析来确定被漏洞影响的服务器需要付出高昂的代价。在分析过程中忽略一两个服务器是很正常的。

Vuls是解决以上问题的工具。它具有以下特征:

  1. 通知系统相关漏洞的用户。

  2. 通知受影响服务器的用户。

  3. 实现漏洞自动化检测以防止检查。

  4. 在使用CRON等的日常基础上生成报告来管理漏洞。


特点

在Linux服务器上扫描安全漏洞

  • 支持Ubuntu,Debian,CentOS,Amazon Linux,RHEL ;

  • 支持Cloud,on-premise,Docker;

系统包管理器中不包括扫描中间设备

  • 针对漏洞的扫描中间设备、程序语言库和框架;

  • 在CPE中注册支持软件;

无代理架构

  • 要求用户只在一台通过SSH连接到其他目标服务器的机器上进行设置;

配置文件模版的自动生成

  • 使用CIDR服务器设置的自动监测,生成配置文件模版;

支持电子邮件和Slack通知(支持日本);

扫描结果在附件软件、TUI 查看终端中可见。

缺陷

不能更新漏洞集合包;

安装

有3种方法来安装vuls。

  • Docker容器

  • Chef

  • 手动安装

下面展示了如何手动安装vuls

教程:Hello Vuls

本教程将使用vuls带领你扫描localhost中的漏洞。

扫描可以通过以下步骤完成:

  1. Launch Amazon Linux (Launch Amazon Linux)

  2. Enable to ssh from localhost (允许来自localhost的ssh)

  3. Install requirements (安装需要的程序)

  4. Deploy go-cve-dictionary (部署 go-cve-dictionary)

  5. Deploy Vuls (部署 Vuls)

  6. Configuration (配置)

  7. Prepare (准备)

  8. Scan (扫描)

  9. TUI(Terminal-Based User Interface) TUI(基于终端的用户交互)

  10. Web UI ()

第一步. Launch Amazon Linux

  • 这个例子中使用的是旧的AMI(amzn-ami-hvm-2015.09.1.x86_64-gp2 – ami-383c1956)

  • 将以下代码添加到cloud-init,避免在第一次启动时自动更新

#cloud-config
repo_upgrade: none

第二步. SSH 设置

需要ssh到自己。

创建一个密钥对,然后对验证密钥追加公钥:

$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys

Vuls不支持SSH密码认证。所以你必须使用SSH密钥

第三步. 安装要求

Vuls需要下面的包:

  1. sqlite

  2. git

  3. gcc

  4. go v1.6

  • https://golang.org/doc/install

$ ssh ec2-user@52.100.100.100 -i ~/.ssh/private.pem
$ sudo yum -y install sqlite git gcc
$ wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.6.linux-amd64.tar.gz
$ mkdir $HOME/go

在/etc/profile.d/goenv.sh中增加这些行:

export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

设置操作系统环境:

source /etc/profile.d/goenv.sh

第四步. 部署 go-cve-dictionary

$ sudo mkdir /var/log/vuls
$ sudo chown ec2-user /var/log/vuls
$ sudo chmod 700 /var/log/vuls
$ go get github.com/kotakanbe/go-cve-dictionary

当获取错误时请检查:

  • Update Git

  • try

获取 来自 NVD 的漏洞数据。大概需要10分钟时间(在AWS上)。

$ for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done
... snip ...
$ ls -alh cve.sqlite3
-rw-r--r-- 1 ec2-user ec2-user 7.0M Mar 24 13:20 cve.sqlite3

第五步. 部署 vuls

Launch一个新的终端,SSH到ec2实例。

$ go get github.com/future-architect/vuls

当获取错误时请检查:

  • Update Git

  • try

第六步. 配置

创建一个配置文件(TOML 格式)

$ cat config.toml
[servers]

[servers.172-31-4-82]
host = "172.31.4.82"
port = "22"
user = "ec2-user"
keyPath = "/home/ec2-user/.ssh/id_rsa"

第七步. 为vuls设置目标服务器

$ vuls prepare

第八步. 开始扫描

$ vuls scan -cve-dictionary-dbpath=$PWD/cve.sqlite3
INFO[0000] Start scanning (config: /home/ec2-user/config.toml)
INFO[0000] Start scanning
INFO[0000] config: /home/ec2-user/config.toml
INFO[0000] cve-dictionary: /home/ec2-user/cve.sqlite3


... snip ...

172-31-4-82 (amazon 2015.09)
============================
CVE-2016-0494 10.0 Unspecified vulnerability in the Java SE and Java SE Embedded components in Oracle
 Java SE 6u105, 7u91, and 8u66 and Java SE Embedded 8u65 allows remote attackers to
 affect confidentiality, integrity, and availability via unknown vectors related to
 2D.
... snip ...

CVE-2016-0494
-------------
Score 10.0 (High)
Vector (AV:N/AC:L/Au:N/C:C/I:C/A:C)
Summary Unspecified vulnerability in the Java SE and Java SE Embedded components in Oracle Java SE 6u105,
 7u91, and 8u66 and Java SE Embedded 8u65 allows remote attackers to affect confidentiality,
 integrity, and availability via unknown vectors related to 2D.
NVD https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-0494
MITRE https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-0494
CVE Details http://www.cvedetails.com/cve/CVE-2016-0494
CVSS Claculator https://nvd.nist.gov/cvss/v2-calculator?name=CVE-2016-0494&vector=(AV:N/AC:L/Au:N/C:C/I:C/A:C)
RHEL-CVE https://access.redhat.com/security/cve/CVE-2016-0494
ALAS-2016-643 https://alas.aws.amazon.com/ALAS-2016-643.html
Package/CPE java-1.7.0-openjdk-1.7.0.91-2.6.2.2.63.amzn1 -> java-1.7.0-openjdk-1:1.7.0.95-2.6.4.0.65.amzn1

第九步. TUI

Vuls拥有基于终端的用户交互来查看扫描结果。

$ vuls tui

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

第十步. Web UI

vulsrepo是个基于 awesome的Web UI。查看Demo。

体系架构

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

go-cve-dictionary

从 NVD,JVN(日本)fetch漏洞信息,然后插入SQLite。

Vuls

  1. 在服务器上扫描漏洞并创建CVE ID列表;(To scan Docker containers, Vuls connect via ssh to the Docker host and then docker exec to the containers. So, no need to run sshd daemon on the containers.)

  2. 为了获得监测到的CVE更多详细信息,发送HTTP请求到go-cve-dictionary;

  3. 系统操作员可以通过终端查看最近的报告;


Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

性能考虑

详情请移步:

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

用例

扫描所有服务器

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

扫描单个服务器

负载均衡下使用相同配置的 Web/app 服务器

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

支持操作系统

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

用法:自动发现服务器

发现子命令发现CIDR范围中特定的活跃服务器,然后打印配置文件(TOML格式)到终端。

$ vuls discover -help
discover:
 discover 192.168.0.0/24

例如:

$ vuls discover 172.31.4.0/24
# Create config.toml using below and then ./vuls --config=/path/to/config.toml

[slack]
hookURL = "https://hooks.slack.com/services/abc123/defghijklmnopqrstuvwxyz"
channel = "#channel-name"
#channel = "${servername}"
iconEmoji = ":ghost:"
authUser = "username"
notifyUsers = ["@username"]

[mail]
smtpAddr = "smtp.gmail.com"
smtpPort = "465"
user = "username"
password = "password"
from = "from@address.com"
to = ["to@address.com"]
cc = ["cc@address.com"]
subjectPrefix = "[vuls]"

[default]
#port = "22"
#user = "username"
#keyPath = "/home/username/.ssh/id_rsa"
#cpeNames = [
# "cpe:/a:rubyonrails:ruby_on_rails:4.2.1",
#]
#containers = ["${running}"]
#optional = [
# ["key", "value"],
#]

[servers]

[servers.172-31-4-82]
host = "172.31.4.82"
#port = "22"
#user = "root"
#keyPath = "/home/username/.ssh/id_rsa"
#cpeNames = [
# "cpe:/a:rubyonrails:ruby_on_rails:4.2.1",
#]
#containers = ["${running}"]
#optional = [
# ["key", "value"],
#]

你也可以使用此模版进行自定义配置

配置

Slack部分

[slack]
hookURL = "https://hooks.slack.com/services/abc123/defghijklmnopqrstuvwxyz"
channel = "#channel-name"
#channel = "${servername}"
iconEmoji = ":ghost:"
authUser = "username"
notifyUsers = ["@username"]
  • hookURL:进入到webhook的URL

  • 通道:通道名称

如果你设置 #{servername} 到通道,该报告将呗发送到 #servername 通道。

在下面的例子中,该报告将被发送到 #server1 和 #server2 中。

确定在扫描前创建这些通道。

[slack]
channel = "${servername}"
...snip...

[servers]

[servers.server1]
host = "172.31.4.82"
...snip...

[servers.server2]
host = "172.31.4.83"
...snip...
  • iconEmoji:emoji

  • authUser:slack团队的用户名

  • notifyUsers:Slack 用户名列表以发送 Slack 通知。如果你设置[“@foo”, “@bar”]称notifyUsers,@foo @bar将被纳入文本中。(所以 @foo,@bar 可以在手机上接受到推送到通知。)

邮件部分

[mail]
smtpAddr = "smtp.gmail.com"
smtpPort = "465"
user = "username"
password = "password"
from = "from@address.com"
to = ["to@address.com"]
cc = ["cc@address.com"]
subjectPrefix = "[vuls]"

默认部分

[default]
#port = "22"
#user = "username"
#keyPath = "/home/username/.ssh/id_rsa"
#cpeNames = [
# "cpe:/a:rubyonrails:ruby_on_rails:4.2.1",
#]
#containers = ["${running}"]
#optional = [
# ["key", "value"],
#]

如果没有特别指定,则使用默认部分。

服务器部分

[servers]

[servers.172-31-4-82]
host = "172.31.4.82"
#port = "22"
#user = "root"
#keyPath = "/home/username/.ssh/id_rsa"
#cpeNames = [
# "cpe:/a:rubyonrails:ruby_on_rails:4.2.1",
#]
#containers = ["${running}"]
#optional = [
# ["key", "value"],
#]

你可以在默认部分覆盖默认值。

  • 端口:端口号

  • 用户:SSH用户名

  • 秘钥:SSH密钥路径

  • cpenames:

  • 容器:

  • 可选:添加额外的信息JSON报告。

Vuls支持多种SSH身份验证方法:

  • SSH 代理

  • SSH 公钥验证(使用密码、空密码)

  • 密码验证

使用:配置

configtest使用命令检查vuls能够通过SSH连接到服务器/容器在config.toml里定义

$ vuls configtest --help
configtest:
 configtest
 [-config=/path/to/config.toml]
 [-ask-key-password]
 [-ssh-external]
 [-debug]

[SERVER]...
 -ask-key-password
 Ask ssh privatekey password before scanning
 -config string
 /path/to/toml (default "/Users/kotakanbe/go/src/github.com/future-architect/vuls/config.toml")
 -debug
 debug mode
 -ssh-external
 Use external ssh command. Default: Use the Go native implementation

同时,configtest使用命令sudo设置在目标服务器检查Vuls是否能够通过SSH nopassword sudo。

例如 /etc/sudoers on target servers

  • CentOS, RHEL

vuls ALL=(root) NOPASSWD: /usr/bin/yum, /bin/echo
vuls ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/bin/apt-cache

使用:准备

准备在每台服务器上安装包需要的子命令。

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

$ vuls prepare -help
prepare
 [-config=/path/to/config.toml] [-debug]
 [-ask-key-password]
 [SERVER]...

-ask-key-password
 Ask ssh privatekey password before scanning
 -config string
 /path/to/toml (default "$PWD/config.toml")
 -debug
 debug mode

使用:扫描

$ vuls scan -help
scan:
 scan
 [-lang=en|ja]
 [-config=/path/to/config.toml]
 [-results-dir=/path/to/results]
 [-cve-dictionary-dbpath=/path/to/cve.sqlite3]
 [-cve-dictionary-url=http://127.0.0.1:1323]
 [-cache-dbpath=/path/to/cache.db]
 [-cvss-over=7]
 [-ignore-unscored-cves]
 [-ssh-external]
 [-report-azure-blob]
 [-report-json]
 [-report-mail]
 [-report-s3]
 [-report-slack]
 [-report-text]
 [-http-proxy=http://192.168.0.1:8080]
 [-ask-key-password]
 [-debug]
 [-debug-sql]
 [-aws-profile=default]
 [-aws-region=us-west-2]
 [-aws-s3-bucket=bucket_name]
 [-azure-account=accout]
 [-azure-key=key]
 [-azure-container=container]
 [SERVER]...


 -ask-key-password
 Ask ssh privatekey password before scanning
 -aws-profile string
 AWS Profile to use (default "default")
 -aws-region string
 AWS Region to use (default "us-east-1")
 -aws-s3-bucket string
 S3 bucket name
 -azure-account string
 Azure account name to use. AZURE_STORAGE_ACCOUNT environment variable is used if not specified
 -azure-container string
 Azure storage container name
 -azure-key string
 Azure account key to use. AZURE_STORAGE_ACCESS_KEY environment variable is used if not specified
 -cache-dbpath string
 /path/to/cache.db (local cache of changelog for Ubuntu/Debian) (default "$PWD/cache.db")
 -config string
 /path/to/toml (default "$PWD/config.toml")
 -cve-dictionary-dbpath string
 /path/to/sqlite3 (For get cve detail from cve.sqlite3) 
 -cve-dictionary-url string
 http://CVE.Dictionary (default "http://127.0.0.1:1323")
 -cvss-over float
 -cvss-over=6.5 means reporting CVSS Score 6.5 and over (default: 0 (means report all))
 -debug
 debug mode
 -debug-sql
 SQL debug mode
 -http-proxy string
 http://proxy-url:port (default: empty)
 -ignore-unscored-cves
 Don't report the unscored CVEs
 -lang string
 [en|ja] (default "en")
 -report-json
 Write report to JSON files ($PWD/results/current)
 -report-mail
 Send report via Email
 -report-s3
 Write report to S3 (bucket/yyyyMMdd_HHmm)
 -report-slack
 Send report via Slack
 -report-text
 Write report to text files ($PWD/results/current)
 -results-dir string
 /path/to/results (default "$PWD/results")
 -ssh-external
 Use external ssh command. Default: Use the Go native implementation

SSH的外部选项

vuls支持不同类型的SSH。

由defaut,使用密码/ SSH本地去实施。

这是非常有用的情况下,您可能无法访问传统的UNIX工具。

使用外部的SSH命令,指定此选项。

如果你想使用proxycommand或SSH密码算法不支持本地去实施这是有用的。

不要忘记添加以下行/ etc /目标服务器上的sudoers。(用户名:vuls)

Defaults:vuls !requiretty

密钥密码选项

报告JSON文本选项

在扫描结束后,扫描结果将在 $PWD/result/current/

(JSON | TXT)包括扫描结果所有servres和ServerName。(JSON | TXT)包括扫描服务器的结果。

例子:扫描配置文件中定义的所有服务器:

$ vuls scan 
 --report-slack  
 --report-mail 
 --cvss-over=7 
 -ask-key-password 
 -cve-dictionary-dbpath=$PWD/cve.sqlite3

执行这个示例命令,它会:

扫描特定的服务器

$ vuls scan 
 -cve-dictionary-dbpath=$PWD/cve.sqlite3  
 server1 server2

执行这个示例命令,它会:

更多扫描使用示例请移步:

使用:更新NVD数据

$ go-cve-dictionary fetchnvd -h
fetchnvd:
 fetchnvd
 [-last2y]
 [-dbpath=/path/to/cve.sqlite3]
 [-debug]
 [-debug-sql]

-dbpath string
 /path/to/sqlite3 (default "$PWD/cve.sqlite3")
 -debug
 debug mode
 -debug-sql
 SQL debug mode
 -last2y
 Refresh NVD data in the last two years.
`

fetch整个时期的数据:

$ go-cve-dictionary fetchnvd -entire

fetch最后两年的数据:

$ go-cve-dictionary fetchnvd -last2y

更多使用请参考:


文章由MottoIN整理发布


以上是关于Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器的主要内容,如果未能解决你的问题,请参考以下文章

Linux 平台下的漏洞扫描器 Vuls

vuls漏洞扫描工具

Vuls:针对LinuxFreeBSD的无代理端型漏洞扫描工具

#yyds干货盘点#愚公系列2022年08月 Go教学课程 002-Go语言环境安装

Go语言基础介绍

Go语言基础介绍