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

关注 2017-12-06 11:42:41 查看数 10534 ,评论数 0 工具 技术控

项目主页

https://github.com/future-architect/vuls 68747470733a2f2f61736369696e656d612e6f72672f612f3379397a72663935306167696b6f376b6c673861627679636b2e706e67 视频演示:https://asciinema.org/a/3y9zrf950agiko7klg8abvyck 2

简介

对于系统管理员来说,每天进行安全漏洞分析和软件更新是每日必需的基本活动。为了避免生产环境中的故障,对系统管理员来说选择不使用由保管理器提供的自动更新选项并执行手动更新非常常见。但是这会导致以下问题的发生:
  1. 系统管理员必需不断提防NVD(国际漏洞数据库)中所有新的安全漏洞等。对于系统管理员来说
  2. 如果在服务器上安装了大量的软件,那么监控所有的软件基本是不可能的。
  3. 通过执行分析来确定被漏洞影响的服务器需要付出高昂的代价。在分析过程中忽略一两个服务器是很正常的。
Vuls是解决以上问题的工具。它具有以下特征:
  1. 通知系统相关漏洞的用户。
  2. 通知受影响服务器的用户。
  3. 实现漏洞自动化检测以防止检查。
  4. 在使用CRON等的日常基础上生成报告来管理漏洞。
3

特点

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

  • 支持Ubuntu,Debian,CentOS,Amazon Linux,RHEL ;
  • 支持Cloud,on-premise,Docker;

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

  • 针对漏洞的扫描中间设备、程序语言库和框架;
  • 在CPE中注册支持软件;

无代理架构

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

配置文件模版的自动生成

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

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

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

缺陷

不能更新漏洞集合包;

安装

有3种方法来安装vuls。
  • Docker容器
https://github.com/future-architect/vuls/tree/master/setup/docker
  • Chef
https://github.com/sadayuki-matsuno/vuls-cookbook
  • 手动安装
下面展示了如何手动安装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 (VulsRepo)

第一步. 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
当获取错误时请检查: 获取 来自 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
当获取错误时请检查:

第六步. 配置

创建一个配置文件(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
5

第十步. Web UI

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

体系架构

6

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. 通过Slack,Email发送报告;
  4. 系统操作员可以通过终端查看最近的报告;
7

性能考虑

详情请移步:https://github.com/future-architect/vuls#performance-considerations 8

用例

扫描所有服务器

9

扫描单个服务器

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

支持操作系统

11

用法:自动发现服务器

发现子命令发现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"],
#]
你可以在默认部分覆盖默认值。 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
  • Ubuntu, Debian
vuls ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/bin/apt-cache

使用:准备

准备在每台服务器上安装包需要的子命令。 12
$ 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

密钥密码选项

13

报告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
执行这个示例命令,它会:
  • 在扫描前问SSH密钥密码
  • 扫描在配置文件中定义的所有服务器
  • 发送扫描结果到slack和电子邮件
  • 只报告CVE的CVSS评分超过7的结果
  • 打印扫描结果到终端

扫描特定的服务器

$ vuls scan \
 -cve-dictionary-dbpath=$PWD/cve.sqlite3 \ 
 server1 server2
执行这个示例命令,它会:
  • 使用空密码认证SSH公钥(不要求密码选项)
  • 只扫描2个服务器(sever1,sever2);
  • 向终端打印扫描结果;
更多扫描使用示例请移步:https://github.com/future-architect/vuls

使用:更新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
更多使用请参考:https://github.com/future-architect/vuls
交流评论(0)
Loading...
点击 ,就能发表评论哦~如果您还没有账号,请 一个吧

广告

关注我们 查看更多精彩文章

css.php
正在加载中...