Nmap による脆弱性スキャン

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

はじめに

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

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

最初のステップでは、基本的なスキャンを実行して Nmap に慣れていきましょう。基本的なスキャンは、ターゲットマシン上でどのポートが開いているかを確認するために使用されます。ポートが「オープン(開いている)」状態であることは、Web サーバーや SSH などのサービスが実行されており、接続を待ち受けていることを意味します。

この実験環境では、練習用に localhost(あなた自身の仮想マシン)上でいくつかのサービスが動作するようにあらかじめ設定されています。nmap ツールもインストール済みです。

  1. まず、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
    
  2. 次に、localhost に対して最初のスキャンを実行します。このコマンドは、ローカルマシン上で最も一般的なポートが開いているかどうかをチェックするよう Nmap に指示します。

    nmap localhost
    
  3. 出力を確認します。Nmap は、見つかったオープンポートの一覧を、その状態(STATE)およびそのポートに関連付けられた一般的なサービス名(SERVICE)とともに表示します。出力は、この実験用に用意されたサービスを示す次のような内容になります。

    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 に指示するものです。

  1. localhost に対してバージョン検出スキャンを実行します。スキャンをより効率的に行うために、すべてのポートをスキャンするのではなく、ステップ 1 で発見した特定のポート(22, 2121, 2222, 3001, 8080)をターゲットにします。

    nmap -sV -p 22,8080 localhost
    

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

  2. ステップ 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 スクリプトエンジン(NSE)の活用

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

このステップでは、探索に安全かつ有用とされるデフォルトのスクリプトセットを実行する -sC フラグを使用します。

  1. localhost に対してデフォルトスクリプトを有効にした Nmap スキャンを実行します。-sC フラグは、個別のスクリプトを指定することなく、より多くの情報を取得するための便利な方法です。

    nmap -sC localhost
    
  2. 出力を確認します。各ポートの下にインデントされた追加情報が表示されます。これが NSE スクリプトからの出力です。例えば、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
    22/tcp   open  ssh
    2121/tcp open  ccproxy-ftp
    2222/tcp open  EtherNetIP-1
    3001/tcp open  nessus
    | ssl-cert: Subject: commonName=localhost
    | Subject Alternative Name: DNS:localhost
    | Not valid before: 2024-07-18T03:37:05
    |_Not valid after:  2034-07-16T03:37:05
    8080/tcp open  http-proxy
    |_http-open-proxy: Proxy might be redirecting requests
    |_http-title: Site doesn't have a title (text/html).
    
    Nmap done: 1 IP address (1 host up) scanned in 0.62 seconds
    

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

脆弱性スキャンの実行

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

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

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

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

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

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

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

    grep "VULNERABLE" vuln_scan.txt
    

    見つかった脆弱性を示す出力が表示されるはずです。この実験環境では、Apache の byterange フィルタに関連する脆弱性が表示される可能性があります。

    |   VULNERABLE:
    |     State: VULNERABLE
    

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

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

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

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

  1. まず、レポートを整理して保管するための専用ディレクトリを作成します。

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

    nmap -sV -p 8080 --script vuln -oN ~/project/reports/scan_report.txt -oX ~/project/reports/scan_report.xml localhost
    
  3. XML 形式は人間にとってあまり読みやすいものではありません。Nmap は、XML ファイルをクリーンな HTML レポートに変換するための xsltproc というユーティリティを提供しています。次のコマンドを実行して scan_report.html を生成します。

    xsltproc ~/project/reports/scan_report.xml -o ~/project/reports/scan_report.html
    
  4. すべてのレポートファイルが ~/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 スクリプトエンジン(NSE)の強力な機能を探索しました。最後に、スキャン結果を複数の形式(-oN, -oX)で保存し、分析や文書化のために読みやすい HTML レポートに変換するというプロフェッショナルな手法を学びました。これらのスキルは、現実世界のネットワークセキュリティ評価で Nmap を活用するための強固な基盤となります。