はじめに
この実験では、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 ターミナルでバナーの詳細を確認して比較します。



