使用 NMap 通过开放端口对主机进行排序

信息安全 linux 地图
2021-08-16 01:55:34

我的任务是对我们的公司网络运行 NMap 扫描并编译一个仅包含活动端点的列表。我的问题是如何通过开放端口(打印机/端点)分离主机。例如,如果端口 9100(打印机)打开,我想从 nmap 输出 (-oN) 文件 Corp.txt 中删除所有打印机/主机。该列表还必须维护与其端口号和打开状态相关的主机名/IP。

下面是我正在运行的命令及其输出的示例:

nmap -p 80,135,9100 -on~/Documents/Corp.txt 10.33.131.1/24

itbrn1745.domain.net (10.33.131.13) 的 Nmap 扫描报告
主机已启动(0.91 秒延迟)。
港口国服务
80/tcp 关闭 http
135/tcp 打开 msrpc
9100/tcp 封闭式 jetdirect


itPC.domain.net (10.33.131.37) 的 Nmap 扫描报告
主机已启动(0.0033 秒延迟)。
港口国服务
80/tcp 打开 http
135/tcp 打开 msrpc
9100/tcp 过滤的 jetdirect

ap4403.a740 (10.33.131.56) 的 Nmap 扫描报告
主机已启动(0.0046 秒延迟)。
港口国服务
80/tcp 打开 http
135/tcp 过滤的 msrpc
9100/tcp 打开 jetdirect

非常感谢任何有关编译网络上仅活动端点列表的逻辑的建议。

2个回答

正是出于这个原因,Nmap 具有替代输出格式。您显示的正常输出 ( -oN) 仅用于人类可读性,不应使用脚本进行处理,因为它会随着版本的不同而发生未定义的变化。

大多数功能齐全的 Nmap 输出查看器(如ZenmapScanHub)使用XML 输出格式( -oX),这是一种包含完整扫描结果的机器可读格式,包括 NSE 脚本和 traceroute 等高级功能。如果您打算使用这些功能或将扫描和报告扩展到简单的“所有具有此端口的主机”查询之外,则使用这些输出查看器之一或编写您自己的使用 XML 的查看器是您的最佳选择。有一些库可以为大多数常见的编程语言解析 Nmap 的 XML。

对于像这样的简单查询,您还可以使用 Nmap 的Grepable 输出格式( -oG)。这会将主机的所有端口扫描数据以及 IP 和主机名放在一行中,如下所示:

Host: 10.33.131.56 (ap4403.a740)    Ports: 80/open/tcp//http///, 9100/open/tcp//jetdirect///

在这种情况下,您可以只grep -v ' 9100/open'删除这些行。

扫描时,我更喜欢用“全输出”选项(-oA)为正常,XML和的grepable输出保存到相同的文件名(带.nmap.xml.gnmap扩展,分别)。这样我就有了所有的输出格式,以防我需要进行后处理或想要快速对输出进行视觉扫描。

正如@bonsaiviking 提到的,Nmap 支持多种输出格式,并且有许多第三方工具可以帮助您处理这些数据。如果您想简单地在命令行解析数据以获得简单的即发即弃解决方案,使用该-oG选项的 shell 脚本可能是最简单的方法。

为了给您一个想法,这是我在 PowerShell 中针对您的场景提出的快速方法。(根据您示例中的文件路径,您似乎使用的是 Linux - 不是我的专长 - 但只要您了解您的操作环境和可用工具,一般概念是相当可移植的。)

nmap -p 80,135,9100 -oG - 10.33.131.1/24 | Where-Object -FilterScript {$_.Contains('Ports:') -and !($_.Contains('9100/open/tcp/'))} | Out-File "$env:UserProfile\Documents\Corp.txt"

注意:以上内容未经彻底测试。您应该执行自己的样本运行和验证,以确保输出包含所有所需的数据,然后再依赖它。

上面的脚本相当简单。

  • nmap部分与您的原始部分完全相同,只是有一个更改。输出格式从 更改-oN-oG,输出目标更改为 ,-以便 greppable 输出被发送到控制台(我们稍后通过管道将其重定向到控制台)而不是文件。
  • Where-Object允许我们根据我们想要的任何标准过滤一组对象。在这种情况下,我们将它用于 Nmap 的 greppable 输出,PowerShell 将其存储为字符串数组。-FilterScript选项允许我们定义一个 PowerShell 脚本(应该输出$trueor$false或等效值)来决定过滤的内容(只有解析为的项目$true才会包含在输出中)。此过滤器脚本仅返回端口列表,并且仅用于在 TCP 9100 上没有开放端口的主机。
  • Out-File让我们获取 PowerShell 输出并将其转储到文件中。这里,$env:UserProfile用于定位当前用户的个人资料文件夹,其余在用户的“我的文档”区域指定“Corp.txt”。