脆弱性スキャン入門の入門

Published: 2016年6月17日 by tomsato

概要

自分が持っているサーバに対して無料でセキュリティチェック(脆弱性診断)を行います

脆弱性について初期知識を学びつつ、実際にポートスキャンや脆弱性スキャンを行って自分のサーバは問題ないのかチェックまでしてみたいと思います

最近では、セキュリティ専門家の有志が脆弱性診断を実施する技術者を「脆弱性診断士」として必要なスキルを明文化する取り組みが行われていて将来的には資格化も目指しているらしいです

ちなみにJPCERTで脆弱性に関する情報をWebサイトで公開しているので定期的に確認するといいかもしれません

お願い・注意

自身の管理下にないネットワークおよびコンピュータに脆弱性診断や擬似攻撃を行った場合は法的処置をとられる可能性もあるので絶対にやらないようにしてください

このページに記述する内容は自身で管理している環境で検証を行ってください

脆弱性について

脆弱性(ぜいじゃくせい)とは、プログラムのバグなどによって引き起こされる情報セキュリティ上の欠陥のこと

脆弱性が発見されるとソフトウェアを開発した人が脆弱性に対しての修正プログラムを作成して提供するのでサーバ運用担当者はソフトウェアのアップデートを行う必要がある

こうした脆弱性対応は必須ではないが(会社などの組織の方針によっては対応が必須の所があり)対応しない場合、最悪不正アクセスが行われたり、ウイルスに感染したりすることが挙げられる

脆弱性に対して完全な対策を行うことは不可能に近いので脆弱性に関する報告があった場合に都度対応していくのが理想である

脆弱性診断とは

脆弱性診断とはシステムやアプリケーションに対して、どこにどのような脆弱性があるのかを調査することを言う
診断に使うツールはセキュリティベンダがサービスとして提供している

脆弱性診断には複数の種類がある

  1. プラットフォーム診断
    • OSやミドルウェアに存在する脆弱性を確認
  2. Webアプリケーション診断
    • Webアプリケーションに隠されている脆弱性の確認
  3. ペネトレーションテスト
    • システム全体を対象に実際の攻撃手法を用いてどこまで侵入できるかを確認
    • 1と2を組み合わせる
  4. ソースコード診断
    • ソースコード上に隠されている脆弱性を確認

脆弱性診断の手法について

  1. ブラックボックステスト
    • 診断対象のシステムに対して擬似攻撃を行ってどうなるのかを分析して脆弱性を洗い出す
  2. ホワイトボックステスト
    • 設定ファイルやソースコードなどを分析して脆弱性を洗い出す
    • 情報漏洩しないか、ユーザからの入力データ・チェックが行われているかなど

これらについてツールを使いつつ、網羅できないところはエンジニアが確認しながら脆弱性のチェックをやっていくことになる

脆弱性診断のはじめ

まずはOSやミドルウェアのどこに問題があるのかを把握するところからはじめる

以下の2つの観点で、問題点を洗い出してみる

  1. ポートスキャン
    • どのサービスが稼働しているのかを調べる
  2. 脆弱性スキャン
    • 稼働しているサービスのセキュリティチェック

攻撃者が対象のホストに攻撃を行う場合に事前の準備としてポートスキャンと呼ばれる調査を行う、これは「外部から対象サーバへアクセスが可能か?」「脆弱性のあるサービスが動いていないか」を調べる作業

例えば80番が開いていればhttpサービスが動いている、110番ならばPOP3のメール受信サーバが稼働しているなどがわかる、攻撃者はポートスキャンを悪用してアクティブになっているポートを見つけ、それが既知の脆弱性を持つサービスであればその脆弱性をつついて攻撃を行ってくる

従って自分の環境を守るにはまずはポートスキャンによってどのサービスが稼働しているかを調べて、稼働しているサービスがどのような脆弱性を持っているのかを調べる必要がある

ポートスキャンをする

実際にポートスキャンを行う

検証環境について

  • CentOS 6系で行う
  • ポートスキャンツールにはnmapを使う

nmpaを使うためのインストール

$ sudo yum install nmap

ローカル環境に対してポートスキャンを行う

$ sudo nmap 127.0.0.1
Starting Nmap 5.51 ( http://nmap.org ) at 2016-06-11 22:23 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
3306/tcp open  mysql

Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds

22(ssh), 80(http), 3306(mysql)が立ち上がっていることがわかる

「-A」オプションでOSやバージョンを検知できるなら表示する

$ sudo nmap -A 127.0.0.1 | grep '/tcp'
22/tcp   open  ssh     OpenSSH 5.3 (protocol 2.0)
80/tcp   open  http    Apache httpd 2.2.15 ((CentOS))
3306/tcp open  mysql   MySQL 5.6.29

ポートスキャンはTCPとUDPでのスキャンがあったりでnmapのオプション色々あるが今回は略

このnmapの情報を元に不要なサービスは閉じて無駄な脆弱性を無くすように努めることになる

脆弱性スキャンをする

OpenVASを使って脆弱性スキャンを行う

OpenVASはオープンソースの脆弱性スキャナで、診断対象にインストールされているソフトウェアやそれらの設定・構成に脆弱性があるかどうかを調べる
OpenVASでは脆弱性に関する情報とそのテスト設定をNVTという単位で管理している、NVTは日々更新されていてOpenVASを通して配信されるので最新の脆弱性にも対応しやすい

// CentOSの標準リポジトリにはopenvasがないのでAtomicorp Repositoryというリポジトリを参照する
$ sudo bash -c " wget -q -O - http://www.atomicorp.com/installers/atomic | sh"
// OpenVASインストール
$ sudo yum -y install openvas

// redisをインストールする
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum --enablerepo=remi -y install redis

// redisの設定変更
$ sudo vim /etc/redis.conf
# 下記2行のコメントアウトを解除
unixsocket /tmp/redis.sock
unixsocketperm 700

$ sudo /etc/init.d/redis start
$ sudo chkconfig redis on

// bzip2も入れておく
$ sudo yum install bzip2

初期設定を行う

// エラーにならないように以下の設定を行う
$ sudo vim /usr/sbin/openvas-scapdata-sync
SPLIT_PART_SIZE=0
↓
SPLIT_PART_SIZE=10000

// 脆弱性定義DBの構築と定義のダウンロードが開始される
$ sudo openvas-setup
... 環境にもよると思うが完了まで2~3時間かかる ...

... 以下WebUIで利用するための入力項目 ...
# 全てのIPからの接続を許可
Allow connections from any IP? [Default: yes]
# Web UI で使用する管理者アカウント名の設定
Enter administrator username [Default: admin] :
# Web UI で使用する管理者アカウントのパスワード設定
Enter Administrator Password:
Verify Administrator Password:

ちなみにopenvas-scapdata-syncのファイルを書き換えなかった場合、以下のエラーが出た

....
/usr/sbin/openvas-scapdata-sync: line 1063:  6948 強制終了            xsltproc --stringparam refdate $CVE_REFDATE $SCAP_RES_DIR/cpe_youngerthan.xsl -
-:1: parser error : Document is empty
unable to parse -
[e] Update of CPEs failed: xsltproc exited with code 137

メモリが足りないのかファイルが大きすぎるのかわからないがSPLIT_PART_SIZEで1000kごとにファイルを分割する設定を入れることでこのエラーは出なくなる

その他openvasを使うためのコマンドを実施していく

// クライアント証明書(?)を作成する
$ sudo openvas-mkcert-client -n -i
$ ls -l /var/lib/openvas/CA/clientcert.pem
-rw-------. 1 root root 8058 Jun 13 19:19 /var/lib/openvas/CA/clientcert.pem

// ユーザー作成 (ユーザ、パスは各自変更する)
$ sudo bash -c "openvasmd --create-user=tomsato --role=Admin && openvasmd --user=tomsato --new-password=tomsato"

// scannerの再起動
$ sudo service openvas-scanner stop
$ sudo service openvas-scanner start

// rebuild (managerをstopした状態で実施する)
$ sudo service openvas-manager stop
$ sudo openvasmd --rebuild
$ sudo service openvas-manager start

// openvas-managerが変な感じにLISTENしてるので一回killする
$ sudo netstat -anp | grep 93
tcp        0      0 0.0.0.0:9391                0.0.0.0:*                   LISTEN      2193/openvassd
tcp        0      0 0.0.0.0:9392                0.0.0.0:*                   LISTEN      2243/gsad
tcp        0      0 :::9390                     :::*                        LISTEN      2215/openvasmd
unix  3      [ ]         STREAM     CONNECTED     938654 257/sshd
unix  3      [ ]         STREAM     CONNECTED     938653 259/sshd

// netstatの出力の右のほうに出ているopenvasmdのプロセス番号を指定してkillする
$ sudo kill -term 2215
$ sudo openvasmd -p 9390 -a 0.0.0.0

// GSA(Greebone Security Assistant)の再起動
$ sudo service gsad restart

ここまでの設定などが問題ないかcheckスクリプトを実行する

$ sudo sh openvas-check-setup

以下のように出ればセットアップに成功している
It seems like your OpenVAS-8 installation is OK.

エラーが出た場合はFIX: と表示されている部分の指示に従ってコマンドを実施する

完了したらhttps://:9392にアクセスする
openvas01
ログインをすると以下の画面が出るはず
openvas02
とりあえず実行してみたいので女性右側にある「Immediately scan」を実行する

Immediately scanとはIPやホストを指定して脆弱性スキャンを実施するシンプルな機能、UDPに対する脆弱性スキャンは行わずにあらかじめ登録されたTCPの4481ポート分のスキャンになる

カスタマイズは可能なので興味があれば試してみてください

「localhost」と入力して「Start Scan」、画面上部に進行率が出ているのがわかる
openvas03
完了したら「Immediate scan of IP localhost」をクリック、結果が見れる
openvas04
「Results」をクリックしてスキャン結果を見る、検出された脆弱性一覧が表示されている
openvas05
「Severity」は重大度みたい
「Vulnerability」の項目をクリックすると詳細が見れるので試しにSeverityがHighになっているものを見てみる
openvas06
MySQLのパスワードが空…
こんな感じで気になるサーバで試してみてください

参考

コメントを書く

※ 個別に返信が必要な時のみご記入ください

※ Emailは公開されません

※ 承認されると名前・コメントが下記に表示されます

コメント一覧

最近の投稿

ビジュアルリグレッションテストについてまとめ、ネットで調べると数多くのライブラリがありどれがどんな立ち位置なのか全体像がわかりずらかったのでどんな種類があるのか入門の入門としてまとめます、またPlaywrightを使って実際に触ってみました

社内ツールなどの超小規模なAPIをGolangで実装する際にフレームワークを使うべきかを、実際にnet/httpを使った実装とフレームワークを使った実装を比較することでどれだけ優位性があるかを見ていきたいと思います。今回はフレームワークにはシンプルで使いやすそうなEchoを使うことにします。

vue-pdfを使ってNuxt.jsで作成しているアプリケーションに pdfスライドを表示させるサンプルを作成しました README.md通りに実装してもうまくいかないところがあったのでそのあたり含めてまとめます

Vue.js / Nuxt.jsにおけるログインの実装方法をまとめる Auth0やNuxt.jsのAuth Moduleとmiddlewareについて調べつつサンプルを作成することで理解を深める

コンポーネント設計について考える Atomic DesignやPresentational Component, Container Componentについてまとめつつ 自分だったらVue.js / Nuxt.jsでどういうコンポーネント設計にするかについてまとめます

カテゴリ一覧

タグ一覧