nmap 可以只显示打开特定端口的主机吗?

nmap 可以只显示打开特定端口的主机吗?

能否nmap列出本地网络上同时打开 SSH 和 HTTP 的所有主机?为此,我可以运行以下命令:

nmap 192.168.1.1-254 -p22,80 --open

但是,这列出了打开任何列表端口的主机,而我希望主机打开所有端口。此外,输出非常冗长:

# nmap 192.168.1.1-254 -p22,80 --open

Starting Nmap 6.47 ( http://nmap.org ) at 2015-12-31 10:14 EST
Nmap scan report for Wireless_Broadband_Router.home (192.168.1.1)
Host is up (0.0016s latency).
Not shown: 1 closed port
PORT   STATE SERVICE
80/tcp open  http

Nmap scan report for new-host-2.home (192.168.1.16)
Host is up (0.013s latency).
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 254 IP addresses (7 hosts up) scanned in 3.78 seconds

我正在寻找的输出就像:

192.168.1.16

因为上述主机是唯一打开所有端口的主机。

我当然可以对输出进行后处理,但我不想依赖nmap的输出格式,如果有办法的话,我宁愿让nmap来做。

答案1

在 Nmap 中没有办法做到这一点,但是您关于不想“依赖 nmap 的输出格式”的评论让我指出 Nmap 有两种用于机器可读解析的稳定输出格式。较旧的是可查询输出 ( -oG),它非常适合使用 perl、awk 和 grep 进行处理,但缺少一些更高级的输出(如 NSE 脚本输出、端口原因、traceroute 等)。更完整的格式是XML 输出 ( -oX),但这对于您的目的来说可能有点过分了。

您可以将这些输出保存到带有 、 或 的文件-oG-oX两种-oA格式加上“正常”文本输出),也可以将其中之一直接发送到 stdout:nmap 192.168.1.1-254 -p22,80 --open -oG - | awk '/22\/open.*80\/open/{print $2}'

答案2

尝试以下命令:

nmap --open -p 22,80 192.168.1.1-254 -oG - | grep "/open" | awk '{ print $2 }'

这将扫描您范围内的端口,并以 grepable 格式通过管道输出,查找开放端口,然后打印符合任何该条件的 IP 地址。

答案3

还请考虑一下这一awk行:

nmap -Pn -oG -p22,80,443,445 - 100.100.100.100 | awk '/open/{ s = ""; for (i = 5; i <= NF-4; i++) s = s substr($i,1,length($i)-4) "\n"; print $2 " " $3 "\n" s}'

它将打印出具有所有指定开放端口的所有主机,如下所示:

 100.100.100.100 (some-domain.com)
 22/open/tcp//ssh
 80/open/tcp//http
 443/open/tcp//microsoft-ds
 445/open/tcp//https-alt

答案4

即使存在开放端口,所有这些答案仍然显示忽略的端口。以下是对我有用的:

sudo nmap -sS "10.10.10.0/24" --open -oG ./nmap_scan; sudo chown youruser: ./nmap_scan; cat ./nmap_syn | grep -v 'Nmap\|Status:' | sed 's/\t/,/g' |  awk '{gsub("Ignored State: .*", "");print}' | column -t -s',' 
  • sudo nmap -sS "192.168.1.0/24" --open -oG ./nmap_scan:仅对打开的端口执行 Syn 扫描并输出到名为 nmap_scan 的 grepable 文件
  • sudo chown youruser: ./nmap_scan:自从您运行 sudo 以来,将文件的所有权更改回您的用户。这是可选的,只需确保以 root 或 sudo 身份运行以下所有命令
  • grep -v '^Nmap\|^Status:'Status::删除所有以或开头的行Nmap,这些是垃圾行,对于输出来说不是必需的。
  • sed 's/\t/,/g':将所有选项卡更改为逗号,这会将输出本质上转换为更易于解析的 csv 格式
  • awk '{gsub("Ignored State: .*", "");print}':删除任何“Ignored State: .*”,它是“Ignored State:”之后任何内容的正则表达式。每个,部分之间。
  • column -t -s',':可选:以列格式显示输出以使其可读

相关内容