Nmap 输出格式

NmapBeginner
立即练习

简介

在进行渗透测试或网络安全评估时,执行扫描仅仅是工作的一半。正确记录并保存扫描结果对于撰写报告、跟踪进度以及将数据导入其他安全工具至关重要。

输出格式的选择决定了你后续处理结果的方式。人类可读的输出最适合快速查看,而结构化输出则最适合自动化处理。成熟的工作流通常会同时保留这两种格式。

Nmap 作为行业标准的网络映射工具,提供了多种输出格式以满足不同需求。最常见的三种格式是:普通文本(Normal,人类可读)、可检索(Grepable,专为命令行解析设计)和 XML(用于导入其他软件的结构化数据)。

在本实验中,你将学习如何生成这三种输出格式,并学习如何使用基础的 Linux 命令行工具来解析结果并提取有价值的信息。

输出为普通文本格式 (-oN)

在这一步中,你将学习如何以普通文本格式保存 Nmap 扫描结果。普通文本格式本质上是你运行 Nmap 扫描时在终端屏幕上所见内容的直接副本。它具有极高的可读性,非常适合快速查看结果或在文本文档中与同事共享。

这种格式是为人类而非程序流水线优化的。当扫描结果的直接接收者是需要阅读报告的人类分析师时,这是正确的选择。

要以普通文本格式保存扫描结果,请使用 -oN 参数,后跟你要创建的文件名。我们将扫描本地机器(127.0.0.1)以发现开放端口并保存输出。

在终端中运行以下命令执行扫描并将其保存为 normal_scan.txt:

nmap -p 22,8080 -oN normal_scan.txt 127.0.0.1

扫描完成后,你可以使用 cat 命令查看文件内容。这将显示扫描期间打印到屏幕上的完全相同的内容。

cat normal_scan.txt

你应该会看到类似下面的输出,显示了开放端口及其关联的服务:

## Nmap 7.80 scan initiated Sat Mar  7 16:07:07 2026 as: nmap -p 22,8080 -oN normal_scan.txt 127.0.0.1
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).

PORT     STATE SERVICE
22/tcp   open  ssh
8080/tcp open  http-proxy

## Nmap done at Sat Mar  7 16:07:07 2026 -- 1 IP address (1 host up) scanned in 0.02 seconds

输出为可检索格式 (-oG)

在这一步中,你将探索可检索(Grepable)输出格式。虽然普通文本格式非常适合人类阅读,但由于信息跨越多行,它很难通过程序进行处理。可检索格式通过将单个主机的所有信息放在同一长行中解决了这个问题。

像这样扁平化数据使得基于 Shell 的解析变得切实可行。这是为了后续工具处理而非直接阅读舒适度而优化输出的经典案例。

这种格式专门设计用于配合 Linux 命令行工具(如 grep、awk 和 cut)使用。要生成可检索输出,请使用 -oG 参数。

执行以下命令运行相同的扫描,但这次将结果以可检索格式保存为 grepable_scan.txt:

nmap -p 22,8080 -oG grepable_scan.txt 127.0.0.1

现在,查看新创建的文件内容:

cat grepable_scan.txt

输出看起来与普通文本格式大不相同。请注意主机信息及其所有开放端口是如何压缩到单行中的:

## Nmap 7.80 scan initiated Sat Mar  7 16:07:20 2026 as: nmap -p 22,8080 -oG grepable_scan.txt 127.0.0.1
Host: 127.0.0.1 (localhost)     Status: Up
Host: 127.0.0.1 (localhost)     Ports: 22/open/tcp//ssh///, 8080/open/tcp//http-proxy///
## Nmap done at Sat Mar  7 16:07:20 2026 -- 1 IP address (1 host up) scanned in 0.02 seconds

这种结构使得搜索特定关键字(例如 "open")并提取相应的 IP 地址变得非常容易,你将在后续步骤中进行练习。

输出为 XML 格式 (-oX)

在这一步中,你将学习如何生成 XML 输出。XML(可扩展标记语言)是一种高度结构化的格式,被许多不同的软件应用程序广泛支持。

随着评估规模的扩大,结构化的机器可读输出变得愈发重要。一旦扫描结果需要导入其他工具,临时的文本解析就会变得脆弱且维护成本高昂。

在渗透测试中,当你需要将 Nmap 扫描结果导入其他安全工具(如 Metasploit 框架、漏洞扫描器或自定义报告脚本)时,XML 是首选格式。要创建 XML 输出文件,请使用 -oX 参数。

运行以下命令执行扫描并将结果保存为 xml_scan.xml:

nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1

你可以使用 cat 命令检查 XML 文件的内容:

cat xml_scan.xml

输出将是一大块结构化的 XML 标签。虽然人类快速阅读并不容易,但它非常适合机器解析:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE nmaprun>
<?xml-stylesheet href="file:///usr/bin/../share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 7.80 scan initiated Sat Mar  7 16:07:30 2026 as: nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1 -->
<nmaprun scanner="nmap" args="nmap -p 22,8080 -oX xml_scan.xml 127.0.0.1" start="1772870850" startstr="Sat Mar  7 16:07:30 2026" version="7.80" xmloutputversion="1.04">
...
<host starttime="1772870850" endtime="1772870850"><status state="up" reason="conn-refused" reason_ttl="0"/>
<address addr="127.0.0.1" addrtype="ipv4"/>
<hostnames>
<hostname name="localhost" type="PTR"/>
</hostnames>
<ports><port protocol="tcp" portid="22"><state state="open" reason="syn-ack" reason_ttl="0"/><service name="ssh" method="table" conf="3"/></port>
...

使用 Awk 解析可检索输出

在最后一步中,你将把可检索输出格式投入实际应用。渗透测试中的一个常见场景是扫描大型网络,查找具有特定开放端口的主机,然后仅提取这些主机的 IP 地址以输入到另一个工具(如密码破解器或漏洞利用工具)中。

我们将使用两个强大的 Linux 文本处理工具:grep 和 awk。grep 命令用于过滤包含特定单词的行,而 awk 可以从这些行中提取特定的列。

首先,让我们看看如何过滤可检索文件,使其仅显示包含单词 "open" 的行:

grep "open" grepable_scan.txt

该命令输出了包含主机及其开放端口的行。

Host: 127.0.0.1 (localhost)     Ports: 22/open/tcp//ssh///, 8080/open/tcp//http-proxy///

现在,我们只想提取 IP 地址。在可检索格式中,IP 地址始终是该行中的第二个“单词”(或列)。我们可以通过管道符 (|) 将 grep 的输出传递给 awk,并告诉它打印第二列 ($2)。

运行以下命令提取 IP 地址并将其保存到一个名为 open_hosts.txt 的新文件中:

grep "open" grepable_scan.txt | awk '{print $2}' > open_hosts.txt

让我们验证新文件的内容:

cat open_hosts.txt

你应该只会看到打印出的 IP 地址:

127.0.0.1

通过掌握这种简单的命令组合,你可以快速解析海量的扫描文件,并提取出评估下一阶段所需的精确目标。

总结

在本实验中,你学习了如何使用不同的输出格式有效地记录和管理 Nmap 扫描结果。你探索了用于人类阅读的普通文本格式 (-oN)、用于命令行解析的可检索格式 (-oG) 以及用于工具集成的 XML 格式 (-oX)。最后,你练习了使用 Linux 文本处理工具(如 grep 和 awk)从可检索输出文件中提取特定的目标信息。这些技能对于在安全评估期间组织数据和简化工作流至关重要。