Nmap入門:ネットワーク探索とセキュリティ監査の必須ツール

ネットワークセキュリティ

ネットワークの”地図”を作成し、脆弱性を発見する

ネットワークの世界は広大で複雑です。その中で、特定のホストがオンラインであるか、どのようなサービスが動作しているか、どのようなOSが使われているかを知ることは、ネットワーク管理者やセキュリティ専門家にとって不可欠な作業です。この情報収集プロセスにおいて、Nmap (Network Mapper) はデファクトスタンダードとも言える強力なオープンソースツールです。

Nmapは、ネットワーク上のホストを発見し、それらのホストで開いているポート(利用可能なサービス)、実行されているサービスの名前とバージョン、稼働しているオペレーティングシステム、ファイアウォールの種類などを特定するために設計されています。ネットワークインベントリの作成、サービスアップグレードスケジュールの管理、ホストやサービスの稼働状況監視など、様々な用途で活用されています。🛡️

しかし、その強力さゆえに、Nmapは攻撃者によって不正な情報収集にも利用される可能性があります。したがって、Nmapを使用する際には、必ず許可されたネットワーク環境でのみ使用し、倫理的な側面と法的規制を遵守する必要があります。本記事では、Nmapの基本的な使い方から、より高度なテクニックまでを解説し、責任ある使用方法についても触れていきます。

(本記事執筆にあたり、Nmapの安定版リリースや一般的な利用方法に基づき、2024年初頭までの情報を反映していますが、Nmapおよび関連技術は常に進化している点にご留意ください。)

💡 Nmapとは?

Nmap (https://nmap.org/) は、Gordon Lyon (別名 Fyodor Vaskovich) によって作成された、無料かつオープンソースのネットワークスキャナです。当初はLinux向けに開発されましたが、現在ではWindows, macOS, BSDなど多くのプラットフォームで利用可能です。コマンドラインインターフェース (CLI) が基本ですが、Zenmapと呼ばれるGUIフロントエンドも提供されています。その柔軟性と強力な機能により、世界中のネットワーク管理者やセキュリティ専門家に愛用されています。

Nmapのインストール

Nmapを使用するには、まずお使いのシステムにインストールする必要があります。主要なOSでのインストール方法は以下の通りです。

  • Linux (Debian/Ubuntu系):
    sudo apt update
    sudo apt install nmap
  • Linux (Fedora/CentOS/RHEL系):
    sudo dnf install nmap  # Fedora
    sudo yum install nmap  # CentOS/RHEL
  • macOS:

    Homebrew (https://brew.sh/) を利用するのが簡単です。

    brew install nmap

    または、公式サイトからインストーラ (.dmg) をダウンロードしてインストールすることも可能です。

  • Windows:

    公式サイト (https://nmap.org/download.html) から最新の実行可能インストーラ (.exe) をダウンロードし、指示に従ってインストールします。インストール時に、NPcap (パケットキャプチャライブラリ) のインストールも推奨されます。これにより、SYNスキャンなどの高度な機能が利用可能になります。

インストール後、ターミナルまたはコマンドプロンプトを開き、nmap -V または nmap --version を実行して、バージョン情報が表示されれば正常にインストールされています。

nmap --version
Nmap version 7.94 ( https://nmap.org )
Platform: x86_64-apple-darwin23.1.0
Compiled with: liblua-5.4.6 openssl-3.1.4 libssh2-1.11.0 libz-1.2.12 libpcre-8.45 libpcap-1.10.4 nmap-libdnet-1.12 ipv6
Compiled without:
Available nsock engines: kqueue poll select

基本的な使い方:ターゲットの指定とデフォルトスキャン

Nmapの最も基本的な使い方は、コマンドラインで nmap コマンドに続けてスキャン対象のターゲットを指定することです。ターゲットは様々な形式で指定できます。

  • 単一IPアドレス: nmap 192.168.1.1
  • ホスト名: nmap scanme.nmap.org (Nmap公式のテスト用ホスト)
  • CIDR表記によるサブネット: nmap 192.168.1.0/24 (192.168.1.0から192.168.1.255まで)
  • IPアドレス範囲: nmap 192.168.1.1-100 (192.168.1.1から192.168.1.100まで)
  • 複数のターゲット: nmap 192.168.1.1 192.168.1.5 scanme.nmap.org
  • ターゲットリストファイル: nmap -iL targets.txt (targets.txt ファイルにターゲットを1行ずつ記述)

オプションを指定せずにターゲットのみを指定した場合、Nmapはデフォルトのスキャンを実行します。root/Administrator権限で実行した場合は TCP SYNスキャン (`-sS`)、一般ユーザー権限の場合は TCP Connectスキャン (`-sT`) がデフォルトとなります。また、ホスト発見 (Pingスキャン) も自動的に行われます。デフォルトでは、よく使われる1000個のTCPポートをスキャンします。

実行例 (scanme.nmap.org):

nmap scanme.nmap.org

出力例 (抜粋):

Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-10 10:00 JST
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.15s latency).
Not shown: 995 closed tcp ports (conn-refused)
PORT     STATE    SERVICE
22/tcp   open     ssh
80/tcp   open     http
135/tcp  filtered msrpc
139/tcp  filtered netbios-ssn
445/tcp  filtered microsoft-ds
9929/tcp open     nping-echo
31337/tcp open    Elite

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

出力の解説:

  • Host is up: ターゲットホストが応答し、オンラインであることを示します。
  • Not shown: ...: スキャンしたが閉じている (closed) またはフィルタリングされている (filtered) と判断されたポートのうち、表示を省略した数を示します。
  • PORT: スキャンされたポート番号とプロトコル (例: 22/tcp)。
  • STATE: ポートの状態。主な状態は以下の通りです。
    • open: ポートは開いており、サービスが接続を受け付けている状態。
    • closed: ポートは応答しているが、サービスは起動していない状態。ホストが生存している証拠にはなる。
    • filtered: Nmapがポートの状態 (openかclosedか) を判断できなかった状態。通常、ファイアウォールによってパケットが破棄されていることを示す。
    • unfiltered: ポートは応答しているが、Nmapがopenかclosedかを判断できない状態 (主にACKスキャン `-sA` で見られる)。
    • open|filtered: ポートが開いているか、フィルタリングされているか判断できない状態 (UDPスキャンなどで見られる)。
    • closed|filtered: ポートが閉じているか、フィルタリングされているか判断できない状態 (IP IDアイドルスキャン `-sI` で見られる)。
  • SERVICE: Nmapが推測した、そのポートで動作しているサービスの一般的な名前 (例: ssh, http)。後述するバージョン検出 (`-sV`) を使うと、より詳細な情報が得られます。

主要なスキャンタイプ ⚙️

Nmapは様々なスキャンテクニックを提供しており、状況に応じて使い分けることが重要です。

TCP SYNスキャン (`-sS`)

ステルススキャンとも呼ばれ、最も一般的で効率的なTCPスキャン方法です。root/Administrator権限が必要です。

仕組み: NmapはターゲットポートにTCP SYNパケット (接続開始要求) を送信します。

  • ポートがopenの場合: ターゲットはSYN/ACKパケット (接続許可) を返します。Nmapはこれを受け取ると、接続を確立せずにRSTパケット (リセット) を送信して切断します。
  • ポートがclosedの場合: ターゲットはRSTパケットを返します。
  • ポートがfilteredの場合: ターゲットから応答がないか、ICMPエラーメッセージ (例: Destination Unreachable) が返されます。
利点: 完全なTCP接続を確立しないため、比較的検知されにくく (ただし現代のIDS/IPSは検知可能)、高速です。

欠点: root/Administrator権限が必要です。ファイアウォールによってはSYNパケットをブロックすることがあります。

sudo nmap -sS target.example.com

TCP Connectスキャン (`-sT`)

OSのconnect()システムコールを利用して、ターゲットポートとの完全なTCPスリーウェイハンドシェイクを試みます。一般ユーザー権限でも実行可能です。

仕組み: Nmapはターゲットポートへの接続を試みます。

  • 接続が成功した場合 (open): Nmapはすぐに接続を切断します。
  • 接続が拒否された場合 (closed): connect() が失敗します。
  • 接続がタイムアウトした場合 (filtered): ファイアウォールなどによってブロックされている可能性があります。
利点: 特殊な権限が不要です。

欠点: 完全な接続を確立するため、ターゲットホストのログに接続試行が記録されやすく、検知されやすいです。SYNスキャンより遅い場合があります。

nmap -sT target.example.com

UDPスキャン (`-sU`)

TCPと並んで重要なUDPプロトコルのポートをスキャンします。UDPはコネクションレス型のため、スキャンはTCPより困難で時間がかかります。root/Administrator権限が推奨されます (ICMPエラーメッセージを直接処理できるため)。

仕組み: NmapはターゲットのUDPポートに空のUDPパケット (またはサービス固有のプローブ) を送信します。

  • ポートがclosedの場合: ターゲットはICMP “Port Unreachable” メッセージを返すことが多いです。
  • ポートがopenの場合: 通常、応答はありません (サービスによっては応答を返す場合もあります)。
  • ポートがfilteredの場合: ICMPエラーも応答もない場合、ファイアウォールでブロックされている可能性があります。
  • 応答がない場合、Nmapは open|filtered と報告することがあります。これは、ポートが開いているか、単にパケットがフィルタリングされているか区別がつかないためです。バージョン検出 (`-sV`) を併用すると、サービス固有のプローブを送信して応答を確認するため、より正確に `open` を判断できることがあります。
利点: DNS (53), SNMP (161, 162), DHCP (67, 68) など、重要なUDPサービスを発見できます。

欠点: 非常に時間がかかることがあります。レート制限やICMPエラーの抑制により、結果が不正確になることがあります。--min-rate--max-retries オプションで調整が必要な場合があります。

sudo nmap -sU target.example.com

Pingスキャン (ホスト発見) (`-sn` or `-sP`)

ポートスキャンを実行せず、指定されたターゲットがオンラインであるかどうか (生存確認) のみを行います。ネットワーク上のアクティブなホストを素早くリストアップするのに便利です。

仕組み: Nmapは複数の手法を組み合わせてホストの生存を確認します。デフォルトでは、ローカルネットワーク (ARPリクエスト) かどうか、実行権限 (rootか一般ユーザーか) に応じて、ICMP Echo Request (Ping), TCP SYN/ACKパケットなどを送信します。

利点: 高速で、ネットワーク全体の状況を把握する第一歩として役立ちます。

欠点: ポート情報は得られません。ファイアウォール設定によってはホストが応答せず、実際にはオンラインでも「Down」と誤判定されることがあります。

nmap -sn 192.168.1.0/24

(古いバージョンのNmapでは -sP でしたが、現在は -sn が推奨されます。「sn」は「Scan, No port scan」の意味です)

その他のスキャンタイプ

Nmapにはさらに多くのスキャンタイプがあります。

  • TCP FIN/Xmas/Null スキャン (`-sF`, `-sX`, `-sN`): TCPフラグフィールドに通常ではありえない組み合わせ (FINのみ、FIN+PSH+URG (Xmas), フラグなし (Null)) を設定したパケットを送ります。RFC 793 によれば、閉じているポートはRSTを返し、開いているポートは応答しないはずです。一部のOS (特にWindows) はこの仕様に従わないため、信頼性は環境に依存します。ファイアウォールを回避できる場合があります。root権限が必要です。
  • TCP ACKスキャン (`-sA`): ACKフラグのみを設定したパケットを送ります。主にファイアウォールのルールセットを調査し、ポートが `filtered` か `unfiltered` かを判断するために使われます。`open` か `closed` かは判別できません。root権限が必要です。
  • TCP Windowスキャン (`-sW`): ACKスキャンに似ていますが、一部のシステムでは `open` と `closed` を区別できることがあります (応答パケットのTCPウィンドウサイズの違いを利用)。信頼性は高くありません。root権限が必要です。
  • IPプロトコルスキャン (`-sO`): TCPやUDPのようなポート番号ではなく、IPヘッダのプロトコルフィールドで指定されるプロトコル (ICMP, IGMP, GREなど) がターゲットホストでサポートされているかをスキャンします。root権限が必要です。

ホスト発見 (Ping Sweep) の詳細

-sn オプションは単にホスト発見を行うことを指示しますが、Nmapが内部で使用する具体的なホスト発見手法 (Pingタイプ) を明示的に指定することも可能です。これは、ファイアウォールが特定の種類のPingプローブをブロックしている場合に役立ちます。

  • -PE: ICMP Echo Request (標準的なPing)。ファイアウォールでブロックされやすい。
  • -PP: ICMP Timestamp Request。Echo Requestがブロックされている場合の代替。
  • -PM: ICMP Address Mask Request。古い手法で、あまり使われない。
  • -PS : 指定したTCPポートにSYNパケットを送信 (例: -PS80, -PS22,80,443)。応答があればホストはオンライン。
  • -PA : 指定したTCPポートにACKパケットを送信。ステートフルファイアウォールを通過できることがある。
  • -PU : 指定したUDPポートにUDPパケットを送信。応答がないことがオンラインの証拠となる場合も。
  • -PR: ARP Ping。同一サブネット内のホスト発見に非常に高速かつ効果的。root権限が必要。
  • -Pn (または -P0, -PN): ホスト発見をスキップし、指定されたすべてのターゲットに対してポートスキャンなどを強制的に実行します。ホストがPingに応答しないことが分かっている場合に利用します。

例えば、標準Pingがブロックされているが、Webサーバー (ポート80) は開いている可能性がある場合、以下のように指定できます。

sudo nmap -PS80 target.example.com

複数のPingタイプを組み合わせることも可能です。Nmapはデフォルトで賢く選択しますが、状況に応じて明示的な指定が有効です。

ポート指定

デフォルトでは、Nmapは最も一般的な1000個のTCPポートをスキャンします。-p オプションでスキャン対象のポートを細かく指定できます。

  • 単一ポート: -p 80 (ポート80のみ)
  • ポート範囲: -p 1-1024 (ポート1から1024まで)
  • 複数ポート (カンマ区切り): -p 22,80,443 (ポート22, 80, 443)
  • 範囲と単一ポートの組み合わせ: -p 1-100,443,8080
  • プロトコル指定: -p T:21-25,80,U:53,161 (TCPポート21-25と80、UDPポート53と161)
  • 全ポート (0-65535): -p- または -p 0-65535 (時間がかかります)
  • よく使われる上位N個のポート: --top-ports 100 (上位100ポート)
  • 高速スキャンモード (`-F`): -F--top-ports 100 と同等で、より高速なスキャンを実現します。
# Webサーバー関連のポートとSSHポートをスキャン
nmap -p T:80,443,8080,U:53,T:22 target.example.com

# 上位20個のポートを高速スキャン
nmap -F --top-ports 20 target.example.com

サービス/バージョン検出 (`-sV`)

開いているポートを発見するだけでは、そこで実際にどのようなサービスが動作しているかは正確にはわかりません (例: ポート80でApache httpdが動いているのか、Nginxなのか、それとも別の何かか)。-sV オプションを使用すると、Nmapは開いているポートに接続し、様々なプローブを送信して応答を分析し、サービス名とそのバージョン情報を特定しようと試みます。🔍

バージョン情報は、脆弱性診断において非常に重要です。特定のバージョンのソフトウェアに既知の脆弱性が存在する場合、それを特定できれば対策を講じることができます。

sudo nmap -sS -sV target.example.com

出力例 (-sV を追加):

PORT     STATE  SERVICE      VERSION
22/tcp   open   ssh          OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
80/tcp   open   http         Apache httpd 2.4.41 ((Ubuntu))
9929/tcp open   nping-echo   Nping echo
31337/tcp open  tcpwrapped

VERSION カラムに詳細な情報が表示されていることがわかります。--version-intensity <0-9> オプションで、送信するプローブの数を調整できます。デフォルトは7ですが、数値を上げるとより多くのプローブを試しますが、スキャン時間は長くなります。--version-all (強度9) は最も多くのプローブを試します。

OS検出 (`-O`)

-O オプションを使用すると、Nmapはターゲットホストのオペレーティングシステム (OS) を推測しようと試みます。これは、TCP/IPスタックの実装がOSごとに微妙に異なる特性 (TCPオプションの順序、ウィンドウサイズ、IP IDの挙動など) を利用した「フィンガープリンティング」によって行われます。

OS検出には、少なくとも1つのopenポートと1つのclosedポートの情報が必要であり、通常はroot/Administrator権限が必要です (Rawソケットアクセスが必要なため)。

sudo nmap -O target.example.com

出力例 (-O を追加):

... (Port scan results) ...
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8
Network Distance: 1 hop

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

Nmapは推測されるOS名、カーネルバージョン範囲、およびCPE (Common Platform Enumeration) 形式で表示します。OS検出の精度は100%ではありません。ファイアウォールやOSのカスタマイズによってフィンガープリントが変化し、誤判定することもあります。--osscan-guess または --fuzzy オプションを使用すると、より積極的な推測を行いますが、精度は低下します。

Nmap Scripting Engine (NSE) 🚀

Nmapの最も強力な機能の一つが、Nmap Scripting Engine (NSE) です。これは、ユーザーがLua言語で記述されたスクリプトを実行し、Nmapの機能を拡張できる仕組みです。NSEスクリプトは、以下のような多様なタスクを実行できます。

  • より高度なバージョン検出
  • 脆弱性検出 (特定のCVEに対応するチェックなど)
  • バックドアの検出
  • ネットワークサービスの情報のさらなる探索 (例: SMB共有リスト、HTTPヘッダ、SNMP情報取得)
  • 認証情報のブルートフォース (注意して使用!)

NSEスクリプトを使用するには、-sC または --script オプションを指定します。

  • -sC: デフォルトカテゴリのスクリプトを実行します。これは --script=default と同等で、比較的高速で安全、かつ有用なスクリプト群が選択されます。初学者におすすめです。
    sudo nmap -sC target.example.com
  • --script=<スクリプト名 or カテゴリ or ディレクトリ or 式>: 特定のスクリプトやカテゴリを指定して実行します。
    • 特定のスクリプト: --script=http-title (HTTPサーバーのタイトルを取得)
    • 複数のスクリプト: --script=http-title,smb-os-discovery
    • カテゴリ: --script=vuln (脆弱性関連のスクリプトを実行)
    • ワイルドカード: --script=smb-* (smb-で始まるすべてのスクリプト)
    • 論理式: --script="default and not intrusive"

利用可能なスクリプトはNmapのインストールディレクトリ内の scripts フォルダにあります。どのようなスクリプトがあるか、またカテゴリは以下のコマンドで確認できます。

ls $(nmap --datadir)/scripts/
nmap --script=help

主要なスクリプトカテゴリには以下のようなものがあります。

  • auth: 認証情報 (匿名ログインなど) を発見しようとするスクリプト。
  • broadcast: ローカルネットワーク上のホスト発見や情報収集を行うスクリプト。
  • brute: サービスへのブルートフォース攻撃を行うスクリプト (使用には最大限の注意が必要)。
  • default: -sC で実行される、基本的で安全なスクリプト群。
  • discovery: ネットワーク上のサービスに関する詳細情報を発見するスクリプト (例: SNMP情報、DNS名)。
  • dos: サービス拒否 (DoS) 攻撃の脆弱性をチェックするスクリプト (危険な可能性あり)。
  • exploit: 既知の脆弱性を利用しようとするスクリプト (非常に危険、許可なく使用厳禁)。
  • external: 外部のデータベースやリソースを参照するスクリプト。
  • fuzzer: 予期せぬ入力を送信してサービスをクラッシュさせようとするファジングスクリプト。
  • intrusive: ターゲットシステムに負荷をかけたり、クラッシュさせたりするリスクがあるスクリプト (defaultには含まれない)。
  • malware: ターゲットがマルウェアに感染しているか、バックドアがないかをチェックするスクリプト。
  • safe: ターゲットに悪影響を与える可能性が低いスクリプト。
  • version: -sV と組み合わせて、より詳細なバージョン情報を取得するスクリプト。
  • vuln: 既知の脆弱性をチェックするが、exploitはしないスクリプト。セキュリティ監査でよく使われる。

例: デフォルトスクリプトとバージョン検出を組み合わせる

sudo nmap -sV -sC target.example.com

例: 既知の脆弱性をチェックする (慎重に!)

sudo nmap --script vuln target.example.com

NSEの出力は、通常のポート情報の後に Host script results: や、各ポート情報の下に表示されます。

タイミングとパフォーマンス (`-T`)

Nmapのスキャン速度は、ネットワーク環境やターゲットホストの応答、そして検知回避の必要性に応じて調整する必要があります。-T<0-5> オプションで、タイミングテンプレートを選択できます。

  • -T0 (Paranoid): 非常に遅い。IDS回避を最優先。シリアルポート経由のような速度。
  • -T1 (Sneaky): かなり遅い。IDS回避向け。
  • -T2 (Polite): 低速。帯域消費を抑え、IDS回避も少し意識。
  • -T3 (Normal): デフォルト。ネットワークの状況に応じて動的に速度を調整。
  • -T4 (Aggressive): 高速。ターゲットが高速で信頼性のあるネットワーク上にあることを想定。IDSに検知されやすい。
  • -T5 (Insane): 超高速。非常に高速なネットワーク、または速度が最優先される場合に。パケットロスや誤検知のリスクが高まる。

通常はデフォルト (-T3) で問題ありませんが、スキャンが遅すぎると感じたり、逆にネットワークに負荷をかけすぎている場合は、-T4-T2 を試すと良いでしょう。-T0, -T1, -T5 は特別な状況でのみ使用します。

# アグレッシブモードでスキャン
sudo nmap -T4 target.example.com

# 丁寧モードでスキャン
sudo nmap -T2 target.example.com

より細かなタイミング制御のために、--min-rate, --max-rate, --max-retries, --scan-delay などのオプションも存在します。

出力フォーマット

スキャン結果を後で分析したり、他のツールと連携したりするために、Nmapは様々な出力フォーマットをサポートしています。-oN, -oX, -oG, -oA などのオプションで指定します。

  • -oN : ノーマル出力。コンソールに表示されるのと同じ形式でファイルに保存します。人間が読みやすい形式です。
  • -oX : XML出力。構造化されたXML形式で保存します。プログラムでの処理や、他のツール (Metasploit, Nessusなど) との連携に適しています。
  • -oG : Grep可能出力。1行に1ホストの情報がまとめられた形式で、grep, awk, cut などのコマンドラインツールで処理しやすいように設計されています。現在はXML出力の方が推奨されることが多いです。
  • -oA : 全フォーマット出力。ノーマル (.nmap), XML (.xml), Grep可能 (.gnmap) の3つの形式で同時に保存します。ファイル名は指定したベース名に基づいて自動生成されます。
# XML形式で results.xml に保存
sudo nmap -sV -sC -oX results.xml target.example.com

# 全フォーマットで scan_results というベース名で保存
sudo nmap -sV -sC -oA scan_results target.example.com
# -> scan_results.nmap, scan_results.xml, scan_results.gnmap が生成される

ファイアウォール/IDS回避技術 (注意点あり)

高度なネットワークでは、ファイアウォール (FW) や侵入検知システム (IDS), 侵入防御システム (IPS) がNmapのスキャンを検知し、ブロックしたりアラートを上げたりすることがあります。Nmapには、これらの防御メカニズムを回避しようと試みるためのオプションもいくつか用意されていますが、その効果は限定的であり、現代の高度なセキュリティ機器に対しては通用しないことも多い点に注意が必要です。また、これらの技術の使用は、ターゲットシステムに予期せぬ負荷を与えたり、不正アクセスと見なされるリスクを高めたりする可能性があります。

  • -f: フラグメントスキャン。IPパケットを小さなフラグメント (断片) に分割して送信します。古いFWやIDSは、再構成されたパケットを正しく検査できない場合がありました。--mtu オプションでフラグメントサイズを指定することもできます。
  • -D : デコイ。スキャンパケットに、偽の送信元IPアドレス (デコイ) を混ぜて送信します。ターゲットからは、複数のホストからスキャンされているように見え、真の送信元を特定しにくくします。ME は自分の真のIPアドレスを示すキーワードです。
    # decoy1, decoy2, 自分のIP, decoy3 からスキャンしているように見せかける
    sudo nmap -sS target.example.com -D decoy1,decoy2,ME,decoy3
  • -S : 送信元IPアドレス偽装。送信元IPアドレスを指定したものに偽装します。通常、応答パケットは偽装したIPアドレスに送られるため、直接結果を受け取ることはできません。特殊な状況 (例: 信頼関係のあるホストになりすます) で使われることがありますが、非常に検知されやすく、多くのネットワークではブロックされます。
  • -g or --source-port : 送信元ポート指定。スキャンに使用する送信元ポートを指定します。一部のFW設定では、特定の送信元ポート (例: DNSクエリの53番) からの通信を許可している場合があり、これを利用してFWを通過しようと試みます。
  • --data-length : 送信するパケットにランダムなデータを付加します。通常のNmapスキャンとは異なるパケットに見せることで、シグネチャベースのIDS検知を回避しようとします。
  • --spoof-mac : MACアドレス偽装。ARPスキャンなど、ローカルネットワークでのスキャン時に送信元MACアドレスを偽装します (例: --spoof-mac 0 でランダムなMAC、--spoof-mac Apple でApple製デバイスのMAC)。
  • タイミングオプション (-T0, -T1, --scan-delay など) を使ってスキャン速度を極端に遅くすることも、IDSの閾値ベースの検知を回避する試みの一つです。

⚠️ 回避技術に関する警告

これらの回避技術は、主に学習目的や、許可されたペネトレーションテストの範囲内で、FW/IDSのルールセットを理解・検証するために使用されるべきです。許可なく他者のネットワークに対してこれらの技術を使用することは、不正アクセスとみなされる可能性が非常に高いです。また、現代のセキュリティシステムはこれらの技術の多くを検知・ブロックするように設計されています。

実践的な例

これまでに学んだオプションを組み合わせて、より具体的なタスクを実行してみましょう。

例1: ローカルネットワーク (192.168.1.0/24) 内で、Webサーバー (ポート80, 443) が動作しているホストを特定し、バージョン情報も取得する

sudo nmap -sV -p 80,443 192.168.1.0/24 -oA web_servers_scan

例2: 特定のホスト (target.example.com) に対して、デフォルトスクリプトと脆弱性スキャンスクリプトを実行し、OSとバージョン情報も取得する (時間はかかる可能性あり)

sudo nmap -sV -O --script="default,vuln" target.example.com -oA full_vuln_scan

例3: ネットワーク (10.0.0.0/16) 内のオンラインホストを高速にリストアップする (ポートスキャンなし)

sudo nmap -sn -T4 10.0.0.0/16 -oN alive_hosts.txt

倫理的な注意点と法的側面 (最重要)

Nmapは非常に強力なツールですが、その力を責任を持って使用することが極めて重要です。

🚨 絶対に許可なく他者のネットワークをスキャンしないこと!

あなたが管理権限を持っていない、あるいは明確かつ書面による許可を得ていないネットワークやホストに対してNmapスキャンを実行することは、多くの国や地域で違法行為 (不正アクセス禁止法など) とみなされる可能性があります。また、利用しているISPやクラウドサービスの利用規約に違反する場合もあります。

Nmapの使用は、以下の範囲に限定してください。
  • あなた自身が所有し、管理しているネットワークやホスト。
  • 雇用主やクライアントから、ペネトレーションテストなどの業務として、書面で明確な許可を得ている範囲。
  • Nmap公式のテストサイト (scanme.nmap.org) や、学習用に提供されている意図的に脆弱な仮想マシン (例: Metasploitable, OWASP Juice Shopなど) を自身で構築した環境。
許可されていないスキャンは、たとえ悪意がなくても、相手に混乱や損害を与えたり、法的措置を招いたりする可能性があります。絶対に避けてください。

また、スキャンを行う際には、ターゲットネットワークに過度の負荷をかけないように注意することも重要です。特に -T5 (Insane) や、多数のホストに対する広範囲なスキャン、intrusivedos カテゴリのNSEスクリプトの使用は、サービス停止を引き起こすリスクがあります。

まとめ:Nmapを使いこなすために

Nmapは、ネットワークの探索、セキュリティ監査、トラブルシューティングにおいて、計り知れない価値を持つツールです。基本的なスキャンから、サービス・OS検出、強力なNSEまで、その機能は多岐にわたります。👍

本記事では、Nmapの基本的な使い方と主要な機能について解説しました。しかし、Nmapの世界はさらに奥深く、ここで紹介したオプションやテクニックは全体の一部にすぎません。公式ドキュメント (Nmap Reference Guide) は非常に詳細で有用な情報源ですので、ぜひ参照してください。

効果的にNmapを使いこなすためには、TCP/IPプロトコルやネットワークの基礎知識を深めることが役立ちます。様々なオプションを試し、その結果を分析することで、ツールの挙動やネットワークの反応についての理解が深まります。

そして最も重要なことは、常に倫理観と責任感を持ち、法律とルールを遵守してNmapを使用することです。技術的な好奇心と倫理的な配慮のバランスを取りながら、この強力なツールを有効活用していきましょう。😊

コメント

タイトルとURLをコピーしました