出力

セキュリティツールの実用性は、生成される出力で決まる。複雑なテストやアルゴリズムも、結果が整理された、わかりやすい形で提示されなければ、ほとんど価値はない。ユーザや他のソフトウェアによるNmapの使い方がこれほど数多くあることを考えると、たった1つですべてのユーザが満足するようなフォーマットが存在するはずもない。そこでNmapには、人間が直接読めるようにしたインタラクティブ方式や、ソフトウェアで簡単に解析できるXML方式などのさまざまな出力フォーマットが用意されている。

Nmapには様々な出力フォーマットが備わっているだけでなく、出力やデバッグメッセージの冗長性を制御するオプションも用意されている。出力結果は標準出力(stdout)や指定したファイルに送られる。ファイルにはデータを追加したり上書きしたりできる。また、出力ファイルは、中断したスキャンを再開するためにも使われる。

Nmapの出力は、5種類のフォーマットが利用できる。デフォルトはinteractive output(インタラクティブ出力)と呼ばれるもので、標準出力に送られる。また、出力には、normal output(通常出力)というのがある。これは、インタラクティブに似ているが、異なる点は、実行時間情報や警告が表示される回数が少ないことである。その理由は、この出力が、インタラクティブにではなくて、スキャン完了後に解析するために提供されるものだからである。

XML出力は、最も重要な出力タイプの1つであり、HTMLに変換し、NmapのGUIやデータベースにインポートして、プログラムで容易に解析できる。

残り2つの出力タイプは、grepで検索可能なシンプルな出力で、ターゲットホストに関するほとんどの情報が1行で表示されるものと、自分のことを>sCRiPt KiDDi3だと思うユーザ向けのsCRiPt KiDDi3 0utPUt(出力)だ。

インタラクティブ出力はデフォルトで、関連するコマンドラインオプションはないが、他の4つのフォーマットオプションでは、同じ構文が使われる。取る引数は1つで、結果を保存するファイル名である。複数のフォーマットを指定してもよいが、各フォーマットは1度しか指定できない。例えば、自分の調査用に通常の出力を保存し、同時に同じスキャン結果をプログラムの解析用にXML形式で保存したい場合もあるだろう。これは、-oX myscan.xml -oN myscan.nmapというオプションを使って実行できる。なお、ここでは簡潔にするためにmyscan.xmlのような単純なファイル名を用いているが、通常はもっと説明的な名前にするのが推奨されている。どのようなファイル名にするかは、個人の好みの問題だが、筆者はスキャンの実施日と簡単なコメントを組み入れた長い名前を使い、スキャン対象の企業名にちなんだ名前のディレクトリに入れている。

これらのオプションは結果をファイルに保存するが、同時にNmapは通常通りインタラクティブ出力を標準出力(stdout)に書き出している。例えば、nmap -oX myscan.xml targetというコマンドで、XML出力がmyscan.xmlに書き込まれ、同じ結果のインタラクティブ出力が標準出力に書き出される。この出力は、-oXが指定されなかった場合でも行われる。ハイフン(-)文字を引数としてフォーマットタイプの1つに渡すと、これを変更することができる。すなわち、Nmapはインタラクティブ出力を停止して、代わりにユーザが指定した形式の結果を、標準出力ストリーム(stdout)に書き出すことになる。nmap -oX - targetというコマンドでは、XML出力だけがstdoutに送られる。この場合も、重大なエラーは標準エラーストリーム(stderr)に書き出される場合がある。

Nmapの一部の引数とは異なり、ログファイルオプションのフラグ(例:-oX)とファイル名やハイフンとの間のスペースは必須である。この注意を無視して、引数を-oG--oG-のように指定したら、Nmapの下位互換機能により、それぞれG-Xscan.xmlという名前の標準フォーマットの出力ファイルが作成される。

またNmapには、スキャン結果の冗長性を制御するオプションや、出力ファイルに上書きしないで追加書き込みするためのオプションも用意されている。これらのオプションについてはすべて以下で説明する。

Nmapの出力フォーマット
-oN <filespec> (通常出力)

通常の出力が指定した名前のファイルに書き込まれるようにする。上で述べた通り、これはインタラクティブ出力と一部異なる。

-oX <filespec> (XML 出力)

XML出力が指定した名前のファイルに書き込まれるようにする。Nmapには文書型定義(DTD)が組み込まれており、XMLパーサーはこれを用いて、NmapのXML出力を検証する。本来はプログラムによる使用を目的としたものだが、人間がNmapのXML出力を解釈するのにも役立つ。DTDには、フォーマットの文法要素が定義されており、これらの要素が取ることのできる属性や値が列挙されていることが多い。最新版は以下から常時入手できる:https://nmap.org/data/nmap.dtd

XMLは、ソフトウェアで容易に解析できる定型書式を提供する。C/C++、Perl、Python、Javaなどを含む、あらゆるメジャーなコンピュータ言語用のXMLパーサーが、フリーで入手できるようになっている。これらの言語のほとんどについては、Nmapの出力と実行に特化して処理するためのバインディングも作成されている。例えば、Perl CPAN(Comprehensive Perl Archive Network)のNmap::ScannerNmap::Parserなどがある。重要なアプリケーションがNmapとインターフェースで連結する場合はほとんど、XMLが推奨フォーマットになる。

XML出力はXSLスタイルシートを参照して、出力結果の書式をHTMLに変換できる。これを使用する最も簡単な方法としては、単にFirefoxやIEなどのWebブラウザでXML出力を読み込むだけでよい。デフォルトでは、これはNmapを実行したマシン上(もしくは同じ構成のマシン)でのみ機能する。これは、nmap.xslのファイルシステムのパスがハードコード化されているためである。Webに接続したマシン上であればHTMLとして表示されるような、移植性のあるXMLファイルを作成する方法については、--stylesheetオプションの項を参照のこと。

-oS <filespec> (ScRipT KIdd|3 oUTpuT)

スクリプトキディ出力は、インタラクティブ出力に似ているが、異なる点は、「l33t HaXXorZ」(leet hacker)向けに後処理してあることだ。Nmapは以前より、一貫性のある大文字やスペルの使い方のせいで、この人たちに見下されてきた。ユーモアを解さない人々は、スクリプトキディの手助けをしているとして筆者に非難の言葉を浴びせる前に、まず気付くべきだ。このオプションが、彼らをからかうためのものだということを。

-oG <filespec> (Grep検索可能出力)

この出力フォーマットを最後に取り上げたのは、廃止予定だからだ。XML出力フォーマットのほうがはるかに強力であり、熟練ユーザにとっての使い勝手もほぼ変わらない。XMLはパーサーの標準で、多数の優れたXMLパーサーが利用可能になっているのに対し、grep可能出力は筆者独自のスクリプトに過ぎない。XMLは拡張性が高く、Nmapの新機能がリリースされるたびに対応可能だが、grep可能出力にはこうした機能を追加する余地がないため、割愛せざるを得ないことも多い。

とはいえやはり、grep可能出力はいまだに広く使われている。各対象ホストが一行ずつ列挙されているというシンプルな形式で、grep、awk、cut、sed、diff、PerlなどのUNIXの標準ツールを使って簡単に検索や解析を行うことができる。筆者も通常、コマンドラインで行うちょっとしたテストのために使用している。sshポートが開いているホストや、Solarisを実行しているホストなどを見つける場合、簡単なgrep検索を行うと、こうしたホストをすべて特定し、パイプでawkやcutコマンドに送って、目的のフィールドを書き出すことができる。

Grep可能出力は、コメント行(パウンド(#)記号で始まる行)とターゲット行で構成される。ターゲット行は、6つのラベル付きフィールドの組み合わせになっており、それぞれのフィールドはタブで区切られ、最後にコロンが付く。各フィールドは、HostPortsProtocolsIgnored StateOSSeq IndexIPIDStatusになっている。

これらのフィールドの中で通常最も重要なのは、Ports(ポート)であり、ここからそれぞれの興味あるポートに関する詳細情報が得られる。ポートエントリのカンマ区切りリストになっており、各ポートエントリは、1つの興味あるポートを表し、7つのスラッシュ(/)で区切られたサブフィールドから成る。各サブフィールドはPort numberStateProtocolOwnerServiceSunRPC infoVersion infoである。

XML出力の場合と同様に、本稿でこのフォーマットのすべてを論ずることはできない。Nmapのgrep可能出力フォーマットについての詳細な解説は以下で入手できる:http://www.unspecific.com/nmap-oG-output

-oA <basename> (全フォーマットに出力する)

簡便のために、-oA <basename>を指定すると、スキャン結果を通常、XML、grep可能の3つのフォーマットで一度に保存できるようにした。それぞれ、<basename>.nmap、<basename>.xml、<basename>.gnmapというファイルに保存される。たいていのプログラムと同じく、以下の例のようにファイル名の前にディレクトリパスを付けることもできる:~/nmaplogs/foocorp/(UNIX)、c:\hacking\sco(Windows)

冗長性とデバッグのオプション
-v (冗長性レベルを上げる)

冗長性レベルを上げて、Nmapが進行中のスキャンに関してさらに多くの情報を書き出すようにする。開きポートは見つかり次第表示され、スキャンの実行に数分以上かかると見なされる場合は予測される完了時間が提示される。2回使用するとさらに冗長レベルは上がるが、3回以上の使用は無効である。

ほとんどの変更の効果が表れるのはインタラクティブ出力だけだが、通常出力とスクリプトキディ出力にも一部効果がある。その他の出力タイプは、コンピュータ処理するための出力なので、ユーザの手を煩わさなくとも、デフォルトでかなり詳細な情報が与えられている。それでも、その他の出力モードでもいくつか変更される点があり、詳細情報を一部省略することで、出力サイズを大幅に減らすことができる。例えば、grep可能出力のコメント行で、スキャン対象の全ポートの一覧表を提供するものは、かなり長くなる可能性があるので、冗長モードでのみ書き出される。

-d <level> (デバッグレベルを上げる/設定する)

冗長モードでも満足する情報が得られない場合は、さらに大量の情報を得るためにデバッグを利用できる。冗長オプション(-v)の場合と同様に、デバッグもコマンドラインのフラグ(-d)で有効になり、これを複数回指定することで、デバッグレベルを上げることができる。もしくは、デバッグレベルは-dに引数として与えることでも設定できる。例えば、-d9でレベル9に設定される。これは最も効果の高いレベルであり、ごく少数のポートやターゲットに対して非常に単純なスキャンを実行するのでない限り、数千行に及ぶ出力が生成される。

デバッグ出力が有用なのは、Nmapにバグがある疑いがある場合や、Nmapが何をなぜ行っているのかについて単純によく分からなくなった場合である。この機能は主に開発者向けのものなので、デバッグ行は必ずしも誰が見てもすぐ分かるわけではない。例えば、このような出力が得られる: Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000。こうした行の内容が理解できない場合は、無視するか、ソースコードを見て調べるか、開発リスト(nmap-dev)に助けを求めるかなどをする他ない。見れば内容が分かる行もなかにはあるが、デバッグレベルが上がるほど、メッセージも分かりにくくなる。

--packet-trace (送受信したパケットやデータを追跡する)

Nmapが送受信した全パケットのサマリーを書き出すようにする。デバッグで用いられる場合が多いが、Nmapが見えないところで何を行っているかを新しいユーザが理解するための手段として役立てることができる。何千もの行が書き出されないようにするには、-p20-30などを指定して、スキャン対象のポートの数を制限するとよいだろう。バージョン検出サブシステムの挙動にのみ関心がある場合は、代わりに--version-traceを使用すること。

--iflist (インターフェースや経路の一覧を表示する)

Nmapが検出したインターフェースやシステム経路のリストを書き出す。これは、ルーティング問題やデバイスのキャラクタリゼーションの誤り(例えばNmapがPPP接続をイーサネットとして処理すること)などをデバッグするのに役立つ。

その他の出力オプション
--append-output (出力ファイルは上書きせず追加する)

-oX-oNなどの出力フォーマットのフラグにファイル名を指定すると、デフォルトではそのファイルは上書きされる。既存のファイルの内容はそのままにして、新しい結果を追加したい場合は、この--append-outputオプションを指定する。こうしてNmapを実行すれば、ここで指定した出力ファイルはすべて、上書きではなくて追加されることになる。だがこれは、XMLスキャン(-oX)のデータに対してはあまり有効ではない。XMLの結果ファイルは通常、手動で修正しないと適正に解析できないからだ。

--resume <filename> (中断したスキャンを再開する)

対象が広範囲にわたるNmapの実行には非常に長い時間がかかり、数日ほどに及ぶ場合もある。そのようなスキャンは、常に完了するまで続けて実行できるとは限らない。様々な制約によってNmapを就業時間内に実行できなくなったり、ネットワークがダウンしたり、Nmapが動作しているマシンが計画的あるいは予定外に再起動させられたり、Nmap自体がクラッシュしたりなどが起こる可能性があるからだ。その他いかなる理由であっても同様に、Nmapを実行している管理者は、ctrl-Cを押すことによって実行をキャンセルできる。このような場合、スキャン全体を最初から再開するのは望ましくないだろう。幸いにも、通常出力(-oN)やgrep可能出力(-oG)のログが残っていれば、ユーザは、実行を中断された際のターゲットに対するスキャンを再開するようNmapに命じることができる。これを行うには、--resume オプションを指定し、通常/grep可能の出力ファイルを引数として渡す。Nmapはその出力ファイルをパースして、前に指定されたのと同じものを使うので、それ以外の引数は指定できない。nmap --resume<logfilename>として、Nmapを呼び出す。Nmapは、前回の実行で指定されたデータファイルに新たな結果を追加する。この再開オプションは、XML出力フォーマットをサポートしていない。2回の実行結果を結合して1つの妥当なXMLファイルにするのは困難であるためだ。

--stylesheet <path or URL> (XML出力変換のXSLスタイルシートを設定する)

Nmapには、XML出力を閲覧したりHTMLに変換したりするためのnmap.xslというXSLスタイルシートが同梱されている。XML出力には、xml-stylesheetディレクティブが組み込まれており、Nmapが最初にインストールした場所(もしくはWindows上の現在作業中のフォルダ)にあるnmap.xmlを参照する。最近のWebブラウザにNmapのXML出力を読み込むと、ブラウザはファイルシステムからnmap.xsl を読み出して、出力結果の処理に使用する。別のスタイルシートを使いたい場合は、この--stylesheetオプションの引数として指定する。引数はフルパス名かURLで指定する。よく用いられる例を以下に示す: --stylesheet https://nmap.org/data/nmap.xsl これで、スタイルシートの最新バージョンがInsecure.Orgからブラウザに読み込まれる。これにより、Nmap(および nmap.xsl)がインストールされていないマシン上でも、結果を閲覧しやすくなる。そのため、URLのほうが便利な場合が多いが、デフォルトではプライバシー上の理由で、ローカルファイルシステムでのnmap.xslの場所が使われている。

--no-stylesheet (XSLスタイルシート宣言をXMLから除外する)

NmapがXML出力をXSLスタイルシートと関連付けないようにする。xml-stylesheet ディレクティブは無視される。