LinuxでNmapスクリプトエンジン(NSE)スクリプトを使用する方法
Nmapは、人気があり、強力で、クロスプラットフォームのコマンドラインネットワークセキュリティスキャナーおよび探索ツールです。ネットワークに接続されているシステムの概要を把握するのにも役立ちます。これを使用して、稼働中のホストのすべてのIPアドレスを特定し、オープンポートやそれらのホストで実行されているサービスをスキャンすることができます。そのほかにも多くのことが可能です。
Nmapの興味深い特徴の一つは、Nmap Script Engine(NSE)であり、これによりさらに柔軟性と効率性がもたらされます。これを使うことで、Luaプログラミング言語で独自のスクリプトを書くことができ、他のNmapユーザーとこれらのスクリプトを共有することも可能です。
関連記事: Linux用のNmapコマンドの29の実用的な例
NSEスクリプトには4つのタイプがあります。
- プリールールスクリプト – は、Nmapのスキャン操作の前に実行されるスクリプトであり、Nmapがターゲットに関する情報をまだ収集していないときに実行されます。
- ホストスクリプト – Nmapがターゲットホストに対して通常の操作(ホスト探索、ポートスキャン、バージョン検出、OS検出)を実行した後に実行されるスクリプトです。
- サービススクリプト – 特定のサービスに対して実行されるスクリプトで、ターゲットホスト上でリッスンしています。
- ポストルールスクリプト – Nmapがすべての対象ホストをスキャンした後に実行されるスクリプトです。
これらのスクリプトは、認証用(auth)、ホストの発見用(broadcast)、認証資格情報を推測するためのブルートフォース攻撃用(brute)、ネットワークに関する情報をさらに発見するための(discovery)、サービスの拒否を引き起こすための(dos)、いくつかの脆弱性を悪用するための(exploit)などのさまざまなカテゴリにグループ化されます。いくつかのスクリプトはデフォルトカテゴリに属しています。
注意: これ以上進む前に、以下の重要なポイントに注意してください。
- 信頼できる著者以外の第三者からのスクリプトは、注意深く確認することなく実行しないでください。これらのスクリプトはサンドボックス内で実行されず、予期しない形でシステムを損傷したり、プライバシーを侵害したりする可能性があるためです。
- 第二に、これらのスクリプトの多くは、強い
またはpostruleスクリプトとして実行される可能性があります。これを考慮して、一貫性の目的のためにpreruleを使用することが推奨されます。prerule - Nmapは、利用可能なデフォルトのスクリプトとカテゴリを特定するために、scripts/script.db データベースを使用します。
利用可能なNSEスクリプトの位置を確認するには、ターミナルでlocateユーティリティを次のように実行します:
$ locate *.nse
/usr/share/nmap/scripts/acarsd-info.nse
/usr/share/nmap/scripts/address-info.nse
/usr/share/nmap/scripts/afp-brute.nse
/usr/share/nmap/scripts/afp-ls.nse
/usr/share/nmap/scripts/afp-path-vuln.nse
/usr/share/nmap/scripts/afp-serverinfo.nse
/usr/share/nmap/scripts/afp-showmount.nse
/usr/share/nmap/scripts/ajp-auth.nse
/usr/share/nmap/scripts/ajp-brute.nse
/usr/share/nmap/scripts/ajp-headers.nse
/usr/share/nmap/scripts/ajp-methods.nse
/usr/share/nmap/scripts/ajp-request.nse
/usr/share/nmap/scripts/allseeingeye-info.nse
/usr/share/nmap/scripts/amqp-info.nse
/usr/share/nmap/scripts/asn-query.nse
...
NSEスクリプトは、--scriptフラグを使用してロードされ、カテゴリ、スクリプトファイル名、またはスクリプトが配置されているディレクトリの名前を提供することで、自分自身のスクリプトを実行することもできます。
スクリプトを有効にするための構文は以下の通りです:
$ nmap -sC target #load default scripts
OR
nmap --script filename|category|directory|expression,... target
--script-help オプションを使用すると、スクリプトの説明を見ることができます。さらに、--script-args および --script-args-file オプションを通じて、一部のスクリプトに引数を渡すことができます。後者はコマンドライン引数ではなく、ファイル名を指定するために使用されます。
デフォルトのスクリプトのほとんどを使用してスキャンを実行するには、-sCフラグを使用するか、代わりに--script=defaultを使用してください。
$ nmap -sC scanme.nmap.org
OR
nmap --script=default scanme.nmap.org
OR
nmap --script default scanme.nmap.org
サンプル出力
Starting Nmap 7.01 ( https://nmap.org ) at 2017-11-15 10:36 IST
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.0027s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE
80/tcp open http
|_http-title: Go ahead and ScanMe!
Nmap done: 1 IP address (1 host up) scanned in 11.74 seconds
スクリプトを適切な目的で使用するには、まずそれが実際に何をするのかの簡単な説明を得ることができます。例えば、http-headersのように。
$ nmap --script-help http-headers scanme.nmap.org
サンプル出力
Starting Nmap 7.01 ( https://nmap.org ) at 2017-11-15 10:37 IST
http-headers
Categories: discovery safe
https://nmap.org/nsedoc/scripts/http-headers.html
Performs a HEAD request for the root folder ("/") of a web server and displays the HTTP headers returned.
NSEスクリプトを読み込んでNmapスキャンを実行する
下記に説明されている異なる方法でスキャンを実行するために、スクリプトを選択または読み込むことができます。
スクリプト名を使用する
スクリプトが何をするかを知っていれば、それを使ってスキャンを実行できます。1つのスクリプトを使用するか、カンマ区切りのスクリプト名のリストを入力することができます。以下のコマンドを使用すると、ターゲットホストのウェブサーバーに設定されたHTTPヘッダーを表示できます。
$ nmap --script http-headers scanme.nmap.org
Starting Nmap 7.01 ( https://nmap.org ) at 2017-11-15 10:39 IST
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.27s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
| http-headers:
| Date: Wed, 15 Nov 2017 05:10:04 GMT
| Server: Apache/2.4.7 (Ubuntu)
| Accept-Ranges: bytes
| Vary: Accept-Encoding
| Connection: close
| Content-Type: text/html
|
|_ (Request type: HEAD)
179/tcp filtered bgp
31337/tcp open Elite
Nmap done: 1 IP address (1 host up) scanned in 20.96 seconds
カテゴリを使用する
カテゴリーからスクリプトを読み込むことも、カンマ区切りのリストからのスクリプトを読み込むこともできます。この例では、ホスト192.168.56.1でスキャンを実行するために、デフォルトおよびブロードキャストカテゴリーのすべてのスクリプトを使用しています。
$ nmap --script default,broadcast 192.168.56.1
*ワイルドカードを使用する
これは、特定の名前パターンを持つスクリプトを選択したいときに便利です。たとえば、sshで始まる名前のスクリプトをすべて読み込むには、ターミナルで以下のコマンドを実行します:
$ nmap --script "ssh-*" 192.168.56.1
ブール式を使用する
ブーリアン式を使用してスクリプトを選択することもできます。これにはand、or、およびnot演算子を使用して構築することができます。また、ブーリアン式の名前は、カテゴリー、script.dbのファイル名、またはすべてである可能性があります。
次のコマンドは、デフォルトまたは放送カテゴリーからスクリプトをロードします。
$ nmap --script "default or broadcast" 192.168.56.10
これは次と同じです:
$ nmap --script default,broadcast 192.168.56.10
脆弱性カテゴリに含まれないすべてのスクリプトを読み込むには、ターミナルでこのコマンドを実行してください。
$ nmap --script "not vuln" 192.168.56.10
次のコマンドは少し複雑に見えますが、理解するのは簡単です。これはデフォルトまたは放送カテゴリのスクリプトを選択し、ssh-:で始まる名前のものは除外します。
$ nmap --script "(default or broadcast) and not ssh-*" 192.168.56.10
重要なのは、カテゴリ、スクリプト名、自分のカスタムスクリプトを含むディレクトリ、またはブール式を組み合わせて、次のようにスクリプトをロードすることが可能であるということです。
$ nmap --script broadcast,vuln,ssh-auth-methods,/path/to/custom/scripts 192.168.56.10
NSEスクリプトに引数を渡す
次に、–script-argsオプションを使用してスクリプトに引数を渡す方法の例を示します:
$ nmap --script mysql-audit --script-args "mysql-audit.username='root', \
mysql-audit.password='password_here', mysql-audit.filename='nselib/data/mysql-cis.audit'"
ポート番号を指定するには、-p nmapオプションを使用します。
$ nmap -p 3306 --script mysql-audit --script-args "mysql-audit.username='root', \
mysql-audit.password='password_here' , mysql-audit.filename='nselib/data/mysql-cis.audit'"
上記のコマンドは、CIS MySQL v1.0.2 ベンチマークの一部に対して MySQL データベースサーバーのセキュリティ構成を監査します。また、他の MySQL 監査用の便利なカスタム監査ファイルを作成することもできます。
今のところそれだけです。Nmapのマニュアルページでさらに情報を見つけるか、NSEの使用方法を確認してください。
自分のNSEスクリプトを書き始めるために、このガイドを確認してください: https://nmap.org/book/nse-tutorial.html
結論
Nmapは、すべてのシステムまたはネットワーク管理者がセキュリティの武器として必要とする非常に強力で便利なツールです。NSEはそれにさらなる効率を加えます。
この記事では、Nmapスクリプトエンジンについて紹介し、さまざまなカテゴリの下で利用可能なスクリプトを見つけて使用する方法を見てきました。ご質問がある場合は、下のコメントフォームからお気軽にお問い合わせください。

