Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器
Posted MottoIN
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器相关的知识,希望对你有一定的参考价值。
项目主页
视频演示:
简介
对于系统管理员来说,每天进行安全漏洞分析和软件更新是每日必需的基本活动。为了避免生产环境中的故障,对系统管理员来说选择不使用由保管理器提供的自动更新选项并执行手动更新非常常见。但是这会导致以下问题的发生:
系统管理员必需不断提防NVD(国际漏洞数据库)中所有新的安全漏洞等。对于系统管理员来说
如果在服务器上安装了大量的软件,那么监控所有的软件基本是不可能的。
通过执行分析来确定被漏洞影响的服务器需要付出高昂的代价。在分析过程中忽略一两个服务器是很正常的。
Vuls是解决以上问题的工具。它具有以下特征:
通知系统相关漏洞的用户。
通知受影响服务器的用户。
实现漏洞自动化检测以防止检查。
在使用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中的漏洞。
扫描可以通过以下步骤完成:
Launch Amazon Linux (Launch Amazon Linux)
Enable to ssh from localhost (允许来自localhost的ssh)
Install requirements (安装需要的程序)
Deploy go-cve-dictionary (部署 go-cve-dictionary)
Deploy Vuls (部署 Vuls)
Configuration (配置)
Prepare (准备)
Scan (扫描)
TUI(Terminal-Based User Interface) TUI(基于终端的用户交互)
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需要下面的包:
sqlite
git
gcc
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
第十步. Web UI
vulsrepo是个基于 awesome的Web UI。查看Demo。
体系架构
go-cve-dictionary
从 NVD,JVN(日本)fetch漏洞信息,然后插入SQLite。
Vuls
在服务器上扫描漏洞并创建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.)
为了获得监测到的CVE更多详细信息,发送HTTP请求到go-cve-dictionary;
系统操作员可以通过终端查看最近的报告;
性能考虑
详情请移步:
用例
扫描所有服务器
扫描单个服务器
负载均衡下使用相同配置的 Web/app 服务器
支持操作系统
用法:自动发现服务器
发现子命令发现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 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的漏洞扫描器的主要内容,如果未能解决你的问题,请参考以下文章
Vuls:针对LinuxFreeBSD的无代理端型漏洞扫描工具