Nmap を使用した脆弱性スキャン

NmapBeginner
オンラインで実践に進む

はじめに

この実験では、ネットワーク探索とセキュリティ監査のための強力なオープンソースツールである Nmap (Network Mapper) を使用したネットワークスキャンの基礎を学びます。基本的なポートスキャンから始め、サービスおよびバージョン検出へと進み、その後 Nmap Scripting Engine (NSE) を活用して脆弱性チェックを実行します。最後に、レポート作成のためにスキャン結果を分析し、さまざまな形式で保存する方法を学びます。この実験は、効果的なネットワークセキュリティ評価を行うための Nmap の主要機能について、ステップバイステップの実践的な入門編となります。

基本的なネットワークスキャンの実行

このステップでは、基本的なスキャンを実行して Nmap に慣れ親しみます。基本的なスキャンは、ターゲットマシン上でどのポートが開いているかを確認するために使用されます。ポートが開いているということは、Web サーバーや SSH などのサービスが実行されており、接続を待機していることを示します。

実験環境には、練習用に localhost(自身の仮想マシン)上でいくつかのサービスが事前に設定されています。nmap ツールは既にインストール済みです。

まず、Nmap がインストールされていることを確認し、バージョンをチェックします。ターミナルを開き、次のコマンドを実行してください。

nmap --version

以下のように、Nmap のバージョンを確認する出力が表示されるはずです。

Nmap version 7.80 ( https://nmap.org )
Platform: x86_64-pc-linux-gnu
Compiled with: liblua-5.3.3 openssl-1.1.1f libssh2-1.8.0 libz-1.2.11 libpcre-8.39 nmap-libpcap-1.9.1
Compiled without:
Available nsock engines: epoll poll select

次に、localhost に対して最初のスキャンを実行します。このコマンドは、ローカルマシン上で最も一般的なオープンポートをチェックするよう Nmap に指示します。

nmap localhost

出力を確認してください。Nmap は、開いていると判断したポートを、その状態およびポートに関連付けられた一般的なサービスとともにリストアップします。出力は以下のようになり、この実験のために準備されたサービスが表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000092s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
2121/tcp open  ccproxy-ftp
2222/tcp open  EtherNetIP-1
3001/tcp open  nessus
8080/tcp open  http-proxy

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

この初期スキャンにより、実行中のサービスのマップが得られます。これは、あらゆるネットワークセキュリティ評価における最初のステップです。

サービスバージョンの検出

このステップでは、Nmap を使用してサービスおよびバージョンの検出を行います。どのポートが開いているかを知ることも有用ですが、セキュリティアナリストにとっては、それらのポートで実行されている正確なソフトウェアとバージョンを知ることはさらに強力な情報となります。古いソフトウェアは、脆弱性の主な原因です。

ここでは -sV フラグを使用します。これは、開いているポートを調査して詳細なサービスおよびバージョン情報を特定するよう Nmap に指示するものです。

localhost に対してバージョン検出スキャンを実行します。スキャンを効率的に行うため、すべてのポートをスキャンするのではなく、この例で使用されている特定のポートをターゲットにします。

nmap -sV -p 22,8080 localhost

ヒント: 特定のポートをターゲットにすることで、スキャン時間を大幅に短縮できます。-sV を使用した全ポート範囲のスキャンには数分かかる場合がありますが、このターゲットを絞ったアプローチであれば通常数秒で完了します。

出力をステップ 1 の基本スキャンと比較してください。各ポートで実行されているソフトウェアの詳細を提供する VERSION 列が追加されていることがわかります。

出力は以下のように、より詳細なものになります。

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00011s latency).
Not shown: 995 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.13 (Ubuntu Linux; protocol 2.0)
8080/tcp open  http    nginx 1.18.0 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

この情報は非常に重要です。例えば、スキャンによって既知の重大な脆弱性を持つ古いバージョンの nginx が明らかになった場合、どこに修復作業を集中させるべきかが正確にわかります。

Nmap Scripting Engine (NSE) の使用

このステップでは、Nmap の最も強力な機能の一つである Nmap Scripting Engine (NSE) を使用します。これにより、スクリプトライブラリを使用して、さまざまなネットワークタスクを自動化できます。これらのスクリプトは、より高度な探索、脆弱性検出、さらにはエクスプロイト(攻撃)にも使用できます。

ここでは -sC フラグを使用します。これは、安全かつ探索に有用と見なされる一連のデフォルトスクリプトを実行するものです。この実験の FTP サービスは標準外のポート 2121 で実行されているため、-sC とサービス検出 (-sV) を組み合わせることで、Nmap がサービスを特定してから適切なスクリプトを選択できるようにします。

サービス検出とデフォルトスクリプトを有効にして、localhost に対して Nmap スキャンを実行します。ポート 21218080 をターゲットにすることで、スキャンを迅速に保ちつつ、FTP および Web サービスからのスクリプト出力を表示させます。

nmap -sV -sC -p 2121,8080 localhost

出力を確認してください。各ポートの下にインデントされた追加情報が表示されます。これが NSE スクリプトの出力です。例えば、ftp-anon スクリプトはポート 2121 で匿名 FTP ログインが許可されていることを報告し、http-title スクリプトはポート 8080 の Web ページのタイトルを取得し、SSL スクリプトは証明書の詳細を報告する可能性があります。

出力はさらに詳細になります。

Starting Nmap 7.80 ( https://nmap.org ) at ...
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000099s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 995 closed ports
PORT     STATE SERVICE VERSION
2121/tcp open  ftp     vsftpd 3.0.5
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst:
|   STAT:
| FTP server status:
|      Logged in as ftp
|_End of status
8080/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-server-header: nginx/1.18.0 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Unix

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

ご覧の通り、デフォルトスクリプトによって、ポート 2121 で匿名 FTP ログインが許可されていることが発見され、ポート 8080 の Web ページのタイトルが取得されました。これは自動的に収集された貴重なインテリジェンスです。

脆弱性スキャンの実行

このステップでは、NSE スクリプトを使用して脆弱性を探索します。NSE には、既知のセキュリティ上の欠陥をチェックするために特別に設計されたスクリプトのカテゴリが含まれています。vuln カテゴリ内のすべてのスクリプトを実行して、広範な脆弱性スキャンを行うことができます。

長時間かかるスキャンや重要なスキャンの出力は、常にファイルに保存するのがベストプラクティスです。-oN フラグを使用して、Nmap の標準形式で出力を保存します。

まず、これまでに学んだことを組み合わせます。サービス検出 (-sV) を含め、すべての脆弱性スクリプト (--script vuln) を実行するスキャンを実行します。出力を vuln_scan.txt という名前のファイルに保存します。

nmap -sV --script vuln -oN vuln_scan.txt localhost

このスキャンは、開いている各ポートに対して多くのスクリプトを実行するため、数分かかる場合があります。

スキャンが完了すると、現在のディレクトリ (/home/labex/project) に vuln_scan.txt という名前のファイルが作成されます。cat コマンドを使用してその内容を表示できます。

cat vuln_scan.txt

出力ファイルは長いため、キーワードで検索する方が効率的です。grep を使用して、脆弱性を示す行を探します。「VULNERABLE」という用語は強力な指標です。

grep "VULNERABLE" vuln_scan.txt

発見された脆弱性を示す出力が表示されるはずです。この実験環境では、Apache の byterange フィルターに関連する脆弱性が表示される可能性が高いです。

|   VULNERABLE:
|     State: VULNERABLE

脆弱性の詳細をすべて確認するには、特定の CVE を検索するか、スキャン結果全体を確認してください。例えば、ポート 8080 で Apache の DoS 脆弱性 (CVE-2011-3192) が見つかるかもしれません。また、いくつかのスクリプトエラー(clamav-exec: ERROR など)が表示されることがありますが、これらは正常であり無視して構いません。これらは、特定の脆弱性スクリプトが実験環境で適切に実行できない場合に発生します。

このステップでは、単純な探索からターゲットを絞ったセキュリティ監査へと移行し、弱点を積極的に調査する方法を実演しました。

スキャン結果の保存とフォーマット

このステップでは、結果を複数の形式で保存し、ユーザーフレンドリーな HTML レポートを作成する方法を学びます。調査結果を適切に文書化して報告することは、セキュリティ専門家にとって不可欠なスキルです。Nmap は、さまざまな目的に適した複数の出力形式をサポートしています。

まず、レポートを整理しておくための専用ディレクトリを作成します。

mkdir -p ~/project/reports

次に、スキャンを再度実行しますが、今回は標準テキスト (-oN) と XML (-oX) の 2 つの形式で同時に出力を保存します。XML は構造化された形式であり、他のツールで処理するのに最適です。

nmap -sV -p 8080 --script vuln -oN ~/project/reports/scan_report.txt -oX ~/project/reports/scan_report.xml localhost

XML 形式は人間が読むにはあまり適していません。Nmap は、XML ファイルをクリーンな HTML レポートに変換するための xsltproc というユーティリティを提供しています。次のコマンドを実行して scan_report.html を生成します。

xsltproc ~/project/reports/scan_report.xml -o ~/project/reports/scan_report.html

すべてのレポートファイルが ~/project/reports ディレクトリに作成されたことを確認します。ls -l コマンドを使用して、ファイルとその詳細をリスト表示します。

ls -l ~/project/reports

3 つのレポートファイルが表示されるはずです。

total 40
-rw-rw-r-- 1 labex labex 14276 Aug 28 15:12 scan_report.html
-rw-rw-r-- 1 labex labex  5686 Aug 28 15:11 scan_report.txt
-rw-rw-r-- 1 labex labex 14924 Aug 28 15:11 scan_report.xml

これで、素早く確認するためのプレーンテキストファイル、機械処理用の XML ファイル、そして共有やプレゼンテーションが容易な HTML ファイルが揃いました。

まとめ

この実験では、サイバーセキュリティにおける基本的なツールである Nmap の実践的な経験を積みました。ネットワークホスト上の開いているサービスを特定するための基本的なポートスキャンから始め、特定のソフトウェアとそのバージョンを特定するためのサービスバージョン検出 (-sV) を含む、より高度な手法へと進みました。また、デフォルトスクリプト (-sC) や完全な脆弱性スキャン (--script vuln) を実行することで、Nmap Scripting Engine (NSE) の威力を探求しました。最後に、スキャン結果を複数の形式 (-oN, -oX) で保存し、分析や文書化のために読み取り可能な HTML レポートに変換するという専門的な手法を学びました。これらのスキルは、実世界のネットワークセキュリティ評価で Nmap を使用するための強固な基盤となります。