能否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','
:可选:以列格式显示输出以使其可读