Nmap でサービスバナーを検出する

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

はじめに

この実験では、Nmap を使ってサービスのバナーを検出する方法を学びます。主な目的は、対象マシンで稼働しているネットワークサービスに関する情報を収集することで、サービス名、バージョン、オペレーティングシステムなどを把握することです。対象 IP でバナースクリプトを実行し、特定のポートをスキャンし、スキャンに詳細度を追加し、結果を保存し、Xfce 端末でバナーを確認して比較します。

まず、nmap --script banner コマンドを使って対象のすべての既定ポートをスキャンします。次に、特定のポートをスキャンし、より詳細な出力のために詳細度を増やし、結果をファイルに保存し、最後に対象で稼働しているサービスを理解するためにバナーを分析します。

nmap --script banner 192.168.1.1 でバナー スクリプトを実行する

このステップでは、Nmap のバナーグラビングスクリプトを使って、対象マシンで稼働しているサービスを特定します。バナーグラビングは、接続が確立されたときに送信されるバナーを調べることで、ネットワークサービスに関する情報を収集するために使用される技術です。このバナーには、サービス名、バージョン、オペレーティングシステムなどの詳細が含まれることが多いです。

まず、使用するコマンドを理解しましょう。

nmap --script banner 192.168.1.1

  • nmap:これはコマンドラインネットワークスキャナです。
  • --script banner:このオプションは、Nmap に対象のオープンポートからバナーを取得するように指示する banner スクリプトを使用するように伝えます。
  • 192.168.1.1:これは対象の IP アドレスです。これを、スキャンする許可があるネットワーク上のマシンの実際の IP アドレスに置き換える必要があります。この実験環境では、対象として 127.0.0.1(localhost)を使用します。これにより、自分自身のマシンをスキャンし、潜在的な倫理的または法的な問題を回避できます。

では、コマンドを実行しましょう。Xfce 端末を開き、次のコマンドを入力します。

nmap --script banner 127.0.0.1

このコマンドは、127.0.0.1 のすべての既定ポートをスキャンし、オープンなサービスからバナーを取得しようとします。

次のような出力が表示されるかもしれません(正確な出力は、マシン上で稼働しているサービスによって異なります)。

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_

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

この例では、Nmap はポート 22 で稼働している SSH サービスを検出しました。バナーから、Ubuntu 上で稼働している OpenSSH バージョン 8.2p1 であることがわかります。

マシン上にサービスが稼働していない場合、バナー情報が表示されない場合があります。心配しないでください、コマンドはまだ機能しています。後のステップでは、サービスを構成して、キャプチャするバナーがあるようにします。

nmap --script banner -p 22,80 127.0.0.1 で特定のポートをスキャンする

前のステップでは、バナースクリプトを使ってすべての既定ポートをスキャンしました。今回は、特定のポートをスキャンすることに焦点を当てます。これは、興味のあるサービスを知っている場合や、スキャン時間を短縮したい場合に便利です。

使用するコマンドは以下の通りです。

nmap --script banner -p 22,80 127.0.0.1

コマンドを分解してみましょう。

  • nmap:ネットワークスキャナ
  • --script banner:バナーグラビングスクリプトを指定します。
  • -p 22,80:このオプションは、Nmap に対してポート 22 と 80 のみをスキャンするように指示します。ポート 22 は一般的に SSH(セキュアシェル)に使用され、ポート 80 は一般的に HTTP(ウェブサーバー)に使用されます。
  • 127.0.0.1:対象の IP アドレス(localhost)

コマンドを実行する前に、これらのポートでサービスが稼働していることを確認しましょう。LabEx VM は既定でポート 22 で SSH が稼働しているはずです。ポート 80 に簡単なウェブサーバーをインストールします。

Xfce 端末を開き、Python を使って基本的な HTTP サーバーをインストールするために以下のコマンドを実行します。

sudo apt update
sudo apt install -y python3-pip
sudo python3 -m pip install http.server

次に、ポート 80 で HTTP サーバーを起動します。まず ~/project ディレクトリに移動します。

cd ~/project
python3 -m http.server 80

この端末ウィンドウを開いたままで HTTP サーバーを実行しておきます。Nmap スキャンを続けるために新しい Xfce 端末ウィンドウを開きます。

次に、新しい端末ウィンドウで Nmap コマンドを実行します。

nmap --script banner -p 22,80 127.0.0.1

以下のような出力が表示されるはずです。

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:05 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

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

この出力は、Nmap がポート 22 と 80 をスキャンし、バナーを取得し、サービス情報を表示したことを示しています。SSH バナーと SimpleHTTP サーバーのバナーが見えます。

このステップが終わったら、実行中の端末で Ctrl+C を押すことで Python の HTTP サーバーを停止してください。

nmap -v --script banner 192.168.1.1 で冗長モードを追加する

このステップでは、Nmap スキャンに詳細情報を表示する機能を追加します。詳細情報を表示することで、スキャンプロセスに関するより詳細な情報が得られ、トラブルシューティングや Nmap が裏で何をしているかを理解するのに役立ちます。

使用するコマンドは以下の通りです。

nmap -v --script banner 127.0.0.1

コマンドを分解してみましょう。

  • nmap:ネットワークスキャナ
  • -v:このオプションは詳細情報のレベルを上げます。さらに詳細な情報を表示したい場合は -vv を使用します。
  • --script banner:バナーグラビングスクリプトを指定します。
  • 127.0.0.1:対象の IP アドレス(localhost)

コマンドを実行する前に、前のステップで起動した Python の HTTP サーバーがまだ稼働していることを確認してください。稼働していない場合は、別の端末ウィンドウで再度起動します。

cd ~/project
python3 -m http.server 80

次に、新しい端末ウィンドウで詳細情報を表示しながら Nmap コマンドを実行します。

nmap -v --script banner 127.0.0.1

以下のような出力が表示されるはずです(正確な出力は、マシン上で稼働しているサービスによって異なります)。

Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-27 10:10 UTC
Initiating Ping Scan at 10:10
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 10:10, 0.00s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 10:10
Completed Parallel DNS resolution of 1 host. at 10:10, 0.00s elapsed
Initiating Connect Scan at 10:10
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 22/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Completed Connect Scan at 10:10, 0.00s elapsed (1000 total ports)
Initiating Service scan at 10:10
Scanning 2 services on localhost (127.0.0.1)
Completed Service scan at 10:10, 0.01s elapsed (2 services total)
Initiating NSE script scan at 10:10
Scanning localhost (127.0.0.1)
Completed NSE script scan at 10:10, 0.09s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

-v オプションによって提供される追加情報に注目してください。Ping スキャン、DNS 解決、Connect スキャンなど、スキャンのさまざまな段階が見えます。これは、Nmap がどのように機能するかを理解したり、問題の診断に役立つ非常に便利な情報になります。

このステップが終わったら、実行中の端末で Ctrl+C を押すことで Python の HTTP サーバーを停止してください。

nmap --script banner -oN banners.txt 127.0.0.1 でバナーの結果を保存する

このステップでは、Nmap スキャンの結果をファイルに保存します。これは、後で分析するためやレポート作成に役立ちます。

使用するコマンドは以下の通りです。

nmap --script banner -oN banners.txt 127.0.0.1

コマンドを分解してみましょう。

  • nmap:ネットワークスキャナ
  • --script banner:バナーグラビングスクリプトを指定します。
  • -oN banners.txt:このオプションは、Nmap に対して結果を「通常」の形式で banners.txt という名前のファイルに保存するよう指示します。他の出力形式もあります(たとえば、Grepable 出力用の -oG、XML 出力用の -oX)が、-oN は人が読みやすい形式です。
  • 127.0.0.1:対象の IP アドレス(localhost)

コマンドを実行する前に、前のステップで起動した Python の HTTP サーバーがまだ稼働していることを確認してください。稼働していない場合は、別の端末ウィンドウで再度起動します。

cd ~/project
python3 -m http.server 80

次に、新しい端末ウィンドウで Nmap コマンドを実行して結果をファイルに保存します。

nmap --script banner -oN banners.txt 127.0.0.1

今回は、スキャン結果が端末に表示されることはありません。代わりに、Nmap は出力を現在のディレクトリ(~/project)の banners.txt ファイルに保存します。

ファイルが作成され、スキャン結果が含まれていることを確認するには、cat コマンドを使用できます。

cat banners.txt

端末には以下のような出力が表示されるはずです。

## Nmap 7.80 scan initiated Fri Oct 27 10:15:00 2023
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

## Nmap done at Fri Oct 27 10:15:00 2023 -- 1 IP address (1 host up) scanned in 0.10 seconds

これにより、スキャン結果が banners.txt ファイルに保存されたことが確認できます。

このステップが終わったら、実行中の端末で Ctrl+C を押すことで Python の HTTP サーバーを停止してください。

Xfce 端末でバナーの詳細を確認する

このステップでは、前のステップで banners.txt ファイルに保存したバナーの詳細を確認します。Xfce ターミナルを使ってファイルの内容を表示し、そこに含まれる情報を理解します。

まず、~/project ディレクトリに banners.txt ファイルがあることを確認してください。前のステップを完了していない場合は、進む前に行ってください。

banners.txt ファイルの内容を表示するには、ターミナルウィンドウを開き、cat コマンドを使います。

cat banners.txt

出力には、次のようなファイルの内容が表示されます。

## Nmap 7.80 scan initiated Fri Oct 27 10:20:00 2023
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000072s latency).
Other addresses for localhost (alias(es)): localhost

PORT   STATE SERVICE
22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_
80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

## Nmap done at Fri Oct 27 10:20:00 2023 -- 1 IP address (1 host up) scanned in 0.10 seconds

出力を分析してみましょう。

  • Nmap scan report for localhost (127.0.0.1):これは、localhost(127.0.0.1)でスキャンが行われたことを示しています。
  • Host is up:これは、対象のホストに到達可能であることを確認しています。
  • PORT STATE SERVICE:このセクションは、対象のホスト上の開いているポートに関する情報を提供しています。
  • 22/tcp open ssh:これは、ポート 22 が開いており、SSH サービスが実行されていることを示しています。
  • | banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5:これは、SSH サービスのバナー情報です。SSH のバージョンとオペレーティングシステムがわかります。
  • 80/tcp open http:これは、ポート 80 が開いており、HTTP サービスが実行されていることを示しています。
  • | banner: Server: SimpleHTTP/3.10 Python/3.10:これは、HTTP サービスのバナー情報です。サーバソフトウェアとバージョンがわかります。

バナーの詳細を確認することで、対象のホスト上で実行されているサービスに関する貴重な情報を得ることができます。この情報は、脆弱性分析や潜在的なセキュリティリスクの特定に利用できます。

このステップが終わったら、実行中の端末で Ctrl+C を押すことで Python の HTTP サーバーを停止してください。

Xfce 端末でポート間のバナーを比較する

このステップでは、異なるポートから取得したバナー情報を比較します。これにより、それらのポートで実行されているサービスを特定し、そのバージョンを理解することができます。Xfce ターミナルと grep コマンドを使って、banners.txt ファイルからバナー情報を抽出して比較します。

まず、~/project ディレクトリに banners.txt ファイルがあることを確認してください。このファイルには、前のステップの Nmap スキャン結果が含まれています。

ポート 22(SSH)のバナー情報を抽出するには、次のコマンドを使用します。

grep "22/tcp" banners.txt

これにより、ポート 22 に関する情報を含む行が出力され、バナーも含まれます。

22/tcp open  ssh
| banner: SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5
|_

同様に、ポート 80(HTTP)のバナー情報を抽出するには、次のコマンドを使用します。

grep "80/tcp" banners.txt

これにより、ポート 80 に関する情報を含む行が出力され、バナーも含まれます。

80/tcp open  http
| banner: Server: SimpleHTTP/3.10 Python/3.10
|_

次に、バナー情報を比較してみましょう。次のことがわかります。

  • ポート 22 は SSH を実行しており、バナーからは Ubuntu 上の OpenSSH バージョン 8.2p1 であることがわかります。
  • ポート 80 は HTTP を実行しており、バナーからは Python 3.10 で実装された SimpleHTTP サーバーであることがわかります。

バナー情報を比較することで、これらのポートで実行されているサービスとそのバージョンを迅速に特定することができます。この情報は、セキュリティ評価や脆弱性分析にとって貴重です。たとえば、SSH や HTTP サーバーの特定のバージョンを知ることで、それらのバージョンに関連する既知の脆弱性を調べることができます。

この単純な例では、2 つのポートのみを比較しました。ただし、この手法を拡張して、多くの異なるポートやホスト間のバナーを比較することで、環境で実行されているネットワークサービスを包括的に理解することができます。

このステップが終わったら、実行中の端末で Ctrl+C を押すことで Python の HTTP サーバーを停止してください。

まとめ

この実験では、参加者は Nmap を使ってサービスのバナーを検出する方法を学びます。まず、倫理的および法的な問題を避けるために 127.0.0.1 を対象 IP として nmap --script banner でバナー スクリプトを実行します。また、特定のポートをスキャンし、スキャンに詳細度を追加し、結果をファイルに保存する方法も学びます。最後に、Xfce ターミナルでバナーの詳細を確認して比較します。