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

話題の脆弱性検知ツールVULSのインストール手順、使用方法の紹介

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

バルス!

目がぁ〜目がぁ〜

CA3J0463

TVで放送されるとツイッターが賑わうあれ、かどうかは別として本日はセキュリティのお話。

Vulsとは

Vuls(VULnerability Scanner直訳:脆弱性調査機(スキャナ))は左記翻訳の通り、だが脆弱性の調査、検知を行うツール。

◆主な特徴
  • システムに関係ある脆弱性のみ教えてくれる
  • その脆弱性に該当するサーバを教えてくれる
  • 自動スキャンのため脆弱性検知の漏れを防ぐことができる
  • CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる
  •  Linuxサーバに存在する脆弱性をスキャン
    • Ubuntu, Debian, CentOS, Amazon Linux, RHELに対応
    • クラウド、オンプレミス、Docker
  • OSパッケージ管理対象外のミドルウェアをスキャン
    • プログラミング言語のライブラリやフレームワーク、ミドルウェアの脆弱性スキャン
    • CPEに登録されているソフトウェアが対象
  • エージェントレスアーキテクチャ
    • スキャン対象サーバにSSH接続可能なマシン1台にセットアップするだけで動作
  • 設定ファイルのテンプレート自動生成
    • CIDRを指定してサーバを自動検出、設定ファイルのテンプレートを生成
  • EmailやSlackで通知可能(日本語でのレポートも可能)
  • 付属するTerminal-Based User Interfaceビューアでは、Vim風キーバインドでスキャン結果を参照可能

引用元:GitHub Vuls

スポンサーリンク
Sponsords Link

Vuls導入、実行してみた

手元のMacBookAirにVulsを導入し、Virtualbox上のテストサーバのスキャンをしてみた。

◆私の環境

Vuls
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.4
BuildVersion:	15E65

スキャン先
CentOS 6.6

◆見出し

  1. 環境準備
  2. Vulsインストール
  3. Scan実行

基本的に、README in English と、README in Japaneseを参考に実行している。

環境準備

Vulsを動作させるのに必要環境は下記だ。

  • SQLite3
  • git
  • gcc
  • go v1.6

MacOSXであれば、基本Golangの導入をすれば問題ないはずだ。Goが入っていない方は下記参照。

Gophercolor

MacOSXへのGo言語インストール手順

それぞれのパッケージの導入状況確認。ターミナルでそれぞれのVersionコマンドを実行して確認。

◆sqlite3

$ sqlite3 -version
3.8.10.2 2015-05-20 18:17:19 2ef4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4

◆git

$ git --version
git version 2.7.4 (Apple Git-66)

◆gcc

$ gcc -dumpversion
4.2.1

◆go

$ go version
go version go1.6.2 darwin/amd64

それぞれ「そんなコマンド知らない」って返されなければOK

Vulsインストール

いよいよVulsインストールだ。下記の通り簡単だ。

ログディレクトリ、作業ディレクトリを準備

◆ログディレクトリ作成
var/log/vulsを作成し、作成したディレクトリの所有者をユーザ(あなたのログインユーザ)に変更、パーミッションを700に変更。

$ sudo mkdir /var/log/vuls
$ ls -l /var/log/ | grep vuls
drwxr-xr-x 2 root wheel 68 5 4 23:42 vuls

$ sudo chown 'your user' /var/log/vuls
$ ls -l /var/log/ | grep vuls
drwxr-xr-x 2 user wheel 68 5 4 23:42 vuls

$ sudo chmod 700 /var/log/vuls/
$ ls -l /var/log/ | grep vuls
drwx------ 2 user wheel 68 5 4 23:42 vuls

◆作業ディレクトリ作成
ログインユーザのHomeディレクトリに作業ディレクトリを作成する。ここにスキャン実行時の設定ファイル、スキャン結果が配置される。

$ pwd
/Users/user
$ mkdir vuls

◆作成したディレクトリに移動。

$ cd vuls/
$ pwd
/Users/user/vuls

CVEダウンロード、CVE Dictionaryサービス起動

◆go-cve-directionaryのダウンロード

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

できたかな

$ ls $GOPATH/bin
go-cve-dictionary

◆CVE情報の取得と保存

20分くらいかかる。

$ for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done
~~
~~
[May  5 01:20:50]  INFO Refreshed 1492 Nvds.

◆go-cve-dictionaryサービスを起動
最初はコマンド打って下記で止まりプロンプトが帰ってこなくて、「ん?処理してるのか?」と勘違いして1時間放置して何も変わらず「…????」だった。下記で止まった状態でサービスが起動した状態のようだ。下記まで来たら、そのままにし新しいターミナルを開こう。

$ go-cve-dictionary server
 go-cve-dictionary server
[May  5 08:54:10]  INFO Opening DB. datafile: /Users/user/vuls/cve.sqlite3
[May  5 08:54:10]  INFO Migrating DB
[May  5 08:54:10]  INFO Starting HTTP Sever...
[May  5 08:54:10]  INFO Listening on 127.0.0.1:1323

◆cveがダウンロードされた確認

$ ls
cve.sqlite3

◆curlで起動したサービスから情報取得を試みてみる

curlコマンドでcve dictionaryサーバのジェイソン情報を取得

$ curl http://127.0.0.1:1323/cves/CVE-2014-0160 | jq "."
~~
~~
    ],
    "PublishedDate": "2014-04-07T18:55:03.893-04:00",
    "LastModifiedDate": "2015-10-22T10:19:38.453-04:00"
  },
  "Jvn": {
    "ID": 0,
    "CreatedAt": "0001-01-01T00:00:00Z",
    "UpdatedAt": "0001-01-01T00:00:00Z",
    "DeletedAt": null,
    "CveDetailID": 0,
    "Title": "",
    "Summary": "",
    "JvnLink": "",
    "JvnID": "",
    "Score": 0,
    "Severity": "",
    "Vector": "",
    "References": null,
    "Cpes": null,
    "PublishedDate": "0001-01-01T00:00:00Z",
    "LastModifiedDate": "0001-01-01T00:00:00Z"
  }
}

尚、jqコマンドを入れていなければbrewでインストール。

$ brew install jq
==> Installing dependencies for jq: oniguruma
==> Installing jq dependency: oniguruma
==> Downloading https://homebrew.bintray.com/bottles/oniguruma-5.9.6.el_capitan.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring oniguruma-5.9.6.el_capitan.bottle.1.tar.gz
  /usr/local/Cellar/oniguruma/5.9.6: 13 files, 1M
==> Installing jq
==> Downloading https://homebrew.bintray.com/bottles/jq-1.5.el_capitan.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring jq-1.5.el_capitan.bottle.2.tar.gz
  /usr/local/Cellar/jq/1.5: 18 files, 957.9K

vulsインストール

◆vulsをgo getでインストール

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

GOPATHにvulsできてるかな

$ ls $GOPATH/bin
go-cve-dictionary	vuls

◆最初に作成した作業ディレクトリに移動

$ cd vuls
$ pwd
~/viuls

◆Configファイルを作業ディレクトリ直下に作成
config.tomlを作成し、各時のスキャン先となるターゲットサーバ情報を設定

$ vim config.toml
~~

[servers.server1]
host         = "192.168.1.1(yourserver ip/domain)"
port        = "22(yourserver ssh port)"
user        = "user(yourserver login user)"
keyPath     = "/home/user/.ssh/id_rsa(your rsa key path)"

prepareコマンドでターゲットサーバのセットアップ

◆vuls prepareコマンドにて設定ファイルの読み込み

ターゲットへのログインをrootとしていれば必要ないが、”prepare”もこの先の手順の”scan”もroot権限が必要となる。

prepareでは”yum-plugin-security”と”yum-plugin-changelog”がターゲットにインストール済みか確認し、インストールされていなければインストールを自動で実行しようとする。

普通はrootでのssh接続は許可していないと思うので、userでログインしsudoで実行出来るよう、”ask-sudo-password”オプションを追加し、sudoパスワードを与えてあげる。

$ vuls prepare -ask-sudo-password
sudo password: *************
INFO[0000] Start Preparing (config: /Users/user/vuls/config.toml)
[May 5 12:03:39] INFO [localhost] Detecting OS...
[May 5 12:03:40] INFO [localhost] (1/1) Successfully detected. zacodesign-net: centos 6.6
[May 5 12:03:40] INFO [localhost] Installing...
[May 5 12:03:40] INFO [zacodesign-net:1824] Ignored: yum-plugin-security already installed
[May 5 12:03:41] INFO [zacodesign-net:1824] Ignored: yum-plugin-changelog already installed
[May 5 12:03:41] INFO [localhost] Success

いよいよバルス!スキャン!実行

◆vuls scanコマンドにてスキャン実行
ここでもprepareで上述した通り、root権限が必要であるためsudoパスワードをオプションにて渡す。また、”-lang=ja”オプションにて脆弱性レポートが日本語になる。slack, emailは日本語対応済みでTUIは英語のみ。

$ vuls scan -ask-sudo-password -lang=ja
sudo password: ***********
INFO[0004] Start scanning (config: /Users/user/vuls/config.toml)
[May 5 13:15:47] INFO [localhost] Validating Config...
[May 5 13:15:47] INFO [localhost] Detecting the type of OS...
[May 5 13:15:47] INFO [localhost] (1/1) Successfully detected. server1: centos 6.6
[May 5 13:15:47] INFO [localhost] Scanning vulnerabilities...
[May 5 13:15:47] INFO [localhost] Check required packages for scanning...
[May 5 13:15:48] INFO [localhost] Scanning vulnerable OS packages...
[May 5 13:16:22] INFO [server1:22] (1/232) Scanned ImageMagick-6.5.4.7-7.el6_5 -> 6.7.2.7-2.el6 : [CVE-2015-0848 CVE-2015-4588 CVE-2015-4695 CVE-2015-4696]

~~
~~

[May  5 13:24:59]  INFO [server1:22] (232/232) Scanned zip-3.0-1.el6 -> 3.0-1.el6_7.1 : []
[May  5 13:24:59]  INFO [server1:22] Fetching CVE details...
[May  5 13:25:00]  INFO [server1:22] Done
[May  5 13:25:00]  INFO [localhost] Scanning vulnerable software specified in the CPE...
[May  5 13:25:00]  INFO [localhost] Reporting...

server1 (centos 6.6)
===========================
CVE-2015-1158	10.0	The add_job function in scheduler/ipp.c in cupsd in CUPS before 2.0.3 performs      
             	    	incorrect free operations for multiple-value job-originating-host-name attributes,  
             	    	which allows remote attackers to trigger data corruption for reference-counted      
             	    	strings via a crafted (1) IPP_CREATE_JOB or (2) IPP_PRINT_JOB request, as           
             	    	demonstrated by replacing the configuration file and consequently executing         
             	    	arbitrary code.                                                                    
CVE-2016-2324	10.0	Integer overflow in Git before 2.7.4 allows remote attackers to execute arbitrary   
             	    	code via a (1) long filename or (2) many nested trees, which triggers a heap-based  
             	    	buffer overflow.                                                                    
CVE-2016-0705	10.0	Double free vulnerability in the dsa_priv_decode function in crypto/dsa/dsa_ameth.c 
…
~~
~~
[May  5 13:25:00]  INFO [localhost] Insert to DB..

環境と脅威次第だが、3000行程度の結果が表示された…

スキャン結果の確認

◆vuls tuiコマンドにて結果確認
vimライクにhjklできるぞ。テストサーバでは139個の脅威が見つかったようだ。

$ vuls tui

Homeberg37

※TUIからはctrl+cで抜けられる

因みに結果は作成したvuls作業フォルダ直下にvuls.sqlite3として保存される。再度スキャンを実行すると見事に上書き保存されてしまうため、自分でアーカイブをとっておく。

※追記
過去のスキャン結果はsqlite3の中に残ってはいるが、(未実装で)TUIでは表示出来ない仕様とのこと。@kotakanabeさんありがとうございました。

$ ls
config.toml			cve.sqlite3			vuls.sqlite3
$ mv vuls.sqlite3 vuls_server1_20160505-1.sqlite3 

◆ターゲットサーバをyum updateしてから再度スキャン実行してみる

$ vuls scan -ask-sudo-password -lang=ja
sudo password: *************
INFO[0003] Start scanning (config: /Users/user/vuls/config.toml)
[May 5 15:13:48] INFO [localhost] Validating Config...
[May 5 15:13:48] INFO [localhost] Detecting the type of OS...
[May 5 15:13:50] INFO [localhost] (1/1) Successfully detected. server1: centos 6.7
[May 5 15:13:50] INFO [localhost] Scanning vulnerabilities...
[May 5 15:13:50] INFO [localhost] Check required packages for scanning...
[May 5 15:13:50] INFO [localhost] Scanning vulnerable OS packages...
[May 5 15:13:55] INFO [server1:22] Fetching CVE details...
[May 5 15:13:55] INFO [server1:22] Done
[May 5 15:13:55] INFO [localhost] Scanning vulnerable software specified in the CPE...
[May 5 15:13:55] INFO [localhost] Reporting...

server1 (centos 6.7)
===========================
No unsecure packages.

[May  5 15:13:55]  INFO [localhost] Insert to DB...

はれ、脅威はありませんだと。TUIでも結果を見てみる

$ vuls tui

Homeberg40

はれま、何もない。

因みにアーカイブした以前のスキャン結果を指定して開くには”-dbpath=”オプションでファイルを指定して開ける。

$ vuls tui -dbpath=vuls_server1_20160505-1.sqlite3

以上だ。

まとめ

とりあえずREADMEを参考にやってみたが、スキャン結果のアーカイブなど、もっと便利に設定できるはず。

そして、yum updateだけで脅威がゼロになるのは「あっけなすぎる」と思ってしまった。私なんぞは、Linuxを触り始めた段階からyumなんていいパッケージマネージャがあったから依存関係なんて考えたことがない”ゆとり”だが、本来大変な苦労があるのだろうな。

ZacoUshio

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link