はじめてのNSEスクリプト

提供: セキュリティ
2014年7月17日 (木) 20:14時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

ここでは、nmap用のHello World的なNSEスクリプトを説明します。スキャンを行うのではなく、ただ単にHelloを表示します。

読み方

NSEスクリプト
えぬえすいーすくりぷと

概要

ここで出てくるスクリプトは、特別なスキャンしたりしません。 このスクリプトは、単に以下のことをするためのスクリプトです。

  • デバッグメッセージで Hello world を表示する
  • スキャン結果として Hello NSE を表示する

NSEのスケルトンスクリプトとして利用できます。

nmapのバージョン

nmap 6.46 でテストしてあります。

NSEスクリプトの構造

NSEスクリプトは、

  • 5つのフィールド
  • 1つのルールセクション
  • 1つのアクション

から成り立ちます。

フィールド

description
スクリプトの説明
author
スクリプトの製作者
license
ライセンス
categories
スクリプトが属するカテゴリ
dependencies
省略可能なフィールドです。先に実行したいスクリプトを指定します。

ルールセクション

ルールセクションは、特定のサービス、ホストに対してスクリプトの動作を実行、もしくは、スキップするか決定します。

portrule
スキャンを実行する対称(port)を指定します。
hostrule
スキャンするホスト(ホストやIPアドレス)を指定します。

アクション関数

NSEスクリプトのメイン部分です。アクション関数の戻り値がnmapの出力になります。

インストール

事前にnmapをインストールしてください。

hello.nse

description = [[
Hello NSE script
]]
 
author = "Kaoru";
license = ""
categories = {"default,safe"}
 
local shortport = require "shortport"
local stdnse = require "stdnse"
 
portrule = shortport.port_or_service ({80,443}, {"http","https"})
 
action = function (host, port)
        stdnse.print_debug(1, "Hello world")
        return "Hello NSE"
end

使い方

実行するNSEスクリプトの指定は、 nmapの--scriptオプションで指定します。 ローカルホストの80ポートに hello.nse スクリプトを実行するには、以下のコマンドラインを実行します。

$ nmap --script ./hello.nse localhost -p 80

hello.nse の実行例

以下、コマンドラインでの実行例です。

$ nmap --script ./hello.nse localhost -p 80
 
Starting Nmap 6.46 ( http://nmap.org ) at 2014-07-17 19:53 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00021s latency).
PORT   STATE SERVICE
80/tcp open  http
|_hello: Hello NSE
 
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

このようにメッセージが表示できました。

80/tcp open  http
|_hello: Hello NSE

デバッグ実行の例

デバッグメッセージも表示する例です。出力が多くて、わかりにくいですが、

NSE: Hello world

と真ん中あたりで表示されています。 デバッグモードでnmapを起動するには、 -d オプションを使用します。

$nmap --script ./hello.nse localhost -p 80 -d
 
Starting Nmap 6.46 ( http://nmap.org ) at 2014-07-17 19:54 JST
--------------- Timing report ---------------
  hostgroups: min 1, max 100000
  rtt-timeouts: init 1000, min 100, max 10000
  max-scan-delay: TCP 1000, UDP 1000, SCTP 1000
  parallelism: min 0, max 0
  max-retries: 10, host-timeout: 0
  min-rate: 0, max-rate: 0
---------------------------------------------
NSE: Using Lua 5.2.
NSE: Script Arguments seen from CLI:
NSE: Loaded 1 scripts for scanning.
NSE: Script Pre-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Initiating Ping Scan at 19:54
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 19:54, 0.00s elapsed (1 total hosts)
Overall sending rates: 1501.50 packets / s.
mass_rdns: Using DNS server 192.168.60.2
Initiating Connect Scan at 19:54
Scanning localhost (127.0.0.1) [1 port]
Discovered open port 80/tcp on 127.0.0.1
Completed Connect Scan at 19:54, 0.00s elapsed (1 total ports)
Overall sending rates: 1104.97 packets / s.
NSE: Script scanning 127.0.0.1.
NSE: Starting runlevel 1 (of 1) scan.
NSE: Starting hello against localhost (127.0.0.1:80).
Initiating NSE at 19:54
NSE: Hello world
NSE: Finished hello against localhost (127.0.0.1:80).
Completed NSE at 19:54, 0.00s elapsed
Nmap scan report for localhost (127.0.0.1)
Host is up, received unknown-response (0.00042s latency).
Scanned at 2014-07-17 19:54:57 JST for 0s
PORT   STATE SERVICE REASON
80/tcp open  http    no-response
|_hello: Hello NSE
Final times for host: srtt: 415 rttvar: 3803  to: 100000
 
NSE: Script Post-scanning.
NSE: Starting runlevel 1 (of 1) scan.
Read from /usr/local/share/nmap: nmap-payloads nmap-services.
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds

もう少し実用的なNSEスクリプトの入門

今回は、まったくスキャン活動をしないスクリプトの例でした。実際のスキャンを行うスクリプトの入門には、 NSEスクリプトでApacheのバージョンを取得する をご参照ください。

関連項目




スポンサーリンク