Nmap の出力形式

NmapBeginner

はじめに

ペネトレーションテストやネットワークセキュリティ評価を行う際、スキャンを実行するだけでは半分しか終わっていません。スキャン結果を適切に記録・保存することは、レポート作成、進捗管理、そして他のセキュリティツールへのデータ連携において非常に重要です。

出力形式の選択は、その後の作業効率に直結します。人間が読むには「人間が読みやすい形式」が最適であり、自動化には「構造化された形式」が最適です。成熟したワークフローでは、通常その両方を保持します。

業界標準のネットワークマッパーである Nmap には、さまざまなニーズに対応するための複数の出力形式が用意されています。最も一般的な 3 つの形式は、Normal(人間が読みやすい形式)、Grepable(コマンドライン解析用に設計された形式)、XML(他のソフトウェアにインポートするための構造化データ)です。

この実験では、これら 3 つの出力形式を生成する方法と、基本的な Linux コマンドラインツールを使用して結果を解析し、有用な情報を抽出する方法を学びます。

Normal 形式での出力 (-oN)

このステップでは、Nmap のスキャン結果を Normal 形式で保存する方法を学びます。Normal 形式は、基本的に Nmap スキャンを実行した際にターミナル画面に表示される内容の直接的なコピーです。非常に読みやすく、結果を素早く確認したり、テキストドキュメントとして同僚と共有したりするのに最適です。

この形式は、パイプライン処理ではなく「人間」のために最適化されています。スキャン結果をレポートとして読むアナリストが直接確認する場合に最適な選択肢です。

スキャン結果を Normal 形式で保存するには、-oN フラグの後に作成したいファイル名を指定します。ローカルマシン (127.0.0.1) をスキャンしてオープンポートを検出し、その結果を保存してみましょう。

ターミナルで以下のコマンドを実行し、スキャンを実行して normal_scan.txt として保存します。

nmap -p 22,8080 -oN normal_scan.txt 127.0.0.1

スキャン完了後、cat コマンドを使用してファイルの内容を確認できます。これは、スキャン中に画面に表示されたものと全く同じ内容です。

cat normal_scan.txt

以下のような出力が表示され、オープンポートとそれに関連するサービスが確認できるはずです。

## Nmap 7.80 scan initiated Sat Mar  7 16:07:07 2026 as: nmap -p 22,8080 -oN normal_scan.txt 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).

PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy

## Nmap done at Sat Mar  7 16:07:07 2026 -- 1 IP address (1 host up) scanned in 0.02 seconds

Grepable 形式での出力 (-oG)

このステップでは、Grepable 出力形式について学びます。Normal 形式は人間が読むには適していますが、情報が複数行にまたがるため、プログラムによる処理は困難です。Grepable 形式は、1 つのホストに関するすべての情報を 1 つの長い行にまとめることで、この問題を解決しています。

このようにデータをフラット化することで、シェルベースの解析が実用的になります。これは、直接読むための快適さよりも、後続のツールでの処理を優先した出力形式の典型例です。

この形式は、grep、awk、cut といった Linux コマンドラインツールで使用するために特別に設計されています。Grepable 出力を生成するには、-oG フラグを使用します。

以下のコマンドを実行して同じスキャンを行い、今度は結果を grepable_scan.txt という名前の Grepable 形式で保存します。

nmap -p 22,8080 -oG grepable_scan.txt 127.0.0.1

次に、新しく作成されたファイルの内容を確認します。

cat grepable_scan.txt

出力は Normal 形式とは大きく異なります。ホスト情報とすべてのオープンポートが 1 行に凝縮されていることに注目してください。

## Nmap 7.80 scan initiated Sat Mar  7 16:07:20 2026 as: nmap -p 22,8080 -oG grepable_scan.txt 127.0.0.1
Host: 127.0.0.1 (localhost)     Status: Up
Host: 127.0.0.1 (localhost)     Ports: 22/open/tcp//ssh///, 8080/open/tcp//http-proxy///
## Nmap done at Sat Mar  7 16:07:20 2026 -- 1 IP address (1 host up) scanned in 0.02 seconds

この構造により、「open」のような特定のキーワードを検索し、対応する IP アドレスを抽出することが非常に簡単になります。これについては後のステップで練習します。

XML 形式での出力 (-oX)

このステップでは、XML 出力を生成する方法を学びます。XML (eXtensible Markup Language) は、多くの異なるソフトウェアアプリケーションで広くサポートされている、高度に構造化された形式です。

評価の規模が大きくなるにつれて、機械可読な構造化出力の重要性が増します。スキャン結果を他のツールに連携させる必要がある場合、その場しのぎのテキスト解析ではメンテナンスコストが高く、壊れやすくなってしまいます。

ペネトレーションテストの文脈では、Nmap のスキャン結果を Metasploit Framework、脆弱性スキャナ、またはカスタムレポートスクリプトなどの他のセキュリティツールにインポートする必要がある場合、XML が推奨される形式です。XML 出力ファイルを作成するには、-oX フラグを使用します。

以下のコマンドを実行してスキャンを行い、結果を xml_scan.xml として保存します。

nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1

cat コマンドを使用して XML ファイルの内容を確認できます。

cat xml_scan.xml

出力は、構造化された XML タグの大きなブロックになります。人間が素早く読むには適していませんが、機械が解析するには完璧な形式です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.80 scan initiated Sat Mar  7 16:07:30 2026 as: nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1 -->
<nmaprun scanner="nmap" args="nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1" start="1772870850" startstr="Sat Mar  7 16:07:30 2026" version="7.80" xmloutputversion="1.04">
...
<host starttime="1772870850" endtime="1772870850"><status state="up" reason="conn-refused" reason_ttl="0"/>
<address addr="127.0.0.1" addrtype="ipv4"/>
<hostnames>
<hostname name="localhost" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port>
...

Grepable 出力を Awk で解析する

最後のステップでは、Grepable 出力形式を実用的に活用します。ペネトレーションテストにおける一般的なシナリオとして、大規模なネットワークをスキャンし、特定のオープンポートを持つホストを見つけ、それらのホストの IP アドレスだけを抽出して別のツール(パスワードクラッカーや脆弱性エクスプロイトツールなど)に渡すという作業があります。

ここでは、強力な Linux テキスト処理ツールである grep と awk を使用します。grep コマンドは特定の単語を含む行をフィルタリングし、awk はそれらの行から特定の列を抽出できます。

まず、Grepable ファイルをフィルタリングして、「open」という単語を含む行だけを表示する方法を見てみましょう。

grep "open" grepable_scan.txt

このコマンドは、ホストとそのオープンポートを含む行を出力します。

Host: 127.0.0.1 (localhost)     Ports: 22/open/tcp//ssh///, 8080/open/tcp//http-proxy///

次に、IP アドレスだけを抽出します。Grepable 形式では、IP アドレスは常にその行の 2 番目の「単語」(または列)にあります。grep の出力をパイプ (|) で awk に渡し、2 番目の列 ($2) を出力するように指示します。

以下のコマンドを実行して IP アドレスを抽出し、open_hosts.txt という新しいファイルに保存します。

grep "open" grepable_scan.txt | awk '{print $2}' > open_hosts.txt

新しいファイルの内容を確認してみましょう。

cat open_hosts.txt

IP アドレスだけが表示されるはずです。

127.0.0.1

この単純なコマンドの組み合わせを習得することで、膨大なスキャンファイルを素早く解析し、評価の次のフェーズに必要なターゲットだけを正確に抽出できるようになります。

まとめ

この実験では、さまざまな出力形式を使用して Nmap のスキャン結果を効果的に記録および管理する方法を学びました。人間が読むための Normal 形式 (-oN)、コマンドライン解析のための Grepable 形式 (-oG)、そしてツール統合のための XML 形式 (-oX) を体験しました。最後に、grep や awk といった Linux テキスト処理ユーティリティを使用して、Grepable 出力ファイルから特定のターゲット情報を抽出する練習を行いました。これらのスキルは、セキュリティ評価中にデータを整理し、ワークフローを効率化するために不可欠です。