nmap 출력 결과를 프로그래밍 방식으로 처리하고 싶지만 출력을 가져오고 아래 두 출력에 표시된 프로토콜 또는 포트 테이블의 세부 정보만 추출하는 방법을 알 수 없습니다.
나는 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)'
두 개의 텍스트 파일을 만들고 귀하의 질문에서 나온 두 가지 출력으로 테스트한 결과 다음과 같습니다 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