はじめに
ペネトレーションテストやネットワークセキュリティ評価を行う際、スキャンを実行するだけでは半分しか終わっていません。スキャン結果を適切に記録・保存することは、レポート作成、進捗管理、そして他のセキュリティツールへのデータ連携において非常に重要です。
出力形式の選択は、その後の作業効率に直結します。人間が読むには「人間が読みやすい形式」が最適であり、自動化には「構造化された形式」が最適です。成熟したワークフローでは、通常その両方を保持します。
業界標準のネットワークマッパーである 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 出力ファイルから特定のターゲット情報を抽出する練習を行いました。これらのスキルは、セキュリティ評価中にデータを整理し、ワークフローを効率化するために不可欠です。



