TCP 连接扫描

TCP 扫描是通过 TCP 3 次握手的基础上建立的

nmap 端口扫描 - 图1

  1. pentester@TryHackMe$ nmap -sT MACHINE_IP

TCP SYN 扫描

SYN扫描不需要完成TCP 3次握手;相反,它会在收到服务器的响应后断开连接。因为我们没有建立 TCP 连接,所以这减少了扫描被记录的机会

nmap 端口扫描 - 图2

  1. pentester@TryHackMe$ sudo nmap -sS MACHINE_IP

TCP Null 扫描

空扫描不设置任何标志;所有六个标志位都设置为零,一个没有设置标志的 TCP 数据包在到达一个开放端口时不会触发任何响应,因此,从 Nmap 的角度来看,在空扫描中缺少回复表明端口已打开或防火墙正在阻止数据包。但是,如果端口关闭,我们希望目标服务器以 RST 数据包响应。因此,我们可以使用缺少 RST 响应来找出未关闭的端口:打开或过滤。

nmap 端口扫描 - 图3

nmap 端口扫描 - 图4

  1. pentester@TryHackMe$ sudo nmap -sN MACHINE_IP

TCP FIN 扫描

FIN 扫描发送一个设置了 FIN 标志的 TCP 数据包, 同样,如果 TCP 端口打开,则不会发送任何响应。同样,Nmap 无法确定端口是否打开或防火墙是否阻止与此 TCP 端口相关的流量。但是,如果端口关闭,目标系统应响应 RST。因此,我们将能够知道哪些端口是关闭的,值得注意的是,一些防火墙会在不发送 RST 的情况下“静静地”丢弃流量。

nmap 端口扫描 - 图5

nmap 端口扫描 - 图6

  1. pentester@TryHackMe$ sudo nmap -sF MACHINE_IP

TCP Xmas 扫描

Xmas 扫描同时设置 FIN、PSH 和 URG 标志,与Null scan 和FIN scan 一样,如果收到RST 包,则表示端口已关闭。否则,它将被报告为 open|filtered。

nmap 端口扫描 - 图7

nmap 端口扫描 - 图8

  1. pentester@TryHackMe$ sudo nmap -sX MACHINE_IP

TCP ACK 扫描

ACK 扫描将发送一个设置了 ACK 标志的 TCP 数据包, 一般情况下,无论端口状态如何,目标都会使用 RST 响应 ACK。发生这种行为是因为设置了 ACK 标志的 TCP 数据包应该仅在响应接收到的 TCP 数据包时发送,以确认某些数据的接收,这与我们的情况不同。因此,此扫描不会告诉我们目标端口是否在简单设置中打开

nmap 端口扫描 - 图9

如果目标前面有防火墙,这种扫描会很有帮助。因此,根据哪些 ACK 数据包产生响应,您将了解哪些端口未被防火墙阻止。换句话说,这种类型的扫描更适合发现防火墙规则集和配置。

  1. pentester@TryHackMe$ sudo nmap -sA MACHINE_IP

Window Scan

TCP窗口扫描和ACK扫描几乎一样;但是,它会检查返回的 RST 数据包的 TCP 窗口字段。在特定系统上,这可以表明端口已打开, 无论端口是打开还是关闭,我们都希望得到一个 RST 数据包来回复我们“不请自来”的 ACK 数据包

nmap 端口扫描 - 图10

如果我们在具有防火墙的服务器执行此扫描,我们可以根据返回来得出防火墙没有阻止此类端口

  1. pentester@TryHackMe$ sudo nmap -sW MACHINE_IP
  2. PORT STATE SERVICE
  3. 22/tcp closed ssh
  4. 25/tcp closed smtp
  5. 80/tcp closed http
  6. MAC Address: 02:78:C0:D0:4E:E9 (Unknown)

自定义扫描

如果想尝试内置 TCP 扫描类型之外的新 TCP 标志组合,您可以使用 --scanflags. 例如,如果你想同时设置 SYN、RST 和 FIN,你可以使用 --scanflags RSTSYNFIN

nmap 端口扫描 - 图11

欺骗和诱饵

在某些网络设置中,您将能够使用欺骗性 IP 地址甚至欺骗性 MAC 地址扫描目标系统。这种扫描仅在您可以保证捕获响应的情况下才有用

  1. # -e 指定网络接口
  2. pentester@TryHackMe$ nmap -e NET_INTERFACE -Pn -S SPOOFED_IP MACHINE_IP

nmap 将会使用提供的 SPOOFED_IP 来作为源 IP 地址制作数据包进行发送,目标机器接收响应后,先 SPOOFED_IP PC 发送回复

nmap 端口扫描 - 图12

当您与目标机器位于同一子网时,您也可以伪装您的 MAC 地址。您可以使用 指定源 MAC 地址.

  1. pentester@TryHackMe$ sudo nmap -sT MACHINE_IP --spoof-mac SPOOFED_MAC

欺骗仅在满足特定条件的极少数情况下有效。因此,攻击者可能会求助于使用诱饵来使其更难被精确定位。这个概念很简单,让扫描看起来像是来自许多 IP 地址,这样攻击者的 IP 地址就会在其中丢失

nmap 端口扫描 - 图13

  1. # -D 启动诱饵扫描
  2. # RND 表示 IP 随机
  3. # NE 表示攻击者 IP
  4. nmap -D 10.10.0.1,10.10.0.2,RND,RND,ME MACHINE_IP

碎片包

Nmap 提供了对数据包进行分段的选项-f。一旦选择,IP 数据将被分成 8 个字节或更少。添加另一个-f(-f -f-ff) 会将数据拆分为 16 个字节片段而不是 8 个。您可以使用--mtu;更改默认值。但是,您应该始终选择 8 的倍数。

Idle/Zombie 扫描

欺骗源 IP 地址可能是一种很好的隐蔽扫描方法。但是,欺骗仅适用于特定的网络设置。它要求您处于可以监控流量的位置。考虑到这些限制,欺骗您的 IP 地址几乎没有用处;但是,我们可以通过空闲扫描对其进行升级。

Nmap 会让每个探测看起来好像来自空闲(僵尸)主机,然后它会检查空闲(僵尸)主机是否收到任何对欺骗探测的响应的指标。这是通过检查 IP 标头中的 IP 标识 (IP ID) 值来完成的

  1. # ZOMBIE_IP是空闲主机(僵尸)的 IP 地址
  2. nmap -sI ZOMBIE_IP MACHINE_IP

原理:

  1. 触发空闲主机响应,记录空闲主机当前 IP ID
  2. 将 SYN 数据包发送到目标上的 TCP 端口。该数据包应该被欺骗,使其看起来好像来自空闲主机(僵尸)IP 地址
  3. 再次触发空闲机器响应,以便您可以将新的 IP ID 与之前收到的 IP ID 进行比较

nmap 端口扫描 - 图14

攻击者将发送一个SYN包到他们下一步要在目标机器上查看的TCP端口。但是,此数据包将使用空闲主机(僵尸)IP 地址作为源。会出现三种情况。在第一种情况下,如下图所示,TCP端口是关闭的;因此,目标机器用 RST 数据包响应空闲主机。空闲主机无响应;因此它的 IP ID 不会增加

nmap 端口扫描 - 图15

在第二种情况下,如下所示,TCP 端口是打开的,因此目标机器以 SYN/ACK 响应空闲主机(僵尸)。空闲主机用 RST 数据包响应这个意外数据包,从而增加其 IP ID。

nmap 端口扫描 - 图16

在第三种情况下,由于防火墙规则,目标机器根本不响应。缺乏响应将导致与关闭端口相同的结果;空闲主机不会增加IP ID。

最后一步,攻击者向空闲主机发送另一个 SYN/ACK。空闲主机以 RST 数据包响应,再次将 IP ID 递增 1。攻击者需要将第一步收到的 RST 数据包的 IP ID 与第三步收到的 RST 数据包的 IP ID 进行比较。如果差异为 1,则表示目标机器上的端口已关闭或被过滤。但是,如果差异为 2,则表示目标上的端口已打开。

值得重复的是,这种扫描称为空闲扫描,因为选择空闲主机对于扫描的准确性是必不可少的。如果“空闲主机”很忙,则所有返回的 IP ID 都将无用。