Nmap Scripting Engine (NSE) の基礎

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

はじめに

この実験では、Nmap を単純なポートスキャナーから多機能な監査ツールへと進化させます。Nmap の最も強力で柔軟な機能の一つである Nmap Scripting Engine (NSE) について学びます。

NSE を使用すると、ユーザーは単純なスクリプトを作成・共有して、さまざまなネットワークタスクを自動化できます。これらのスクリプトは、Nmap に期待される速度と効率性を維持したまま並列実行されます。この実験を終える頃には、Linux システム上でこれらのスクリプトの場所を特定する方法、デフォルトの非侵入型スクリプトを実行する方法、そして特定のスクリプトを実行して HTTP Web ページのタイトルなどの情報を自動的に抽出する方法を習得しているはずです。

NSE が重要なのは、Nmap を単なるマッパーから小規模な監査プラットフォームへと変貌させるからです。ポートが見つかると、スクリプトを使用して、別のツールをすぐに起動することなく、アプリケーションに関するより詳細な情報を取得できます。

NSE スクリプトの場所を特定する

このステップでは、Nmap がスクリプトをどこに保存しているか、また特定のスクリプトを検索する方法を学びます。

Nmap Scripting Engine (NSE) は、Lua プログラミング言語で書かれたスクリプトを使用します。Linux システムに Nmap をインストールすると、基本的なネットワーク探索から複雑な脆弱性攻撃まで、数百ものスクリプトがプリインストールされます。

スクリプトの場所を知ることは、防御側とテスト側の両方にとって、ターゲットに対して実際にどのようなロジックが実行されているかを理解するために役立ちます。

デフォルトでは、Nmap はすべての NSE スクリプトを /usr/share/nmap/scripts/ ディレクトリに保存します。このディレクトリの内容をリスト表示して、何が利用可能かを確認できます。

次のコマンドを実行して、ディレクトリ内の最初のいくつかのスクリプトをリスト表示します。

ls /usr/share/nmap/scripts/ | head -n 10

以下のような出力が表示されます。

acarsd-info.nse
address-info.nse
afp-brute.nse
afp-ls.nse
afp-path-vuln.nse
afp-serverinfo.nse
afp-showmount.nse
ajp-auth.nse
ajp-brute.nse
ajp-headers.nse

すべてのファイルが .nse 拡張子で終わっていることに注目してください。これは Nmap Scripting Engine を表しています。

600 以上のスクリプトが存在するため、特定のサービスに関連するスクリプトを検索すると便利です。例えば、HTTP (Web サーバー) に関連するスクリプトを探したい場合は、grep コマンドを使用して結果をフィルタリングできます。

次のコマンドを実行して、HTTP 関連のスクリプトを探します。

ls /usr/share/nmap/scripts/ | grep http | head -n 10

これにより、Web ページのタイトルを取得する http-title.nse や、認証メカニズムをチェックする http-auth.nse など、Web サーバーと対話するように設計されたスクリプトのリストが表示されます。

デフォルトスクリプトの実行 (-sC)

このステップでは、Nmap のデフォルトスクリプトセットを実行する方法を学びます。

Nmap は、その目的と侵入度に基づいてスクリプトを異なるグループに分類しています。default カテゴリには、安全で高速、かつ信頼性が高いと見なされるスクリプトが含まれています。これらは、ターゲットを積極的に攻撃したりサービスを中断させたりすることなく、有用な情報を収集します。

カテゴリ分けは、実際にはリスクと意図の分類です。これにより、利用可能なすべてのスクリプトを無差別に実行するのではなく、状況に適したスクリプトを選択できるようになります。

デフォルトのスクリプトセットを実行するには、-sC フラグを使用します。これは --script=default と入力するのと同じです。

この実験では、軽量な Web サーバーがバックグラウンドのポート 8080 で起動しており、標準の SSH サービスがポート 22 で実行されています。デフォルトスクリプトを使用して、ローカルマシン (localhost) のこれらの特定のポートをスキャンしてみましょう。

次のコマンドを実行します。

nmap -sC -p 22,8080 localhost

以下のような出力が表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-09 14:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00013s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy
|_http-title: LabEx Nmap NSE Target

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

出力をよく見てください。ポート 8080 の下で、Nmap が自動的に http-title スクリプトを実行し、Web ページのタイトル「LabEx Nmap NSE Target」を正常に抽出しました。Nmap はこれらのデフォルトスクリプトを使用して、開いているポートに関する情報をシームレスに収集します。

これは、-sC フラグがいかに簡単に Nmap を単純なポートスキャナーから情報収集ツールへとアップグレードできるかを示しています。

特定のカテゴリのスクリプトを実行する

このステップでは、--script 引数を使用して、特定のスクリプトやスクリプトのカテゴリ全体を実行する方法を学びます。

デフォルトスクリプト (-sC) は一般的な偵察には最適ですが、ターゲットを絞ったタスクのために特定のスクリプトを実行する必要がある場合もあります。これは、スクリプト名を --script 引数に渡すことで実現できます。

例えば、他のデフォルトスクリプトを実行せずに、ポート 8080 で実行されている Web サーバーの HTTP タイトルだけを取得したい場合は、http-title スクリプトを直接指定できます。

次のコマンドを実行します。

nmap --script=http-title -p 8080 localhost

出力は非常に限定的で、ポートの状態と http-title スクリプトの結果のみが表示されます。

Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-09 14:56 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
8080/tcp open  http-proxy
|_http-title: LabEx Nmap NSE Target

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

個別のスクリプト名に加えて、スクリプトのカテゴリを指定することもできます。Nmap はスクリプトを safe、intrusive、vuln (脆弱性検出)、discovery、exploit などのカテゴリに分類しています。

次のコマンドを実行して、ポート 8080 に対してすべての safe スクリプトを実行します。

nmap --script=safe -p 8080 localhost

注意: スクリプトのカテゴリ全体を実行すると、ネットワーク環境やそのカテゴリ内のスクリプト数によっては、かなりの時間(9 分以上かかることもあります!)がかかる場合があります。一部のスクリプトはタイムアウトを待機することもあります。待ちたくない場合は、Ctrl+C を押してスキャンをキャンセルし、このステップをスキップしてください。

出力には HTTP タイトルが含まれますが、正確な Nmap のバージョンや環境によっては、他の安全なチェック結果も含まれる場合があります。

Starting Nmap 7.80 ( https://nmap.org ) at 2026-03-09 14:56 CST
Pre-scan script results:
| targets-asn: 
|_  targets-asn.asn is a mandatory parameter
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).
Other addresses for localhost (not scanned): ::1

PORT     STATE SERVICE
8080/tcp open  http-proxy
|_http-date: Mon, 09 Mar 2026 06:57:04 GMT; 0s from local time.
|_http-fetch: Please enter the complete path of the directory to save data in.
| http-headers: 
|   Server: SimpleHTTP/0.6 Python/3.10.12
|   Date: Mon, 09 Mar 2026 06:57:03 GMT
|   Content-type: text/html
|   Content-Length: 103
|   Last-Modified: Mon, 09 Mar 2026 06:55:32 GMT
|   
|_  (Request type: HEAD)
|_http-title: LabEx Nmap NSE Target

Host script results:
| dns-blacklist: 
|   SPAM
|     list.quorum.to - SPAM
|     l2.apews.org - FAIL
|_    bl.nszones.com - SPAM
|_fcrdns: FAIL (No PTR record)
| resolveall: 
|   Host 'localhost' also resolves to:
|   Use the 'newtargets' script-arg to add the results as targets
|_  Use the --resolve-all option to scan all resolved addresses without using this script.
| unusual-port: 
|_  WARNING: this script depends on Nmap's service/version detection (-sV)

Post-scan script results:
| reverse-index: 
|_  8080/tcp: 127.0.0.1
Nmap done: 1 IP address (1 host up) scanned in 551.51 seconds

--script 引数を使用することで、監査プロセスを細かく制御でき、特定のセキュリティテストのニーズに合わせてスキャンを調整できるようになります。

まとめ

おめでとうございます!Nmap Scripting Engine (NSE) の基礎実験を無事に完了しました。

この実験では、以下のことを学びました。

  • NSE スクリプトのデフォルトディレクトリ (/usr/share/nmap/scripts/) を特定し、標準の Linux コマンドを使用して特定のスクリプトを検索する方法。
  • -sC フラグを使用して、デフォルトの安全なスクリプト群を実行し、SSH ホストキーや HTTP Web ページのタイトルなどの情報を自動的に収集する方法。
  • --script 引数を使用して、個別のスクリプトを名前で実行したり、スクリプトのカテゴリ全体を実行したりすることで、ネットワーク監査タスクを正確に制御する方法。

これらの基礎スキルを身につけることで、今後のネットワーク探索やペネトレーションテストにおいて、Nmap を強力な自動化セキュリティ監査ツールとして活用できるようになります。