Nmap で高度なホスト検出を実行する

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

はじめに

この実験では、Nmap を用いた高度なホスト検出方法を学びます。ホスト検出とは、ネットワーク上のアクティブなデバイスを特定するプロセスです。これはネットワークの偵察における最初の重要なステップであり、ネットワークのレイアウトを理解し、さらなる分析の対象となる可能性のあるターゲットを特定するのに役立ちます。

さまざまな Nmap の手法を学ぶでしょう。

  • TCP ピン・スキャン (-PS): 特定のポートに TCP SYN パケットを送信し、ホストがオンラインかどうか、およびそのポートが開いているかどうかを判断します。
  • UDP ピン・スキャン (-PU): 特定のポートに UDP パケットを送信し、TCP ピンがブロックされている場合に、応答の有無に基づいてホストの状態を推測します。
  • ピン・スキャンスキップ (-Pn): Nmap のデフォルトのホスト検出フェーズをスキップし、すべてのターゲットホストがオンラインであると仮定して、直接ポートスキャンに進みます。
  • 複数のテクニックの組み合わせ: 複雑なネットワーク環境(ファイアウォールを含む)で、ホスト検出の信頼性を高めるために、複数の検出方法を活用します。
  • 結果の保存と分析: 後のレビューのために Nmap の出力をファイルに保存し、基本的な Linux コマンドを使用してスキャン結果から貴重な情報を抽出します。

実験を通して、nmap -PS2222,8080 127.0.0.1 などの TCP ピン・スキャンコマンド、nmap -PU5353 127.0.0.1 などの UDP ピン・スキャンコマンド、nmap -Pn -oN hosts.txt 127.0.0.1 などの結果保存コマンドを実行します。これらの実践的な演習は、Nmap のホスト検出機能を理解し、実際のネットワーク偵察タスクに備えるのに役立ちます。

特定ポートへの TCP ピン・スキャン (nmap -PS)

このステップでは、Nmap を使用してターゲットホストの特定のポートに対して TCP ピン・スキャンを実行する方法を学びます。この手法は、特に従来の ICMP ピンがファイアウォールによってブロックされている場合に、ホストがオンラインであり、特定のサービスがそのポート上で動作しているかどうかを判断するのに役立ちます。

TCP ピンの仕組み
従来の ICMP ピンとは異なり、TCP ピンはターゲットホストの指定されたポートに TCP SYN パケットを送信します。

  • ポートがオープンの場合、ターゲットホストは通常、SYN/ACK パケットで応答します。
  • ポートがクローズドの場合、ターゲットホストは通常、RST パケットで応答します。
  • ポートがフィルタリングされている場合(例:ファイアウォールによって)、全く応答がない場合があります。

Nmap はこれらの応答(または応答がないこと)を使用して、ホストがオンラインであり、指定されたポートの状態を判断します。Nmap で TCP SYN ピン・スキャンを実行するには -PS オプションを使用します。カンマ区切りで複数のポートを指定できます。

この実験では、設定スクリプトにより、ローカルマシン (127.0.0.1) 上にいくつかのサービスが設定されています。ポート 2222 で動作する SSH サービスと、ポート 8080 で動作する Nginx Web サーバーを対象とします。

LabEx VM のターミナルを開きます。デフォルトのディレクトリは ~/project です。以下のコマンドを実行します。

nmap -PS2222,8080 127.0.0.1

このコマンドは、Nmap にホスト 127.0.0.1 のポート 22228080 に TCP SYN パケットを送信するように指示します。

以下の出力と同様の出力が表示され、ホストが稼働しており、指定されたポートが開いていることを示します。

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000085s 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.05 seconds

この例では、Nmap はホスト 127.0.0.1 が稼働しており、ポート 2222 (SSH) と 8080 (HTTP プロキシ) がオープンであると報告しています。ポートがクローズドの場合、出力は「オープン」ではなく「クローズド」と表示されます。ホストがダウンしているか到達できない場合、Nmap は「Host is down」と報告します。

UDP ピン・スキャンを実行する (nmap -PU)

このステップでは、Nmap を使用してターゲットホストの特定のポートに対して UDP ピン・スキャンを実行する方法を学びます。この手法は、TCP ピンがファイアウォールによってブロックされている場合、またはホストが UDP サービスのみを実行している可能性がある場合に、ホスト検出に特に有効です。

UDP ピンの仕組み
TCP ピンが SYN/ACK または RST 応答を期待するのに対し、UDP ピンは指定されたポートに UDP パケットを送信します。

  • ポートがオープンの場合、ターゲットホストは何も応答しない場合があります(多くの UDP サービスは、特別な要求がない限り応答を送信しません)。
  • ポートがクローズドの場合、ターゲットホストは通常、ICMP "ポート到達不能" エラーで応答します。
  • ポートがフィルタリングされている場合、応答はありません。

Nmap は応答の有無(または応答の種類)を使用して、ホストがオンラインかどうかを判断します。Nmap で UDP ピン・スキャンを実行するには -PU オプションを使用します。スキャンするポートを指定する必要があります。この実験では、ローカルマシン (127.0.0.1) のポート 5353 で動作する DNS サービスを対象とします。

重要な注意点: UDP ピン・スキャンは、生のネットワーク応答を読むためにルート権限が必要です。sudo を nmap コマンドと一緒に使用してください。

LabEx VM のターミナルを開きます。デフォルトのディレクトリは ~/project です。以下のコマンドを実行します。

sudo nmap -PU5353 127.0.0.1

このコマンドは、Nmap にホスト 127.0.0.1 のポート 5353 に UDP パケットを送信するように指示します。

以下の出力と同様の出力が表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s 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.09 seconds

この例では、Nmap はホスト 127.0.0.1 が稼働していることを報告しています。UDP ピンを使用してホスト検出を行う場合、Nmap はホストが生きていることを確認した後、デフォルトのポートスキャンを実行するため、出力に TCP ポートが表示されます。UDP ピンは、ホストがオンラインであることを検出することに成功しました。

Ping をスキップしてスキャンする (nmap -Pn)

このステップでは、Nmap の -Pn オプションを使用してホスト検出のピンをスキップする方法を学びます。これは、ホストがオンラインかどうかを最初に確認せずにホストをスキャンしたい場合に特に役立ちます。これは、従来のピン方法(ICMP や TCP/UDP ピンなど)がファイアウォールによってブロックされている場合、または単にホストが稼働していることを前提として時間を節約したい場合に役立ちます。

-Pn の仕組み
通常、Nmap はポートスキャンを実行する前にホスト検出フェーズを実行します。これは、さまざまなプローブ(ICMP エコー要求、TCP SYN パケット、UDP パケットなど)を送信して、ターゲットホストがオンラインかどうかを判断することです。Nmap がホストがダウンしていることを判断した場合、そのホストのポートスキャンフェーズはスキップされます。

-Pn オプションは、Nmap にこのホスト検出フェーズを完全にスキップし、すべてのターゲットホストをオンラインであるとみなすように指示します。つまり、Nmap は、ホストがどのピン・プローブにも応答するかどうかに関わらず、直接ポートスキャンフェーズに進みます。

例を挙げてみましょう。-Pn オプションを使用して、ローカルホストアドレス 127.0.0.1 を Nmap でスキャンします。

LabEx VM のターミナルを開きます。デフォルトのディレクトリは ~/project です。以下のコマンドを実行します。

nmap -Pn 127.0.0.1

このコマンドは、Nmap にホスト検出のピンをスキップし、127.0.0.1 のポートをスキャンするように指示します。

以下の出力と同様の出力が表示され、実験環境で設定されたものも含め、ローカルマシン上のさまざまなオープンポートが表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000098s 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.05 seconds

この例では、Nmap はホスト 127.0.0.1 が稼働しており、オープンポートを表示しています。ICMP ピンやその他のホスト検出方法がシステムでブロックされていても、-Pn オプションのため、Nmap はポートスキャンを試みます。

-Pn オプションを使用すると、多くのホストを対象にするとスキャン時間が長くなる可能性があることに注意してください。Nmap は、指定された IP アドレスのそれぞれでポートスキャンを試みますが、多くの場合、実際にはオフラインです。

ホスト検出のための複数技術の組み合わせ

このステップでは、Nmap で TCP ピンと UDP ピン技法を組み合わせることで、ライブホストを発見する方法を学びます。複数の技法を組み合わせることで、特にファイアウォールやその他のネットワークセキュリティ対策(ある種のプローブをブロックするが、別のプローブはブロックしないもの)に対処する場合、ホスト検出の信頼性を大幅に向上させることができます。

前のステップで学んだように:

  • -PS は TCP SYN ピンに使用されます。
  • -PU は UDP ピンに使用されます(ルート権限が必要です)。

これらのオプションを組み合わせることで、Nmap は指定された TCP ポートへの TCP SYN パケットと、指定された UDP ポートへの UDP パケットの両方を送信します。これらのプローブのいずれかが応答を受け取ると、Nmap はホストが稼働していると見なします。これにより、アクティブなホストを検出するためのより堅牢な方法が提供されます。

この例では、ローカルマシン (127.0.0.1) のポート 2222 (SSH) への TCP SYN パケットとポート 5353 (DNS) への UDP パケットを送信するために Nmap を使用します。

LabEx VM のターミナルを開きます。デフォルトのディレクトリは ~/project です。以下のコマンドを実行します。

sudo nmap -PS2222 -PU5353 127.0.0.1

このコマンドは、Nmap に以下の操作を実行するように指示します。

  • -PS2222: ターゲットホストのポート 2222 に TCP SYN パケットを送信します。
  • -PU5353: ターゲットホストのポート 5353 に UDP パケットを送信します。
  • 127.0.0.1: ローカルホストをスキャンします。

以下の出力と同様の出力が表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at YYYY-MM-DD HH:MM CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000040s 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.10 seconds

この例では、Nmap はホスト 127.0.0.1 が稼働していることを報告しています。Nmap は、ポート 2222 に送信された TCP SYN パケットまたはポート 5353 に送信された UDP パケットのいずれかに応答があったことで、これを判断しました。ホストがピン・プローブによって生きていることを確認した後、Nmap はデフォルトのポートスキャンを実行し、オープンな TCP ポートを表示します。

このように技法を組み合わせることは、ある種のプローブをブロックする可能性のあるファイアウォールやその他のセキュリティ対策を回避する可能性を高めるため、単一の方法を使用するよりも効果的です。これにより、より正確なホスト検出結果が得られます。

検出結果をファイルに保存する

このステップでは、-oN オプションを使用して Nmap スキャン結果をファイルに保存する方法を学びます。スキャン結果を保存することは、発見内容の記録、後続の分析、または他者との情報共有に不可欠です。

-oN オプションは、Nmap にスキャン結果を指定されたファイルに「通常の」形式で保存するように指示します。通常の形式は、人間が読みやすく、表示や解析が容易なテキストファイルです。

この例では、ホスト 127.0.0.1 をスキャンし、ホスト検出のピンをスキップ (-Pn) し、~/project ディレクトリにある hosts.txt というファイルに結果を保存します。

LabEx VM のターミナルを開きます。デフォルトのディレクトリは ~/project です。以下のコマンドを実行します。

nmap -Pn -oN hosts.txt 127.0.0.1

このコマンドは、Nmap に以下の操作を実行するように指示します。

  • -Pn: ホスト検出のピンをスキップします(ホストが稼働していることを前提とします)。
  • -oN hosts.txt: スキャン結果を通常の形式でファイル hosts.txt に保存します。
  • 127.0.0.1: ホスト 127.0.0.1 をスキャンします。

スキャンが完了したら、cat コマンドを使用して hosts.txt ファイルの内容を表示できます。

cat hosts.txt

以下の出力と同様の出力が表示されます。これは、Nmap のバージョン、スキャン時間、ホストの状態、およびオープンポートを含みます。

## Nmap 7.80 scan initiated Tue Jun  3 10:50:49 2025 as: nmap -Pn -oN hosts.txt 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000089s 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 at Tue Jun  3 10:50:49 2025 -- 1 IP address (1 host up) scanned in 0.05 seconds

hosts.txt ファイルには、人間が読みやすい形式で Nmap スキャン結果が含まれています。このファイルは、ドキュメント、レポート、または grep などの基本的な Linux コマンドを使用して、発見されたホストやサービスに関する特定の情報を取り出すための分析に使用できます。

まとめ

この実験では、Nmap を使用した高度なホスト検出を実行する方法を学びました。ホスト検出のための具体的な Nmap オプションを理解し、適用することで始めました。

  • TCP ピン・スキャン (-PS): nmap -PS2222,8080 127.0.0.1 を使用して、アクティブなホストとオープンな TCP ポートを特定しました。
  • UDP ピン・スキャン (-PU): sudo nmap -PU5353 127.0.0.1 を実行して、UDP プローブを使用してホストを発見しました。これは、TCP が制限されている場合に役立ちます。
  • ピン・スキャンをスキップ (-Pn): nmap -Pn 127.0.0.1 を使用して、事前にホスト検出を行わずに Nmap でホストをスキャンする方法を学びました。これは、ファイアウォール環境で不可欠です。
  • 技法の組み合わせ: sudo nmap -PS2222 -PU5353 127.0.0.1 を使用して TCP ピン・スキャンと UDP ピン・スキャンを組み合わせ、より信頼性の高いホスト検出を実現しました。

さらに、Nmap 出力の管理に関する実践的なスキルも習得しました。

  • 結果の保存: nmap -Pn -oN hosts.txt 127.0.0.1 を使用して、人間が読みやすいファイルにスキャン結果を保存しました。

これらの Nmap 技法を習得することで、効果的なネットワーク偵察、アクティブなデバイスの特定、セキュリティ評価やネットワーク管理タスクに必要な重要な情報の収集に、より適切に対応できるようになりました。保存された出力ファイルは、標準的な Linux テキスト処理ツールを使用して詳細なレポートやドキュメントを作成するためにさらに分析できます。