nmap 스캔 출력 파일에서 포트만 grep하는 방법은 무엇입니까?

nmap 스캔 출력 파일에서 포트만 grep하는 방법은 무엇입니까?
➜ cat nmap/ports.nmap
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-21 11:30 IST
Warning: 10.10.10.100 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.10.100
Host is up (0.26s latency).
Not shown: 65410 closed tcp ports (reset), 111 filtered tcp ports (no-response)
PORT      STATE SERVICE
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown
49157/tcp open  unknown
49158/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 17.57 seconds

검색 후 이 명령을 사용합니다.

cat nmap/ports.nmap | grep 'open' | awk '{ print $1 }' | awk '{print ($0+0)}' | sed -z 's/\n/,/g;s/,$/\n/'

산출:

88,135,139,389,445,464,593,636,49152,49153,49154,49155,49157,49158

이보다 더 간단한 명령이 있습니까? 누구든지 나를 도와줄 수 있습니까?

답변1

nmap필요한 정보를 더 쉽게 추출할 수 있는 XML 출력을 사용할 수도 있습니다 .

여기서는 스캔 결과에서 열려 있는 각 포트의 포트 번호를 가져온 xmlstarlet다음 paste쉼표로 구분된 필드를 사용하여 포트 번호 행의 형식을 한 줄로 지정하는 데 사용합니다.

$ nmap -oX - localhost | xmlstarlet sel -t -v '//port[state/@state="open"]/@portid' -nl | paste -s -d, -
22,25,111,2049,7000,7001

결과를 먼저 저장하려면 다음 두 단계를 수행하면 됩니다.

$ nmap -oX nmap.xml localhost
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-21 08:53 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 994 closed tcp ports (conn-refused)
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
111/tcp  open  rpcbind
2049/tcp open  nfs
7000/tcp open  afs3-fileserver
7001/tcp open  afs3-callback

Nmap done: 1 IP address (1 host up) scanned in 6.13 seconds
$ xmlstarlet sel -t -v '//port[state/@state="open"]/@portid' -nl nmap.xml | paste -s -d, -
22,25,111,2049,7000,7001

XPath 쿼리는 하위 노드와 value 속성 값이 있는 XML 문서의 //port[state/@state="open"]/@portid모든 노드를 찾습니다. 이러한 각 노드에 대해 속성이 추출됩니다.portstatestateopenportportid


이미 가지고 있는 것에 대한 변형을 원하는 경우 대부분의 구문 분석을 단일 awk호출로 결합할 수 있습니다.

awk '$2 == "open" { sub("/.*","",$1); print $1 }' nmap.out | paste -s -d, -

open이는 두 번째 필드에서 단어를 감지하고 /첫 번째 필드에서 그 단어 앞의 모든 것을 추출하여 인쇄합니다. paste이전과 같이 쉼표로 구분된 목록을 만듭니다 .

답변2

cat nmap/ports.nmap | awk -F/ '/open/ {b=b","$1} END {print substr(b,2)}'

그냥 awk를 사용하나요?

88,135,139,389,445,464,593,636,49152,49153,49154,49155,49157,49158

답변3

원래 명령:

cat nmap/ports.nmap | grep 'open' | awk '{ print $1 }' | awk '{print ($0+0)}' | sed -z 's/\n/,/g;s/,$/\n/'

중복 포트 정렬 및 제거 명령:

cat nmap/ports.nmap | grep 'open' | awk '{ print $1 }' | awk '{print ($0+0)}' | sort | uniq | sed -z 's/\n/,/g;s/,$/\n/'

관련 정보