nmap出力結果をプログラムで処理したいのですが、出力を取得し、以下の2つの出力に示されているプロトコルまたはポートテーブルの詳細のみを抽出する方法はわかりません。
私はawkを使ってテーブルデータを処理できると確信しています。しかし、出力からこのデータを抽出することはできません。これにはどのツールの組み合わせを使用できますか?
$ sudo nmap --open -sO 10.100.0.14
Starting Nmap 7.70 ( https://nmap.org ) at 2021-12-27 19:15 AEDT
Warning: 10.100.0.14 giving up on port because retransmission cap hit (10).
Nmap scan report for teichos.mydomain.net (10.100.0.14)
Host is up (0.00030s latency).
Not shown: 250 filtered protocols, 1 closed protocol
PROTOCOL STATE SERVICE
1 open icmp
33 open|filtered dccp
80 open|filtered iso-ip
117 open|filtered iatp
136 open|filtered udplite
MAC Address: 6A:3A:ED:33:9E:00 (Unknown)
出力2:
$ sudo nmap -sS 10.100.0.14 -p-
Starting Nmap 7.70 ( https://nmap.org ) at 2021-12-27 19:30 AEDT
Nmap scan report for teichos.mydomain.net (10.100.0.14)
Host is up (0.00024s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE
22/tcp open ssh
9090/tcp open zeus-admin
MAC Address: 6A:3A:ED:33:9E:00 (Unknown)
私が探している出力は次のとおりです(タイトルは必要ありません)。
PROTOCOL STATE SERVICE
1 open icmp
33 open|filtered dccp
80 open|filtered iso-ip
117 open|filtered iatp
136 open|filtered udplite
そして
PORT STATE SERVICE
22/tcp open ssh
9090/tcp open zeus-admin
答え1
オプションが提供されたら、nmap
ユーティリティを使用して簡単に解析可能なXMLを出力できます-oX
。つまり、必要に応じてテーブルを再作成したり、テーブルから目的の情報を抽出したりできます。
次のパイプラインは、xmlstarlet
生成されたXML文書から情報を抽出し、通常の出力で見つかったテーブルを再生成し、指定されたnmap
「状態」の「理由」を含む追加の列を挿入するために使用されます。
の出力はnmap
解析され、列区切り記号として文字(出力の一部になりたくないすべての文字)をxmlstarlet
挿入し、最終的なソートテーブルを生成するために使用されます。#
column
sudo nmap -oX - --open -sO localhost |
xmlstarlet sel -t -m /nmaprun/host/ports/port \
-v @portid -o '#' \
-v state/@state -o '#' \
-v state/@reason -o '#' \
-v service/@name -nl |
column -s '#' -t
出力例:
1 open echo-reply icmp
4 open|filtered no-response ipv4
6 open proto-response tcp
17 open port-unreach udp
41 open|filtered no-response ipv6
50 open|filtered no-response esp
51 open|filtered no-response ah
97 open|filtered no-response etherip
112 open|filtered no-response vrrp
137 open|filtered no-response mpls-in-ip
240 open|filtered no-response
255 open|filtered no-response
今回も「フィルタリングされた」応答だけを抽出します。
sudo nmap -oX - --open -sO localhost |
xmlstarlet sel -t -m '/nmaprun/host/ports/port[contains(state/@state,"filtered")]' \
-v @portid -o '#' \
-v state/@state -o '#' \
-v state/@reason -o '#' \
-v service/@name -nl |
column -s '#' -t
出力例:
4 open|filtered no-response ipv4
41 open|filtered no-response ipv6
50 open|filtered no-response esp
51 open|filtered no-response ah
97 open|filtered no-response etherip
112 open|filtered no-response vrrp
137 open|filtered no-response mpls-in-ip
240 open|filtered no-response
255 open|filtered no-response
答え2
表示される特定の出力に応じて、数字または大文字P
(ヘッダーの場合)で始まるすべての行を簡単に選択できます。
sudo nmap ... | grep -E '^([0-9]|P)'
2つのテキストファイルを作成し、あなたの質問からの2つの出力でテストした結果、次のようになりますnmap1
。nmap2
$ grep -E '^([0-9]|P)' nmap1
PROTOCOL STATE SERVICE
1 open icmp
33 open|filtered dccp
80 open|filtered iso-ip
117 open|filtered iatp
136 open|filtered udplite
$ grep -E '^([0-9]|P)' nmap2
PORT STATE SERVICE
22/tcp open ssh
9090/tcp open zeus-admin
awk
必要に応じて、次のようにすることもできます。
sudo nmap ... | awk '/^([0-9]|P)/'
答え3
$ awk '/^(PROTOCOL|PORT)/{f=1} /^MAC/{f=0} f' file
PROTOCOL STATE SERVICE
1 open icmp
33 open|filtered dccp
80 open|filtered iso-ip
117 open|filtered iatp
136 open|filtered udplite
$ awk '/^(PROTOCOL|PORT)/{f=1} /^MAC/{f=0} f' file
PORT STATE SERVICE
22/tcp open ssh
9090/tcp open zeus-admin