簡単に脆弱性をスキャンできるイケてるツール「Vuls」を試してみた

今日は話題の脆弱性スキャンツール「Vuls(バルス)」について紹介します。
Vulsとは今まで紹介した脆弱性スキャンツール(OpenVAS,OWZAP)などと異なり、CVE(脆弱性公開データベース)にある脆弱性に特化した自動スキャンツールです。
以下のような特徴があります。

  • システムに関係ある脆弱性のみ教えてくれる
  • その脆弱性に該当するサーバを教えてくれる
  • 自動スキャンのため脆弱性検知の漏れを防ぐことができる
  • CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる

以前の記事でも、紹介したようにCVEなどの脆弱性は毎日頻繁に更新されています。
弊社ではCVEが更新されれば、Slackで通知するようにしてはいますが、すべての脆弱性を追っていくことはほぼ不可能だと思われます。
またサーバ数が多くなったり、システムが膨大になってくればくるほどその労力は計り知れませんね。

より詳細な情報は公式のgithubで公開されています。

\"Slack\"
毎日、更新される脆弱性情報に翻弄される弊社

脆弱性スキャンツールVulsの準備

そこで、Vulsを活用することで常にリアルタイムに脆弱性を発見することができます。
早速インストールして、その威力を見ていきましょう。

Vulsが必要とする条件は以下の通りです

  • SQLite3
  •  git
  •  gcc
  •  go v1.6

 

Go言語で書かれているので、これらが動くOSならOSXでもWindowsでもLinuxでも構いません。
今回は、Vagrant上で動かしているCentOS7.1を用いました。

さて、まずは上記の必要なパッケージをインストールしていきます。


<h1>yum install sqlite git gcc</h1>

そして、次にGoをインストールします。
こちらはソースをダウンロードして、自分でコンパイルする必要があります。

 


<h1>wget https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz</h1>

適当なディレクトリに展開します。

 


<h1>tar -C /usr/local -xzf go1.6.linux-amd64.tar.gz</h1>

続いて、~/.bash_profileにパスを追記します。

 


<h1>vi ~/.bash_profile</h1>

<h1>以下を追記</h1>

export PATH=$PATH:/usr/local/go/bin

読み込みます。

 

$ source ~/.bash_profile

これでGoもインストールが完了しました!

 

 

Vulsの環境準備

ここまでで、導入の準備は整いましたが、Vulsの環境を準備する必要があります。

ログディレクトリの作成


<h1>sudo mkdir /var/log/vuls # sudo chown root /var/log/vuls # sudo chmod 700 /var/log/vuls</h1>

 

作業用ディレクトリの作成


<h1>mkdir vuls</h1>

<h1>cd vuls</h1>

と、このようにvuls用ディレクトリを作成します。
そして、いよいよ脆弱性(CVE)情報取得コマンドのインストールをします。

$ go get github.com/kotakanbe/go-cve-dictionary

続いて、CVE情報の取得を行います。

 

 


<h1>for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done</h1>

結構時間がかかりますが、辛抱強く待っていましょう。

さて、スキャンされる側はHTTPサーバとして動かす必要があります。
今回は自分自身に向けてスキャンを行いますので、go-cve-dictionaryサーバを起動します。

 


<h1>go-cve-dictionary server</h1>

サーバが立ち上がったらそのまま、別のシェルを立ち上げて、

 

 

$ su root

してから以下の作業しましょう。

このディレクトリをlsで見るとcve.sqlite3が作成されています。
ここに脆弱性情報がたくさん詰まってます。

 

 


<h1>ls /vagrant</h1>

cve.sqlite3

いよいよVulsのインストール

さあ、いよいよ準備が整いましたのでVulsをインストールしてみましょう。


<h1>go get github.com/future-architect/vuls</h1>

実際にインストールされたかを確認します。

 

 


<h1>vuls</h1>

Usage: vuls &lt;flags&gt; &lt;subcommand&gt; &lt;subcommand args&gt;
Subcommands:
    commands         list all command names
    flags            describe all known top-level flags
    help             describe subcommands and their syntax

Subcommands for discover:
    discover         Host discovery in the CIDR

Subcommands for history:
    history          List history of scanning.

Subcommands for prepare:
    prepare          Install required packages to scan.
                CentOS: yum-plugin-security, yum-plugin-changelog
                Amazon: None
                RHEL:   TODO
                Ubuntu: None

Subcommands for scan:
    scan             Scan vulnerabilities

Subcommands for tui:
    tui              Run Tui view to anayze vulnerabilites
Use &quot;vuls flags&quot; for a list of top-level flags

これで、インストールされていることが確認できました。
設定ファイルを追加します。
ここで追加するサーバーはスキャンを実行しようとするサーバーになります。
改めて、今回は自身をスキャンしますので自分自身のIPを設定しましょう。

 

 


<h1>cd /vuls</h1>

<h1>vi config.toml</h1>

[servers]
[servers.192-168-33-10]
host         = &quot;192.168.33.10&quot;
port        = &quot;22&quot;
user        = &quot;vagrant&quot;
keyPath     = &quot;/home/vagrant/.ssh/id_rsa&quot;

いよいよスキャンできる状態なのですが、ここでスキャンしようとすると

 

 


<h1>vuls scan</h1>

ERRO[0000] Error loading /vuls/config.toml, config.toml is invalid. keypath: /home/vagrant/.ssh/id_rsa not exists

と出て、怒られてしまいますね。
vulsはsudoと鍵認証を使ったSSHが前提となっていますので、おとなしく、鍵を作りましょう。
vagrantユーザー(sshでつなぐユーザー)に変わって以下のコマンドを実行します。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
The key fingerprint is:

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

これで鍵ペアが作成されて、SSHでアクセスすることができるようになります。

以下のコマンドを実行してみましょう。

 

 


<h1>vuls prepare</h1>

INFO[0000] Start Preparing (config: /vagrant/config.toml)
[Jun  1 14:43:21]  INFO [localhost] Detecting OS...
[Jun  1 14:43:22]  INFO [localhost] (1/1) Detected 192-168-33-10: centos 7.1.1503
[Jun  1 14:43:22]  INFO [localhost] Detecting Container OS...
[Jun  1 14:43:22]  INFO [localhost] Installing...
[Jun  1 14:43:22]  INFO [192-168-33-10] Installing yum-plugin-security...
[Jun  1 14:43:22]  INFO [192-168-33-10] Ignored: yum-plugin-changelog already installed
[Jun  1 14:43:22]  INFO [localhost] Success

これで準備が整いました!

 

スキャン開始!

いよいよスキャンを実行します
以下のコマンドを実行すると、スキャンが開始されます。


<h1>vuls scan</h1>

INFO[0000] Start scanning
INFO[0000] config: /vagrant/config.toml
INFO[0000] cve-dictionary: http://127.0.0.1:1323
[Jun  1 14:52:53]  INFO [localhost] Validating Config...
[Jun  1 14:52:53]  INFO [localhost] Detecting Server OS...
[Jun  1 14:52:53]  INFO [localhost] (1/1) Detected 192-168-33-10: centos 7.1.1503
[Jun  1 14:52:53]  INFO [localhost] Detecting Container OS...
[Jun  1 14:52:53]  INFO [localhost] Scanning vulnerabilities...
[Jun  1 14:52:53]  INFO [localhost] Check required packages for scanning...
[Jun  1 14:52:53]  INFO [localhost] Scanning vulnerable OS packages...

 

 

スキャン結果はひとつずつこのように表示されます。
スコアは危険度。どのCVEかとその詳細URLへのリンクが表示されます。


<h2>CVE-2014-3480</h2>

Score            4.3 (Medium)
Vector          (AV:N/AC:M/Au:N/C:N/I:N/A:P)
Summary         The cdf_count_chain function in cdf.c in file before 5.19, as used in the Fileinfo component in PHP
                before 5.4.30 and 5.5.x before 5.5.14, does not properly validate sector-count data, which allows
                remote attackers to cause a denial of service (application crash) via a crafted CDF file.
NVD             https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2014-3480
MITRE           https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3480
CVE Details     http://www.cvedetails.com/cve/CVE-2014-3480
CVSS Claculator https://nvd.nist.gov/cvss/v2-calculator?name=CVE-2014-3480&amp;vector=(AV:N/AC:M/Au:N/C:N/I:N/A:P)
RHEL-CVE        https://access.redhat.com/security/cve/CVE-2014-3480
Package/CPE     file-5.11-21.el7 -&gt; file-5.11-31.el7
                file-libs-5.11-21.el7 -&gt; file-libs-5.11-31.el7

カレントディレクトリを見ると、vuls.sqlite3が表示されていることがわかります。

 

 


<h1>ls</h1>

Vagrantfile  config.toml  cve.sqlite3  go  vuls.sqlite3

tui画面で一覧が表示されます。

 

 

vuls tui

\"tui\"

というような形で一覧で見ることができます。

まとめ

  • CVEの脆弱性に特化したスキャンが可能。
  • スキャン結果をSlackに通知したり、複数サーバへの同時スキャンなども可能
  • RailsなどのOSパッケージ以外にもスキャンが可能

今回は自分自身へのスキャンということでしたが、他にもまだまだ機能があるみたいですね。
ただやっぱり認証周りが若干めんどくさいのが…。パスワード認証なども設定をいじればできるようなので、
その辺りを調整して実際に使ってみてはいかがでしょうか。

  • このエントリーをはてなブックマークに追加
  • Pocket