Nmap を使ったネットワークスキャンの基本を学ぶ

CybersecurityCybersecurityBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Nmap を使用したネットワークスキャンの基本を学びます。Nmap は、ネットワーク管理者やセキュリティ専門家に広く使用されている強力で多機能なツールです。これは、ネットワークの探索とセキュリティ監査のためのオープンソースユーティリティで、ネットワークをスキャンしてホストやサービスを見つけ、オペレーティングシステムを特定し、脆弱性を検出することができます。

実践的な演習を通じて、さまざまなタイプのポートスキャンの実行方法を理解します。また、スキャン結果の解釈方法を学び、ネットワークセキュリティ評価手法についての洞察を得ることができます。

ポートの理解と環境のセットアップ

ポートスキャンについて学び始める前に、コンピュータネットワークの文脈におけるポートが何であるかを理解することが重要です。ポートは通信のエンドポイントとして機能します。これにより、コンピュータ上の異なるプロセスがネットワークリソースを共有できます。ポートを、データがコンピュータに出入りできるドアと考えてください。利用可能なポートは合計 65,535 個あり、3 つの範囲に分けられます。

  • 周知ポート(Well - known ports):これらは 0 から 1023 までの番号が付けられたポートです。特定のサービスに予約されています。たとえば、ポート 80 は HTTP(Hypertext Transfer Protocol)に使用され、これはウェブページを転送するためのプロトコルです。ポート 22 は SSH(Secure Shell)に使用され、これはリモートコンピュータに安全にアクセスするためのプロトコルです。
  • 登録済みポート(Registered ports):これらのポートは 1024 から 49151 の範囲です。インターネット番号割り当て機関(Internet Assigned Numbers Authority, IANA)に登録されています。登録されていますが、一般ユーザーも独自のアプリケーションで使用することができます。
  • 動的/プライベートポート(Dynamic/Private ports):これらのポートは 49152 から 65535 の範囲です。一時的な使用のために自由に利用できます。アプリケーションは、短期間の接続を確立する必要があるときにこれらのポートを使用できます。

このステップでは、実験環境にローカルサービスをセットアップします。後でこのサービスをスキャンします。この実践的なアプローチにより、強力なポートスキャンツールである Nmap が開いているポートとそれらのポートで実行されているサービスをどのように検出するかを理解するのに役立ちます。

まず、ターミナルを開きます。ターミナルは、コンピュータと対話するためのコマンドを入力できるテキストベースのインターフェイスです。ターミナルを開いたら、プロジェクトディレクトリにいることを確認する必要があります。プロジェクトディレクトリは、この実験に関連するすべてのファイルが保存されている場所です。次のコマンドを実行することで、プロジェクトディレクトリに移動できます。

cd /home/labex/project

次に、マシン上に簡単な HTTP サーバーを作成します。Python の組み込み HTTP サーバーモジュールを使用します。このサーバーはポート 8080 で待機します。ポートで待機するとは、サーバーがその特定のポートで着信要求を待っていることを意味します。このサーバーが、Nmap スキャンの対象になります。サーバーを起動するには、次のコマンドを実行します。

python3 -m http.server 8080 &

このコマンドを実行した後、出力は次のようになります。

Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...

コマンドの最後の & 記号は重要です。これにより、プロセスがバックグラウンドで実行されます。つまり、サーバーは実行されたままで、ターミナルを使用して他のコマンドを入力できます。

サーバーが実行されていることを確認するために、待機中のポートを確認します。これは、次のコマンドを実行することで行えます。

ss -tuln | grep 8080

ss コマンドは、ソケット統計を表示するために使用されます。-tuln オプションは、コマンドに TCP、UDP、待機中のソケットを表示させ、数値アドレスを表示させます。| 記号はパイプで、ss コマンドの出力を grep コマンドに渡します。grep コマンドは、出力内の文字列 8080 を検索します。

サーバーが正しく実行されている場合、出力にはポート 8080 が使用されていることが表示されます。

tcp   LISTEN  0       1            0.0.0.0:8080      0.0.0.0:*

この出力は、HTTP サーバーが予想通りに実行されており、Nmap でスキャンできる状態であることを確認します。

基本的な Nmap ポートスキャン

HTTP サーバーが起動して実行されているので、Nmap を使用して基本的なポートスキャンを開始する準備ができました。まずは、ポートスキャンとは何かを理解しましょう。ポートスキャンはネットワークセキュリティにおける基本的な手法です。これにより、ホスト上のどのポートが開いているかを調べることができます。ポートは建物のドアのようなもので、コンピュータ上で実行されている各サービスは特定のポートを使用して通信します。ネットワーク管理者にとって、どのポートが開いているかを知ることは、サービスが予想通りに動作していることを保証するために重要です。セキュリティ専門家にとっては、潜在的な脆弱性を特定するための重要なステップです。なぜなら、開いているポートは攻撃者によって悪用される可能性があるからです。

まず、システムに Nmap がインストールされていることを確認する必要があります。Nmap はこの実験全体で使用する強力なネットワークスキャンツールです。インストールされているかどうかを確認するには、ターミナルで次のコマンドを実行します。

nmap --version

このコマンドは、システムにインストールされている Nmap のバージョンを表示するよう要求します。Nmap が正しくインストールされている場合、次のような出力が表示されます。

Nmap version 7.80 ( https://nmap.org )

基本的なポートスキャンの実行

Nmap がインストールされていることを確認したので、ローカルホストでポート 8080 が開いているかどうかを確認するための基本的なスキャンを実行しましょう。ローカルホストは、現在作業しているコンピュータを指し、IP アドレス 127.0.0.1 で表されます。スキャンを実行するには、次のコマンドを実行します。

nmap -p 8080 localhost

このコマンドでは、-p フラグを使用して、スキャンするポートを指定しています。ここでは、ポート 8080 のみを対象としています。このコマンドを実行すると、Nmap はローカルホストのポート 8080 に特殊なネットワークパケットを送信し、応答を分析してポートが開いているかどうかを判断します。

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

Starting Nmap 7.80 ( https://nmap.org ) at 2023-08-01 10:00 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00020s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy

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

この出力は重要な情報を提供しています。ポート 8080 が開いていること、および Nmap がこのポートで実行されているサービスを "http - proxy" と識別したことを示しています。

次に、このスキャンの出力をファイルに保存します。スキャン結果を保存することは、後でさらに分析するために参照できるため便利です。出力を保存するには、次のコマンドを実行します。

nmap -p 8080 localhost > /home/labex/project/basic_scan.txt

このコマンドでは、> 記号を使用して、Nmap スキャンの出力を /home/labex/project ディレクトリにある basic_scan.txt という名前のファイルにリダイレクトしています。

出力が正しく保存されていることを確認するには、cat コマンドを使用できます。cat コマンドは、ファイルの内容を表示するために使用されます。次のコマンドを実行します。

cat /home/labex/project/basic_scan.txt

以前と同じ出力が表示され、これがファイルに保存されているはずです。

出力の理解

Nmap スキャンの出力を詳しく見て、各行が何を意味するかを理解しましょう。

  • Starting Nmap 7.80 ( https://nmap.org ) at 2023-08-01 10:00 UTC:この行は、Nmap スキャンがいつ開始されたかを示しています。スキャンが実行された時刻を追跡するのに便利です。
  • Nmap scan report for localhost (127.0.0.1):この行は、スキャンの対象ホストを識別しています。この場合、IP アドレス 127.0.0.1 のローカルホストです。
  • Host is up (0.00020s latency):この行は、対象ホストがオンラインであることを確認しています。レイテンシ値は、ネットワークパケットがホストに到達して戻ってくるまでにかかる時間を示しています。ローカルホストは自分が作業している同じコンピュータなので、非常に低いレイテンシが予想されます。
  • PORT STATE SERVICE:これはポートスキャン結果のヘッダーです。次の行に表示される情報を示しています。
  • 8080/tcp open http-proxy:この行は、ポート 8080 が開いていることを示しています。/tcp の部分は、使用されているネットワークプロトコルのタイプ(TCP、信頼性の高いデータ転送に一般的に使用されるプロトコル)を指定しています。Nmap はこのポートで実行されているサービスを "http - proxy" と識別しています。
  • Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds:この行はスキャンを要約しています。Nmap が 1 つの IP アドレス(ローカルホスト)をスキャンし、ホストがオンラインであることを確認し、0.05 秒でスキャンを完了したことを示しています。

高度な Nmap スキャン手法

基本的なポートスキャンを成功させたので、次はスキルをアップグレードして、より高度な Nmap スキャン手法を探ってみましょう。Nmap は強力なツールで、ネットワークサービスに関する詳細情報を収集するための数多くのオプションを提供します。この情報は、ネットワーク管理とセキュリティ評価の両方にとって重要です。高度なスキャン手法を使うことで、ネットワーク上のシステムについてより多くのことを明らかにすることができ、潜在的なセキュリティリスクを特定し、ネットワークをより効果的に管理するのに役立ちます。

サービスバージョン検出

Nmap の最も便利な機能の 1 つは、開いているポートで実行されているサービスとそのバージョンを特定する能力です。サービスとそのバージョンを知ることは、特定のサービスバージョンに関連する潜在的な脆弱性を特定するのに不可欠です。多くのソフトウェアの脆弱性は特定のバージョンに関連付けられているため、ポートで実行されている正確なバージョンを知ることで、既知のセキュリティ問題があるかどうかをすぐに確認できます。

ポート 8080 でサービスバージョン検出スキャンを実行するには、次のコマンドを実行する必要があります。

nmap -sV -p 8080 localhost

このコマンドでは、-sV フラグが重要です。これは Nmap に、開いているポートを調査してサービス情報を特定するよう指示します。-p 8080 はポート 8080 をスキャンすることを指定し、localhost は自分自身のマシンをスキャンしていることを示します。

このコマンドの出力は次のようになるはずです。

Starting Nmap 7.80 ( https://nmap.org ) at 2023-08-01 10:15 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00022s latency).

PORT     STATE SERVICE VERSION
8080/tcp open  http    SimpleHTTPServer 0.6 (Python 3.10.12)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.32 seconds

ご覧の通り、Nmap はポート 8080 で実行されているサービスに関するより詳細な情報を提供しています。サービスを Python SimpleHTTPServer と識別し、そのバージョンと実行されている Python のバージョンも示しています。

では、この貴重な情報をファイルに保存しましょう。次のコマンドを実行することで保存できます。

nmap -sV -p 8080 localhost > /home/labex/project/advanced_scan.txt

> 記号は、nmap コマンドの出力を指定されたファイルにリダイレクトするために使用されます。

ファイルの内容を表示するには、cat コマンドを使用できます。

cat /home/labex/project/advanced_scan.txt

基本スキャンと高度スキャンの違いの理解

基本スキャンと高度スキャンを比較して、なぜ高度スキャンが有用なのかを理解しましょう。

  1. 基本スキャン (nmap -p 8080 localhost):基本スキャンを実行すると、ポート 8080 が開いていてサービスが実行されていることだけがわかります。ポート番号に基づいて、Nmap はサービスが "http - proxy" である可能性があると推測します。しかし、これは大まかな推定であり、実際のサービスに関する詳細情報は提供されません。

  2. 高度スキャン (nmap -sV -p 8080 localhost):対照的に、高度スキャンははるかに詳細な情報を提供します。正確なサービス名(SimpleHTTPServer)、そのバージョン(0.6)、さらにはサービスが実行されているプログラミング言語とそのバージョン(Python 3.10.12)を教えてくれます。

この追加情報はいくつかの理由で価値があります。

  • 古いサービスの特定:サービスの正確なバージョンを知ることで、既知の脆弱性がある古いバージョンであるかどうかを簡単に確認できます。もしそうであれば、サービスを更新してネットワークをセキュアにするための措置を講じることができます。
  • ネットワークの理解:ネットワーク上で実際に動作しているソフトウェアの明確な画像を得ることができます。これはネットワーク管理とリソース割り当てに役立ちます。
  • セキュリティ対策の計画:システム上で実行されているサービスに特化したセキュリティ対策を計画することができます。たとえば、特定のサービスに既知の脆弱性があることがわかっている場合、ターゲットとなるセキュリティコントロールを実装することができます。

その他の有用な Nmap オプション

Nmap は、さまざまな種類のスキャンを実行するために組み合わせることができる多くの他のスキャンオプションを提供します。以下は最も一般的に使用されるオプションのいくつかです。

  • -sS:これは TCP SYN スキャンで、ステルススキャンとも呼ばれます。完全な TCP 接続を完了しないため、検出されにくく、高速でステルスなポートスキャン方法です。
  • -O:このオプションはオペレーティングシステム検出を有効にします。Nmap がターゲットマシンで実行されているオペレーティングシステムを特定しようとします。
  • -A:OS 検出、バージョン検出、スクリプトスキャン、トレーサーoute などのいくつかの機能を組み合わせた攻撃的なスキャンです。ターゲットシステムの包括的なビューを提供します。
  • -T<0 - 5>:このオプションはタイミングテンプレートを設定するために使用されます。数値が高いほどスキャンが速くなりますが、検出される可能性も高くなります。
  • -Pn:このオプションはすべてのホストをオンラインとして扱い、ホスト発見フェーズをスキップします。ターゲットがオンラインであることがわかっていて、時間を節約したい場合に便利です。

たとえば、ローカルマシン上のすべての周知ポートをすばやくスキャンしたい場合は、次のコマンドを使用できます。

nmap -F localhost

-F(高速)オプションは、Nmap にデフォルトのスキャンよりも少ないポートをスキャンするよう指示します。システム上の開いているポートの概要をすばやく把握したい場合に便利です。

注意:実際のネットワークセキュリティ評価では、システムをスキャンする前に適切な許可を得ることが重要です。多くの地域では、許可なくスキャンすることは違法になる可能性があります。

スキャン結果の解釈と分析

このステップでは、Nmap スキャンの結果を理解し、分析する方法を学びます。ネットワークセキュリティに関しては、スキャン出力を読み取る能力が不可欠です。これにより、ネットワークのセキュリティに関する適切な判断を下すことができます。たとえば、スキャン結果に基づいて潜在的な脆弱性や不正アクセスポイントを特定することができます。

異なるスキャンタイプの比較

いくつかの異なるタイプのスキャンを実行し、それらの出力がどのように異なるかを見てみましょう。まず、包括的なスキャンを行います。このタイプのスキャンはすべての一般的なオプションを含み、ターゲットの詳細な情報を提供します。

nmap -A -p 8080 localhost > /home/labex/project/comprehensive_scan.txt

このコマンドでは、-A フラグが非常に重要です。これは攻撃的なスキャンオプションを有効にします。これらのオプションには、ターゲットのオペレーティングシステムの検出、実行中のサービスのバージョンの特定、利用可能なスクリプトのスキャン、およびトレーサーoute の実行が含まれます。このフラグを使用することで、ターゲットに関する多くの有用な情報を収集することができます。

では、この包括的なスキャンの結果を見てみましょう。

cat /home/labex/project/comprehensive_scan.txt

出力は非常に詳細になります。ポート 8080 で実行されているサービスに関する情報、そのサービスに対して実行できる可能性のあるスクリプト、およびその他の関連する詳細が含まれます。この詳細な情報は、ターゲットのセキュリティ状況をよりよく理解するのに役立ちます。

ポート状態の理解

Nmap はポートについていくつかの可能な状態を報告します。各状態は、ポートの状況について異なる情報を提供します。

  • open:これは、アプリケーションがこのポートで TCP 接続または UDP パケットを積極的に受け入れていることを意味します。開いていて訪問者を受け入れる準備ができているドアのようなものです。
  • closed:ポートはアクセス可能ですが、そこにはアプリケーションが待ち受けていません。鍵がかかっていないドアで、中に誰もいない状態のようなものです。
  • filtered:パケットフィルタリングによって Nmap のプローブがポートに到達できないため、Nmap はポートが開いているかどうかを判断できません。ドアの前に警備員が立っていて、Nmap がドアを見ることができない状態のようなものです。
  • unfiltered:ポートはアクセス可能ですが、Nmap はそれが開いているか閉じているかを判断できません。ドアを見て、中に誰かがいるかどうかがわからない状態のようなものです。
  • open|filtered:Nmap はポートが開いているかフィルタリングされているかを判断できません。ドアが開いているか閉ざされているかがわからない不確定な状態です。
  • closed|filtered:Nmap はポートが閉じているかフィルタリングされているかを判断できません。前の状態と同様に、ドアが鍵がかかっているか閉ざされているかがわからない状態です。

ポート範囲をスキャンすることで、これらの状態がスキャン結果にどのように表示されるかを見てみましょう。

nmap -p 8080-8085 localhost > /home/labex/project/port_states.txt

スキャンが完了したら、結果を表示できます。

cat /home/labex/project/port_states.txt

ポート 8080 が開いていると報告され、範囲内の他のポートは閉じていると報告されるはずです。これにより、どのポートが積極的に使用されているか、どのポートが使用されていないかがわかります。

結果の実用的な分析

では、スキャン結果から重要な情報を抽出して要約レポートを作成しましょう。grep コマンドを使用して、開いているポートをフィルタリングします。開いているポートは、攻撃者の潜在的な侵入ポイントであるため、セキュリティ評価において非常に重要です。

grep "open" /home/labex/project/comprehensive_scan.txt > /home/labex/project/open_ports.txt

フィルタリング後、結果を表示できます。

cat /home/labex/project/open_ports.txt

このフィルタリングされた出力により、開いているポートに集中することが容易になります。詳細なスキャンレポート全体を見る代わりに、どのポートが開いているかをすぐに確認し、それらのセキュリティリスクを評価し始めることができます。

セキュリティ上の影響

スキャン結果のセキュリティ上の影響を理解することは重要です。以下は覚えておくべきいくつかの重要なポイントです。

  1. 不要な開いているポート:開いているポートはすべて、攻撃者の潜在的な侵入ポイントです。必要のないサービスがある場合は、それを無効にする必要があります。たとえば、もはや使用していないサービスのためにポートが開いている場合、攻撃者はそのポートを使用してシステムにアクセスする可能性があります。
  2. 古いサービス:古いバージョンのサービスには、攻撃者が悪用できる既知の脆弱性がある場合があります。これらのリスクを回避するために、サービスを最新の状態に保つことが重要です。
  3. 設定ミスのあるサービス:最新のサービスでも、設定が誤っていると脆弱になる可能性があります。設定に小さなミスがあるだけで、システムが攻撃にさらされることがあります。

この実験環境では、HTTP サーバーのために意図的にポート 8080 を開きました。しかし、実際の本番環境では、このサービスが必要かどうか、および適切にセキュリティが確保されているかどうかを慎重に評価する必要があります。

HTTP サーバーの停止

このステップを終える前に、先ほど起動した HTTP サーバーを停止して片付けましょう。まず、そのプロセス ID を見つける必要があります。

ps aux | grep "python3 -m http.server"

このコマンドを実行すると、HTTP サーバーのプロセスを示す行を探します。出力の 2 列目にはプロセス ID (PID) が含まれています。PID を見つけたら、それを使用してサーバーを停止できます。

kill <PID>

<PID> を前のコマンド出力の実際のプロセス ID に置き換えます。

あるいは、次のコマンドを使用して、プロセスを見つけて一度に終了することもできます。

pkill -f "python3 -m http.server"

サーバーを停止した後、それがもはや実行されていないことを確認する必要があります。

ss -tuln | grep 8080

出力がない場合は、サーバーが正常に停止したことを意味します。

まとめ

この実験では、サイバーセキュリティ業界で広く使用されている強力なツールである Nmap を使ったネットワークスキャンの基本を学びました。まず、ポートの概念とコンピュータネットワーキングにおけるその機能を理解しました。次に、実際のサービスをスキャンする練習のためにローカル HTTP サーバーをセットアップしました。

基本的なポートスキャンから高度なサービスバージョン検出まで、様々な Nmap スキャンを実施しました。スキャン結果の解釈方法を学び、ポートの状態とそのセキュリティ上の影響を理解しました。また、セキュリティ評価のために結果をフィルタリングする練習も行いました。これらのスキルは、ネットワーク管理者やセキュリティ専門家が開いているポートを特定し、脆弱性を検出し、適切なセキュリティ判断を下し、ネットワーク構成を文書化するために不可欠です。これらの手法を習得することで、ネットワークセキュリティ評価と管理の熟練度に向けて大きな一歩を踏み出しました。実際のシナリオでシステムをスキャンする前には常に適切な許可を得るようにしてください。許可なくスキャンすることは違法になる可能性があります。