NMAP 常用扫描简介（二）
之前我们介绍过两种扫描类型 PING 扫描 和 UDP 扫描，这篇文章将介绍最后剩下的两种常用扫描类型：TCP SYN 扫描和 TCP Connect() 扫描。
安全 扫描 NMAP
之前我们介绍过两种扫描类型 PING 扫描 和 UDP 扫描，这篇文章将介绍最后剩下的两种常用扫描类型：TCP SYN 扫描和 TCP Connect() 扫描。
在我们之前的 [NMAP 安装](https://www.linuxforum.com/threads/nmap-installation.3431/)一文中，列出了 10 种不同的 ZeNMAP 扫描模式，大多数的模式使用了不同的参数。各种不同参数代表执行不同的扫描模式。之前我们[介绍过](/article-8346-1.html)两种扫描类型 PING 扫描 和 UDP 扫描，这篇文章将介绍最后剩下的两种常用扫描类型。


### 四种通用扫描类型


下面列出了最常用的四种扫描类型：


1. PING 扫描（`-sP`）
2. TCP SYN 扫描（`-sS`）
3. TCP Connect() 扫描（`-sT`）
4. UDP 扫描（`-sU`）


当我们利用 NMAP 来执行扫描的时候，这四种扫描类型是我们需要熟练掌握的。更重要的是需要知道这些命令做了什么，并且需要知道这些命令是怎么做的。在这篇文章中将介绍两种 TCP 扫描 — TCP SYN 扫描和 TCP Connect() 扫描。


![](/data/attachment/album/201704/12/102525i17nn5ddkq11nysz.jpg)


### TCP SYN 扫描 （-sS）


TCP SYN 扫描是默认的 NMAP 扫描方式。为了运行 TCP SYN 扫描，你需要有 Root 权限。


TCP SYN 扫描的目的是找到被扫描系统上的已开启端口。使用 NMAP 扫描可以扫描在防火墙另一侧的系统。当扫描通过防火墙时，扫描时间会延长，因为数据包会变慢。


TCP SYN 扫描的工作方式是启动一个“三次握手”。正如在另一篇文章中所述，“三次握手”发生在两个系统之间。首先，源系统发送一个包到目标系统，这是一个同步（SYN）请求。然后，目标系统将通过同步/应答（SYN/ACK）响应。接下来，源系统将通过应答（ACK）来响应，从而建立起一个通信连接，然后，可以在两个系统之间传输数据。


TCP SYN 扫描通过执行下面的步骤来进行工作：


1. 源系统向目标系统发送一个同步请求，该请求中包含一个端口号。
2. 如果添加在上一步中的所请求的端口号是开启的，那么目标系统将通过同步/应答（SYN/ACK）来响应源系统。
3. 源系统通过重置（RST）来响应目标系统，从而断开连接。
4. 目标系统可以通过重置/应答（RST/ACK）来响应源系统。


这种连接已经开始建立，所以这被认为是半开放连接。因为连接状态是由 NMAP 来管理的，所以你需要有 Root 权限。


如果被扫描的端口是关闭的，那么将执行下面的步骤：


1. 源系统发送一个同步（SYN）请求到目标系统，该请求中包含一个端口号。
2. 目标系统通过重置（RST）响应源系统，因为该端口是关闭的。


如果目标系统处于防火墙之后，那么 ICMP 传输或响应会被防火墙禁止，此时，会执行下面的步骤：


1. 源系统发送一个同步（SYN）请求到目标系统，该请求中包含一个端口号。
2. 没有任何响应，因为请求被防火墙过滤了。


在这种情况下，端口可能是被过滤、或者可能打开、或者可能没打开。防火墙可以设置禁止指定端口所有包的传出。防火墙可以禁止所有传入某个指定端口的包，因此目标系统不会接收到请求。


**注：**无响应可能发生在一个启用了防火墙的系统上。即使在本地网络，你也可能会发现被过滤的端口。


我将向 图片１那样执行对单一系统（10.0.0.2）的 TCP SYN 扫描。使用命令 `sudo nmap -sS <IP 地址>` 来执行扫描。`<IP 地址>`可以改为一个单一 IP 地址，像图片１那样，也可以使用一组 IP 地址。


![Figure 01.jpg](/data/attachment/album/201704/12/102535gew30pai7fl9xzff.jpg)


*图片１*


你可以看到它表明 997 个被过滤端口没有显示在下面。NMAP 找到两个开启的端口：139 和 445 。


**注：**请记住，NMAP 只会扫描绝大多数熟知的 1000 多个端口。以后，我们会介绍可以扫描所有端口或者指定端口的其它扫描。


该扫描会被 WireShark 俘获，正如图片２所展示的那样。在这儿，你可以看到对目标系统的初始地址解析协议（ARP）请求。在 ARP 请求下面的是一长列到达目标系统端口的 TCP 请求。第 4 行是到达 `http-alt` 端口（8080）。源系统的端口号为 47128 。正如图片３ 展示的，许多 SYN 请求只有在做出响应以后才会发送。


![Figure 2.jpg](/data/attachment/album/201704/12/102538enfkt1762a289f98.jpg)


*图片２*


![Figure 3.jpg](/data/attachment/album/201704/12/102541v38443chtmhccgp0.jpg)


*图片３*


在图片３的第 50 行和第 51 行，你可以看到，重置（RST）包被发送给了目标系统。第 53 行和第 55 行显示目标系统的 RST/ACK（重置/应答）。第 50 行是针对 ‘microsoft-ds’ 端口（445），第 51 行是针对 ‘netbios-ssn’ 端口（135），我们可以看到，这两个端口都是打开的。（LCTT 译注：在 50 行和 51 行之前，目标系统发回了 SYN/ACK 响应，表示端口打开。）除了这些端口，没有其他 ACK（应答）是来自目标系统的。每一个请求均可发送超过 1000 次。


正如图片４所展示的，目标系统是 Windows 系统，我关闭了系统防火墙，然后再次执行扫描。现在，我们看到了 997 个已关闭端口不是 997 个被过滤端口。目标系统上的 135 端口之前被防火墙禁止了，现在也是开启的。


![Figure 04.jpg](/data/attachment/album/201704/12/102543naj1zdmudw5oo1wd.jpg)


*图片４*


### TCP Connect() 扫描 （-sT）


尽管 TCP SYN 扫描需要 Root 权限，但 TCP Connect() 扫描并不需要。在这种扫描中会执行一个完整的“三次握手”。因为不需要 Root 权限，所以在无法获取 Root 权限的网络上，这种扫描非常有用。


TCP Connect() 扫描的工作方式也是执行“三次握手”。正如上面描述过的，“三次握手”发生在两个系统之间。源系统发送一个同步（SYN）请求到目标系统。然后，目标系统将通过同步／应答（SYN/ACK）来响应。最后，源系统通过应答（ACK）来响应，从而建立起连接，然后便可在两个系统之间传输数据。


TCP Connect 扫描通过执行下面的步骤来工作：


1. 源系统发送一个同步（SYN）请求到目标系统，该请求中包含一个端口号。
2. 如果上一步所请求的端口是开启的，那么目标系统将通过同步/应答（SYN/ACK）来响应源系统。
3. 源系统通过应答（ACK）来响应目标系统从而完成会话创建。
4. 然后，源系统向目标系统发送一个重置（RST）包来关闭会话。
5. 目标系统可以通过同步/应答（SYN/ACK）来响应源系统。


若步骤 2 执行了，那么源系统就知道在步骤 1 中的指定端口是开启的。


如果端口是关闭的，那么会发生和 TCP SYN 扫描相同的事。在步骤 2 中，目标系统将会通过一个重置（RST）包来响应源系统。


可以使用命令 `nmap -sT <IP 地址>` 来执行扫描。`<IP 地址>`可以改为一个单一 IP 地址，像图片５那样，或者使用一组 IP 地址。


TCP Connect() 扫描的结果可以在图片５中看到。在这儿，你可以看到，有两个已开启端口：139 和 445，这和 TCP SYN 扫描的发现一样。端口 80 是关闭的。剩下没有显示的端口是被过滤了的。


![Figure 05.jpg](/data/attachment/album/201704/12/102545vq5fjldgl9798t25.jpg)


*图片５*


让我们关闭防火墙以后再重新扫描一次，扫描结果展示在图片６中。


![Figure 06.jpg](/data/attachment/album/201704/12/102547v0acvivs003cuzin.jpg)


*图片６*


关闭防火墙以后，我们可以看到，更多的端口被发现了。就和 TCP SYN 扫描一样，关闭防火墙以后，发现 139 端口和 445 端口是开启的。我们还发现，端口 2869 也是开启的。也发现有 996 个端口是关闭的。现在，端口 80 是 996 个已关闭端口的一部分 — 不再被防火墙过滤。


在一些情况下， TCP Connect() 扫描可以在一个更短的时间内完成。和 TCP SYN 扫描相比，TCP Connect() 扫描也可以找到更多的已开启端口




---


via: <https://www.linuxforum.com/threads/nmap-common-scans-part-two.3879/>


作者：[Jarret](https://www.linuxforum.com/members/jarret.268/) 译者：[ucasFL](https://github.com/ucasFL) 校对：[wxy](https://github.com/wxy)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出

