Nmap学习笔记
九步:
- Enumerate targets 列出目标
- Discover live hosts 发现活动主机
- Reverse-DNS lookup 反向 DNS 查询
- Scan Ports 端口扫描
- Detect versions 版本侦测
- Detect OS 系统侦测
- Traceroute 路由追踪
- Scripts 脚本
- Write output 输出
Nmap Live Host Discovery---存活主机扫描
来到一个新的局域网环境中,我们需要确认这个局域网中存在哪些主机,故需要进行主机探测
我们可以利用协议进行主机探测,从下往上分别为
- 链路层的ARP协议
- 网络层的ICMP协议
- 传输层的TCP协议和UDP协议
利用ARP协议发现主机
Nmap默认使用ping查找存活主机,当你只想找存活主机而不想扫描端口,可用
nmap -sn targets #-sn代表仅主机发现
只执行ARP扫描,而不扫描端口:
nmap -PR -sn targets #-PR代表执行ARP扫描
利用ICMP协议发现主机
nmap -PE targets #不想扫描端口使用-sn -PE ICMP类型8/Echo
nmap -PP targets #-PP ICMP类型13/时间戳回复
nmap -PM targets #-PM ICMP类型18/地址掩码回复
利用TCP和UDP协议发现主机
TCP SYN Ping
发送SYN包,特权用户无需完成三次握手,非特权用户必须三次握手
nmap -PS -sn targets
TCP ACK Ping
发送ACK包,必须要特权身份
nmap -PA -sn targets
UDP Ping
一个 UDP 数据包被发送到一个开放的 UDP 端口并且没有触发任何响应;但是,当我们向任何关闭的 UDP 端口发送 UDP 数据包就可能会触发间接指示目标主机在线的响应 。无响应,只能发现存活
nmap -PU -sn targets
使用反向DNS解析
可查询在线主机名,不想发送需要-n跳过,此外,脱机主机需要-R查询
总结
Nmap Basic Port Scans---基础端口扫描
TCP and UDP Ports
端口的六种状态:
- Open:表示服务正在指定的端口上监听
- Closed:表示没有服务在指定的端口上监听,尽管端口是可访问的。这里的可访问是指该端口是可到达的,并且没有被防火墙或其他安全设备/程序阻止。
- Filtered:表示 Nmap 无法确定端口是开放还是关闭,因为端口不可访问。这种状态通常是由于防火墙阻止 Nmap 到达该端口造成的。Nmap 的包可能被阻止到达端口;或者,响应被阻止到达 Nmap 的主机。
- Unfiltered:表示 Nmap 无法确定端口是开放还是关闭,尽管端口是可访问的。这种状态在使用 ACK 扫描
-sA
时遇到。 - Open|Filtered:意味着 Nmap 无法确定端口是开放还是过滤。
- Closed|Filtered:意味着 Nmap 无法判断端口是关闭还是过滤。
TCP Flags
TCP头部是TCP段的前24个字节,每行32位(4字节),共六行,以下为RFC 793定义的TCP头部
红色标记部分为TCP标志,设置则意味着其值为1
- URG(Urgent flag):紧急标志表示紧急指针字段是重要的。紧急指针表示传入的数据是紧急的,并且设置了 URG 标志的 TCP 段将立即处理,不考虑之前发送的 TCP 段是否需要等待。
- ACK(Acknowledgement flag):确认标志表示确认号是有效的。它用于确认接收 TCP 段。
- PSH(Push flag):推送标志请求 TCP 及时将数据传递给应用程序。
- RST(Reset flag):重置标志用于重置连接。另一台设备,如防火墙,可能会发送它来终止 TCP 连接。当向主机发送数据而接收端没有服务来响应时,也会使用此标志。
- SYN(Synchronize flag):同步标志用于初始化 TCP 三次握手并与其他主机同步序列号。在 TCP 连接建立期间,序列号应随机设置。
- FIN:发送方没有更多数据要发送。
TCP Connect Scan
TCP 连接扫描通过完成 TCP 三次握手来工作。在标准的 TCP 连接建立过程中,客户端发送一个设置了 SYN 标志的 TCP 数据包,如果端口开放,服务器会响应 SYN/ACK;最后,客户端通过发送 ACK 来完成三次握手。
一旦通过发送 RST/ACK 确认其状态,连接就会被撕裂。您可以选择使用 -sT
来运行 TCP 连接扫描,需要注意的是,如果您不是特权用户(root 或 sudoer),TCP 连接扫描是唯一可能发现开放 TCP 端口的选项。
以下是wireshark抓包到的目标机已开放端口143的数据包状况
nmap默认扫描1000个端口,可用-F启用快速模式减少到100个,此外-r选项还可以按端口顺序进行扫描
TCP SYN Scan
无权限用户仅限于连接扫描。然而,默认扫描模式是 SYN 扫描,它需要具有权限(root 或 sudoer)的用户来运行。SYN 扫描不需要完成 TCP 三次握手;相反,一旦收到服务器的响应,它就会断开连接。因为我们没有建立 TCP 连接,这降低了扫描被记录的机会。我们可以通过使用 -sS
选项来选择这种扫描类型。下面的图示显示了 TCP SYN 扫描在不完成 TCP 三次握手的情况下是如何工作的。
SYN 扫描 -sS
不需要完成 TCP 三次握手;相反,一旦接收到 SYN/ACK 包,Nmap 就会发送一个 RST 包。
上半图是TCP是-sT流量,任何开放的 TCP 端口都需要 Nmap 在关闭连接之前完成 TCP 三次握手;下半图是-sS,不需要三次握手,接受到SYN/ACK包,nmap就发送RST包
UDP Scan
UDP 是一种无连接协议,因此它不需要任何握手来建立连接。我们无法保证监听 UDP 端口的任何服务会对我们的数据包做出响应。然而,如果向关闭的端口发送 UDP 数据包,则会返回 ICMP 端口不可达错误(类型 3,代码 3)。您可以使用 -sU
选项选择 UDP 扫描;此外,您还可以将其与另一个 TCP 扫描结合使用。
以下图示表明,如果我们向开放的 UDP 端口发送 UDP 数据包,我们无法期望得到任何回复。因此,向开放端口发送 UDP 数据包不会告诉我们任何信息。
然而,如图所示,我们期望收到类型 3、目标不可达、代码 3、端口不可达的 ICMP 数据包。换句话说,不产生任何响应的 UDP 端口,Nmap 会将其标记为开放。
微调范围与性能
-
-p指定要扫描的端口,-p-表示扫描全部端口,使用
--top-ports 10
将检查最常用的十个端口。 -
可以使用
-T<0-5>
控制扫描时间- paranoid (0) 偏执狂(0)
- sneaky (1) 悄悄的(1)
- polite (2) 有礼貌的(2)
- normal (3) 正常的(3)
- aggressive (4) 好斗的(4)
- insane (5) 疯狂的(5)
避免IDS(入侵检测系统)警报,使用-T0或-T1.
-T0
一次扫描一个端口,并在发送每个探测之间等待 5 分钟,所以您可以猜出扫描一个目标需要多长时间才能完成。如果您没有指定任何时间,Nmap 将使用正常的-T3
。请注意,-T5
在速度方面是最激进的;然而,由于数据包丢失的可能性增加,这可能会影响扫描结果的准确性。请注意,-T4
通常在 CTF 比赛期间和学习在练习目标上扫描时使用,而-T1
通常在真实行动期间使用,因为在这些情况下隐蔽性更为重要。 -
--min-rate <number>
和--max-rate <number>
控制数据包速率。例如,--max-rate 10
或--max-rate=10
确保您的扫描器每秒不会发送超过十个数据包。 -
--min-parallelism <numprobes>
和--max-parallelism <numprobes>
控制探测并行化。例如,--min-parallelism=512
使 Nmap 至少保持 512 个并行探测;
总结
Nmap Advanced Port Scans---高级端口扫描
TCP 空扫描、FIN 扫描和圣诞树扫描
Null scan 空扫描
空扫描不会设置任何标志;所有六个标志位都设置为 0。您可以使用 -sN
选项选择此扫描。没有设置标志的 TCP 数据包在到达开放端口时不会触发任何响应,如图所示。因此,从 Nmap 的角度来看,空扫描中没有响应表明端口是开放的或防火墙阻止了数据包。
然而,我们预计目标服务器在端口关闭时将响应一个 RST 数据包。因此,我们可以通过缺少 RST 响应来找出未关闭的端口:开启或过滤。
FIN Scan FIN 扫描
FIN 扫描会发送一个设置了 FIN 标志的 TCP 数据包。您可以使用 -sF
选项选择此扫描类型。同样,如果 TCP 端口开放,也不会发送响应。再次强调,Nmap 无法确定端口是否开放或防火墙是否阻止了与此 TCP 端口相关的流量。
然而,如果端口关闭,目标系统应响应 RST。因此,我们将能够知道哪些端口已关闭,并利用这一知识推断出哪些端口是开放的或被过滤的。值得注意的是,一些防火墙会在不发送 RST 的情况下“静默”丢弃流量。
Xmas Scan 圣诞扫描
Xmas 扫描同时设置 FIN、PSH 和 URG 标志。您可以通过选项 -sX
选择 Xmas 扫描。
TCP Maimon Scan TCP 马伊蒙扫描
在这个扫描中,FIN 和 ACK 位被设置。目标应发送一个 RST 数据包作为响应。然而,某些基于 BSD 的系统如果端口是开放的,则会丢弃数据包以暴露开放端口。这种扫描在现代网络中遇到的大多数目标上都不会工作。要选择此扫描类型,请使用 -sM
选项。
TCP ACK、窗口和自定义扫描
TCP ACK Scan TCP ACK 扫描
ACK 扫描会发送一个设置了 ACK 标志的 TCP 数据包。使用 -sA
选项来选择这种扫描。目标会无论端口状态如何都响应 RST。这种行为发生是因为设置了 ACK 标志的 TCP 数据包应该只作为对已接收的 TCP 数据包的响应来发送,以确认接收到了某些数据,而我们的情况并非如此。因此,这种扫描无法告诉我们目标端口是否在简单设置中打开。
这种扫描在目标前有防火墙的情况下会有帮助。因此,根据哪些 ACK 数据包导致了响应,你可以了解到哪些端口没有被防火墙阻止。换句话说,这种扫描更适合发现防火墙规则集和配置。
Window Scan 窗口扫描
TCP 窗口扫描几乎与 ACK 扫描相同;然而,它检查返回的 RST 数据包的 TCP 窗口字段。在特定系统上,这可以揭示端口是开放的。您可以通过选项 -sW
选择此扫描类型。如图所示,无论端口是开启还是关闭,我们都期望收到针对我们“不请自来”的 ACK 数据包的 RST 数据包。
对没有防火墙的 Linux 系统进行 TCP 窗口扫描也不会提供太多信息。然而,如果我们对防火墙后面的服务器重复进行 TCP 窗口扫描,我们期望得到更令人满意的结果。在下面的控制台输出中,TCP 窗口扫描指出检测到三个端口被标记为关闭。(这与将相同三个端口标记为未过滤的 ACK 扫描形成对比。)尽管我们知道这三个端口并没有关闭,但我们意识到它们的响应不同,这表明防火墙没有阻止它们。
Custom Scan 自定义扫描
如果您想尝试超出内置 TCP 扫描类型的新的 TCP 标志组合,可以使用 --scanflags
。例如,如果您想同时设置 SYN、RST 和 FIN,可以使用 --scanflags RSTSYNFIN
。如图所示,如果您开发自定义扫描,您需要了解不同端口的行为,以便在不同场景下正确解释结果。
最后,必须注意的是,ACK 扫描和窗口扫描在帮助我们绘制防火墙规则方面非常高效。然而,重要的是要记住,仅仅因为防火墙没有阻止特定的端口,并不意味着该端口上一定有服务在监听。例如,可能需要更新防火墙规则以反映最近的服务更改。因此,ACK 和窗口扫描揭示的是防火墙规则,而不是服务。
Spoofing and Decoys 欺骗和诱饵
在某些网络配置中,您可以使用伪造的 IP 地址甚至伪造的 MAC 地址扫描目标系统。这种扫描仅在您能保证捕获响应的情况下才有益。如果您尝试使用伪造的 IP 地址从某个随机网络扫描目标,很可能会没有任何响应路由到您那里,扫描结果可能不可靠。
以下图示攻击者启动命令 nmap -S SPOOFED_IP MACHINE_IP
。因此,Nmap 将使用提供的源 IP 地址 SPOOFED_IP
构建所有数据包。目标机器将对传入的数据包做出响应,将回复发送到目标 IP 地址 SPOOFED_IP
。为了使此扫描工作并给出准确的结果,攻击者需要监控网络流量以分析回复。
简要来说,使用伪造的 IP 地址进行扫描分为三个步骤:
- 攻击者向目标机器发送一个带有伪造源 IP 地址的数据包。
- 目标机器将回复发送到伪造的 IP 地址作为目标地址。
- 攻击者捕获回复以确定开放的端口。
通常,您需要使用 -e
指定网络接口,并明确禁用 ping 扫描 -Pn
。因此,而不是 nmap -S SPOOFED_IP MACHINE_IP
,您需要发出 nmap -e NET_INTERFACE -Pn -S SPOOFED_IP MACHINE_IP
来明确告诉 Nmap 使用哪个网络接口,并且不要期望收到 ping 回复。如果攻击者系统无法监控网络响应,这种扫描将毫无用处。
当您与目标机器处于同一子网时,您将能够伪造 MAC 地址。您可以使用 --spoof-mac SPOOFED_MAC
指定源 MAC 地址。这种地址伪造仅在攻击者和目标机器位于同一以太网(802.3)网络或同一 WiFi(802.11)网络时才可行。
Spoofing(伪造)仅在满足某些条件的最小数量情况下有效。因此,攻击者可能会求助于使用Decoys(诱饵)来使其更难以定位。这个概念很简单,让扫描看起来来自多个 IP 地址,这样攻击者的 IP 地址就会在其中丢失。如图所示,对目标机器的扫描将看起来来自 3 个不同的来源,因此回复也会发送到诱饵。
Fragmented Packets 碎片化数据包
Firewall 防火墙
防火墙是一块软件或硬件,允许数据包通过或阻止它们。它基于防火墙规则运行,可以概括为阻止所有流量并排除例外,或者允许所有流量并排除例外。例如,您可能阻止所有流向服务器的流量,除了那些到达您的 Web 服务器的流量。传统的防火墙至少检查 IP 头部和传输层头部。更复杂的防火墙还会尝试检查传输层携带的数据。
IDS 入侵检测系统
入侵检测系统(IDS)检查网络数据包以寻找特定的行为模式或内容签名。当满足恶意规则时,它会发出警报。除了 IP 头部和传输层头部外,IDS 还会检查传输层的数据内容,并检查它是否与任何恶意模式匹配。您如何使传统的防火墙/IDS 更难检测到您的 Nmap 活动?这并不容易回答;然而,根据防火墙/IDS 的类型,您可能从将数据包分割成更小的数据包中受益。
Fragmented Packets 分片数据包
Nmap 提供 -f
选项来分片数据包。一旦选择,IP 数据将被分成 8 字节或更少。添加另一个 -f
( -f -f
或 -ff
)将数据分成 16 字节分片而不是 8 字节。您可以使用 --mtu
来更改默认值;然而,您应该始终选择 8 的倍数。
要正确理解分片,我们需要查看下面的 IP 头部图。一开始可能看起来很复杂,但我们注意到我们了解其中大部分字段。特别是,注意源地址在第 4 行占用 32 位(4 字节),而目的地址在第 5 行占用另外 4 字节。我们将要分片跨越多个数据包的数据用红色突出显示。为了帮助接收方重新组装,IP 使用标识(ID)和分片偏移,如下面图中的第 2 行所示。
让我们比较运行 sudo nmap -sS -p80 10.20.30.144
和 sudo nmap -sS -p80 -f 10.20.30.144
。正如您现在所知,这将使用隐蔽的 TCP SYN 扫描端口 80;然而,在第二个命令中,我们要求 Nmap 分片 IP 数据包。
在第一、二行中,我们可以看到 ARP 查询和响应。Nmap 发出 ARP 查询是因为目标在同一以太网中。接下来的两行显示了 TCP SYN ping 和回复。第五行是端口扫描的开始;Nmap 向端口 80 发送 TCP SYN 数据包。在这种情况下,IP 头为 20 字节,TCP 头为 24 字节。请注意,TCP 头最小大小为 20 字节。
通过 -f
请求分片,TCP 头部的 24 个字节将被分成 8 的倍数,最后一个分片包含 TCP 头部的 8 个字节或更少。由于 24 可以被 8 整除,我们得到了 3 个 IP 分片;每个分片有 20 个字节的 IP 头部和 8 个字节的 TCP 头部。我们可以在第五行和第七行之间看到这三个分片。
请注意,如果您添加了 -ff
(或 -f -f
),数据碎片将是 16 的倍数。换句话说,在这种情况下,TCP 头部的 24 个字节将被分成两个 IP 碎片,第一个包含 16 个字节,第二个包含 8 个字节的 TCP 头部。
另一方面,如果您想增加数据包的大小以使其看起来无害,可以使用选项 --data-length NUM
,其中 num 指定您要附加到数据包的字节数。
Idle/Zombie Scan 空闲/僵尸扫描
伪造源 IP 地址可以是一种很好的隐蔽扫描方法。然而,Spoofing(伪造)仅适用于特定的网络配置。它要求你处于可以监控流量的位置。考虑到这些限制,伪造 IP 地址可能用处不大;然而,我们可以通过空闲扫描来提升它。
空闲扫描,或僵尸扫描,需要一个空闲的系统连接到网络,并且你可以与之通信。实际上,Nmap 会将每个探测伪装成来自空闲(僵尸)主机的,然后它会检查空闲(僵尸)主机是否对伪装的探测有任何响应。这是通过检查 IP 头中的 IP 标识(IP ID)值来实现的。你可以使用 nmap -sI ZOMBIE_IP MACHINE_IP
运行空闲扫描,其中 ZOMBIE_IP
是空闲主机(僵尸)的 IP 地址。
空闲(僵尸)扫描需要以下三个步骤来发现端口是否开放:
- 触发空闲主机响应,以便你可以记录空闲主机上的当前 IP ID。
- 向目标 TCP 端口发送一个 SYN 数据包。该数据包应该伪装成来自空闲主机(僵尸)IP 地址的。
- 再次触发空闲机器以响应,以便您可以将新的 IP ID 与之前收到的进行比较。
让我们用图表来解释。在下面的图表中,我们看到攻击者系统正在探测一个空闲机器,一个多功能打印机。通过发送 SYN/ACK,它以包含其新增加的 IP ID 的 RST 数据包进行响应。
攻击者将在下一步向目标机器的 TCP 端口发送一个 SYN 数据包。然而,此数据包将使用空闲主机(僵尸)的 IP 地址作为源地址。会出现三种情况。在第一种情况下,如图所示,TCP 端口已关闭;因此,目标机器向空闲主机发送一个 RST 数据包。空闲主机没有响应;因此其 IP ID 没有增加。
在第二种场景中,如下所示,TCP 端口是开放的,因此目标机器对空闲主机(僵尸)发送 SYN/ACK 响应。空闲主机对此意外数据包以 RST 数据包响应,从而增加其 IP ID。
在第三种情况下,目标机器由于防火墙规则而完全无响应。这种无响应的情况将导致与关闭端口相同的结果;空闲主机不会增加 IP ID。
对于最终步骤,攻击者向空闲主机发送另一个 SYN/ACK。空闲主机以 RST 数据包响应,再次将 IP ID 增加 1。攻击者需要将第一步接收到的 RST 数据包的 IP ID 与第三步接收到的 RST 数据包的 IP ID 进行比较。如果差异为 1,则表示目标机器上的端口已关闭或被过滤。然而,如果差异为 2,则表示目标上的端口是开放的。
值得重复的是,这种扫描被称为空闲扫描,因为选择空闲主机对于扫描的准确性是必不可少的。如果“空闲主机”忙碌,所有返回的 IP ID 都将毫无用处。
Getting More Details 获取更多详细信息
可以考虑添加 --reason
以便 Nmap 提供更多关于其推理和结论的详细信息。-v或-vv甚至-d,都可以获得详细的输出
摘要
Nmap Post Port Scans---端口扫描后期
对应九步中的后五步
Service Detection 服务检测
一旦 Nmap 发现开放端口,您就可以探测可用端口以检测运行的服务。进一步调查开放端口是重要信息的一部分,因为渗透测试人员可以利用它来了解该服务是否存在已知漏洞。
需要注意的是,使用 -sV
将强制 Nmap 进行 TCP 三次握手并建立连接。建立连接是必要的,因为 Nmap 无法在不完全建立连接并与监听服务通信的情况下发现版本。换句话说,当选择 -sV
选项时,无法进行隐秘的 SYN 扫描 -sS
。
控制台输出以下显示了一个简单的带有 -sV
选项的 Nmap 隐身 SYN 扫描。添加 -sV
选项会导致输出中出现新列,显示每个检测到的服务的版本。例如,在 TCP 端口 22 打开的情况下,我们获得 22/tcp open ssh
,而不是 22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u8 (protocol 2.0)
。请注意,SSH 协议被猜测为服务,因为 TCP 端口 22 是开放的;Nmap 不需要连接到端口 22 来确认。然而, -sV
需要连接到这个开放的端口以获取服务标志和它能够获取的任何版本信息,例如 nginx 1.6.2
。因此,与服务列不同,版本列不是猜测的。
OS Detection and Traceroute 操作系统检测与路由跟踪
OS Detection
Nmap 可以根据其行为和响应中的任何明显迹象检测操作系统(OS)。可以使用 -O
启用 OS 检测;这里的 O 是大写的 O,即 OS。
Nmap可以猜测内核版本,但不一定准确
操作系统检测非常方便,但许多因素可能会影响其准确性。首先,Nmap 需要找到目标至少一个开放和一个关闭的端口来做出可靠的猜测。此外,由于虚拟化等技术的日益普及,虚拟机的操作系统指纹可能会被扭曲。因此,总是对操作系统版本持保留态度。
Traceroute
如果您想使用 Nmap 找到您和目标之间的路由器,只需添加 --traceroute
。请注意,Nmap 的路由跟踪与 Linux 和 macOS 上的 traceroute
命令或 MS Windows 上的 tracert
命令略有不同。标准的 traceroute
从低 TTL(生存时间)的包开始,并持续增加直到达到目标。Nmap 的路由跟踪从高 TTL 的包开始,并持续减少。
NSE 脚本引擎
脚本是一段不需要编译的代码。换句话说,它保持其原始的可读形式,并且不需要转换为机器语言。许多程序通过脚本提供额外的功能;此外,脚本使得添加内置命令中不存在的高级功能成为可能。同样,Nmap 通过 Lua 语言提供对脚本的支持。Nmap 的一部分,Nmap 脚本引擎(NSE)是一个 Lua 解释器,它允许 Nmap 执行用 Lua 语言编写的 Nmap 脚本。然而,我们不需要学习 Lua 就可以使用 Nmap 脚本。
Nmap默认安装近600个脚本,存在于/user/share/nmap/scripts
,它们以它们要针对的协议命名
您可以指定使用任何或一组已安装的脚本;此外,您可以安装其他用户的脚本并在扫描中使用它们。让我们从默认脚本开始。您可以选择使用 --script=default
在默认类别中运行脚本,或者简单地添加 -sC
。除了默认之外,类别还包括 auth、broadcast、brute、default、discovery、dos、exploit、external、fuzzer、intrusive、malware、safe、version 和 vuln。以下表格显示了简要说明。
一些脚本属于多个类别。此外,一些脚本对服务进行暴力破解攻击,而另一些则发起 DoS 攻击并利用系统。因此,如果您不想使服务崩溃或利用它们,选择要运行的脚本时必须谨慎。
使用脚本的命令是nmap -sS -sC MACHINE_IP
,-sC选项确保nmap在执行完SYN扫描后使用默认的脚本
您也可以通过名称使用 --script "SCRIPT-NAME"
或模式如 --script "ftp*"
来指定脚本,这将包括 ftp-brute
。如果您不确定脚本的功能,可以使用文本阅读器打开脚本文件,例如 less
,或使用文本编辑器。在 ftp-brute
的情况下,它声明:“对 FTP 服务器进行暴力破解密码审计。”您必须小心,因为一些脚本相当侵入性。此外,一些脚本可能针对特定服务器,如果随机选择,将浪费您的时间而没有任何好处。像往常一样,请确保您有权在目标服务器上启动此类测试
Saving The Output 保存输出
每当进行nmap扫描时,我们可能需要将扫描结果导出并保存到文件中。为文件名选择和采用良好的命名约定也非常关键。文件数量会迅速增长,这可能会妨碍您找到之前的扫描结果。主要有三种格式:
- Normal 正常
- Grepable (
grep
able) - XML
还有一种Script Kiddie(脚本小子),我们并不推荐
Normal 正常
正如名称所暗示的,正常格式与扫描目标时在屏幕上获得的输出类似。您可以通过使用 -oN FILENAME
;N 代表正常来以正常格式保存您的扫描。
pentester@TryHackMe$ cat MACHINE_IP_scan.nmap
# Nmap 7.60 scan initiated Fri Sep 10 05:14:19 2021 as: nmap -sS -sV -O -oN MACHINE_IP_scan MACHINE_IP
Nmap scan report for MACHINE_IP
Host is up (0.00086s latency).
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.7p1 Debian 5+deb8u8 (protocol 2.0)
25/tcp open smtp Postfix smtpd
80/tcp open http nginx 1.6.2
110/tcp open pop3 Dovecot pop3d
111/tcp open rpcbind 2-4 (RPC #100000)
143/tcp open imap Dovecot imapd
MAC Address: 02:A0:E7:B5:B6:C5 (Unknown)
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3.13
OS details: Linux 3.13
Network Distance: 1 hop
Service Info: Host: debra2.thm.local; OS: Linux; CPE: cpe:/o:linux:linux_kernelOS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Fri Sep 10 05:14:28 2021 -- 1 IP address (1 host up) scanned in 9.99 seconds
Grepable
grepable的格式得名于命令 grep
;grep 代表全局正则表达式打印器。简单来说,它使得对扫描输出进行特定关键词或术语的过滤变得高效。您可以使用 -oG FILENAME
将扫描结果保存为 grep 可搜索的格式。上面以正常格式显示的扫描输出,在控制台下面使用 grep 可搜索的格式显示。正常输出有 21 行;然而,grep 可搜索的输出只有 4 行。主要原因在于 Nmap 希望当用户应用 grep
时,每行都富有意义且完整。因此,在 grep 可搜索的输出中,行很长且与正常输出相比不便于阅读。
pentester@TryHackMe$ cat MACHINE_IP_scan.gnmap
# Nmap 7.60 scan initiated Fri Sep 10 05:14:19 2021 as: nmap -sS -sV -O -oG MACHINE_IP_scan MACHINE_IP
Host: MACHINE_IP Status: Up
Host: MACHINE_IP Ports: 22/open/tcp//ssh//OpenSSH 6.7p1 Debian 5+deb8u8 (protocol 2.0)/, 25/open/tcp//smtp//Postfix smtpd/, 80/open/tcp//http//nginx 1.6.2/, 110/open/tcp//pop3//Dovecot pop3d/, 111/open/tcp//rpcbind//2-4 (RPC #100000)/, 143/open/tcp//imap//Dovecot imapd/ Ignored State: closed (994) OS: Linux 3.13 Seq Index: 257 IP ID Seq: All zeros
# Nmap done at Fri Sep 10 05:14:28 2021 -- 1 IP address (1 host up) scanned in 9.99 seconds
一个使用 grep
的例子是 grep KEYWORD TEXT_FILE
;此命令将显示包含提供的关键字的所有行。让我们比较使用 grep
在正常输出和可 grep 输出上的结果。您会发现前者不提供主机的 IP 地址。相反,它返回 80/tcp open http nginx 1.6.2
,如果您正在筛选多个系统的扫描结果,这将非常不方便。然而,后者在每一行都提供了足够的信息,例如主机的 IP 地址,使其完整。
pentester@TryHackMe$ grep http MACHINE_IP_scan.nmap
80/tcp open http nginx 1.6.2
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
pentester@TryHackMe$ grep http MACHINE_IP_scan.gnmap
Host: MACHINE_IP Ports: 22/open/tcp//ssh//OpenSSH 6.7p1 Debian 5+deb8u8 (protocol 2.0)/, 25/open/tcp//smtp//Postfix smtpd/, 80/open/tcp//http//nginx 1.6.2/, 110/open/tcp//pop3//Dovecot pop3d/, 111/open/tcp//rpcbind//2-4 (RPC #100000)/, 143/open/tcp//imap//Dovecot imapd/ Ignored State: closed (994) OS: Linux 3.13 Seq Index: 257 IP ID Seq: All zeros
XML
第三种格式是 XML。您可以使用 -oX FILENAME
将扫描结果保存为 XML 格式。XML 格式将最方便在其他程序中处理输出。足够方便的是,您可以使用 -oA FILENAME
将 -oN
、 -oG
和 -oX
组合起来,以保存正常、grepable 和 XML 格式的扫描输出。
Script Kiddie 脚本小子
第四种格式是脚本小子。你可以看到,如果你想搜索输出中的任何有趣关键词或保留结果以供将来参考,这种格式是毫无用处的。然而,你可以用它来保存扫描输出 nmap -sS 127.0.0.1 -oS FILENAME
,显示输出文件名,并在不懂数字的朋友面前炫耀 31337。