1. 概述
这里讨论 nmap 支持的扫描技术,虽然 nmap 支持多种的扫描技术但是一般情况下一次只用一种方法,就是一般不将多种扫描技术混合使用,不过这里有个例外就是 UDP 扫描,它可能需要和任意一种 TCP 扫描技术结合使用。好了作了这个简单说明,下面开始详细的讲解每一种扫描技术 (也叫扫描类型)。
2. 扫描技术
2.1. TCP SYN 扫描
-sS (TCP SYN 扫描) SYN 扫描是 namp 的默认扫描选项,SYN 扫描的特点是扫描速度快,快是有多快呢,在一个没有入侵防火墙的快速网络上,一秒钟可以扫描几千个端口,这速度够快吧。
属于半开放扫描,因为它不打开一个完全的 TCP 连接换句话说就是从来不完成 TCP 三次握手。所以 SYN 扫描连接信息被目标服务器记录到日志的概率更低。
它发送一个 SYN 报文,告诉目标服务器要打开一个连接,然后等待目标服务器响应,如果得到响应 SYN/ACK 表示端口在监听 (开放),得到 RST(复位) 表示没有监听者。
2.2. TCP connect() 扫描
-sT (TCP connect() 扫描) 如果我们在扫描时 SYN 扫描不可用时 connect() 扫描就是 TCP 扫描。SYN 扫描一般在用户没有权限发送原始报文或者在扫描 IPv6 网络而不可用。此时 nmap 通过创建 connect() 系统调用要求操作系统和目标机以及端口建立连接,这时也就无法直接发送原始报文。
缺点是 nmap 对高层的 connect() 调用比对原始报文控制更少,所以扫描效率较低。这种扫描需要完全连接到开放的目标端口而不是像 SYN 扫描那样进行半开放的扫描。所以需要发送更多的报文,由于是使用完全连接所以被目标服务器记录到日志的概率更高。
2.3. UDP 扫描
-sU (UDP 扫描) UDP 扫描发送没有数据的 UDP 报头到需要扫描的目标端口。 如果目标返回 ICMP 端口不可到达错误 (类型 3,代码 3),该端口是 closed(关闭的) 。 其它 ICMP 不可到达错误 (类型 3,代码 1,2,9,10,或者 13) 表明该端口是 filtered(被过滤的) 。 偶尔地,某服务会响应一个 UDP 报文,证明该端口是 open(开放的) 。 如果几次重试后还没有响应,该端口就被认为是 open|filtered (开放|被过滤的) ,说明端口可能是开放的,或过滤的。
UDP 扫描扫描速度缓慢,这时因为开放的和被过滤的端口很少响应,让 nmap 超时然后再探测,以防探测帧或者响应丢失。关闭的端口一般会返回给 nmap 一个 ICMP 端口无法到达错误。
2.4. TCP Null | FIN | Xmas 扫描
这里包含是三种扫描,Null ,FIN ,Xmas 扫描,而不是一种扫描。这三种扫描类型在 TCP RFC 中发现了一个巧妙的办法来区分 open(开放的) 和 closed(关闭的) 端口。这些扫描的优点是可以越过一些无状态防火墙和报文过滤路由器。另一个优点是这些扫描类型甚至比 SYN 扫描还要隐秘,更不容易被目标服务器记录到连接日志中。
-sN (Null 扫描) 不设置任何标志位(即 TCP 标志头是 0)。
-sF (FIN 扫描) 只设置 TCP FIN 标志位 ( FIN 是 Finish 的缩写表示关闭连接)。
-sX (Xmas 扫描) 设置 FIN ,PSH (表示有数据传输),和 URG (是 Urgent 的缩写表示本报文段中发送的数据是否包含紧急数据) 标志位。
这里还有一个问题需要注意的是,有些目标服务器(比如 windows系统的目标服务器)管端口开放还是关闭都响应 RST ,这导致所有端口都被认为是 closed(关闭的) 。
2.5. TCP ACK 扫描
ACK 扫描探测报文只设置 ACK 标志位。当扫描未被过滤的目标主机时, open(开放的) 和 closed(关闭的) 端口都会返回 RST 报文,这是因为机器接受一个未经请求的 ACK 包会返回 RST ,Nmap 把它们标记为 unfiltered(未被过滤的) ,意思是 ACK 报文不能到达,至于它们是 open(开放的) 或者 closed(关闭的) 无法确定。
不响应或者发送特定的 ICMP 错误消息(类型 3,代号1,2,3,9,10,或者 13)的端口,nmap 将其标记为 filtered(被过滤的) 。
2.6. TCP 窗口扫描
-sW (TCP 窗口扫描) 这个控制选项告诉 namp 使用窗口扫描。当 nmap 探测收到 RST 报文时不是都认为端口是 unfiltered 。
窗口扫描通过检查目标主机端口返回的 RST 报文的 TCP 窗口来区分不同的端口状态。在一些系统上开放端口用正数表示窗口大小,而关闭端口的窗口大小为 0。当收到 RST 报文时,窗口扫描根据 TCP 窗口值是正数还是 0,来分别端口状态并将端口状态标记为 open 或者 closed 。
2.7. TCP Maimon 扫描
-sM (TCP Maimon 扫描) Maimon 扫描是什么扫描这个名称好像和网络没有任何关系,其实这个名称是用此项扫描提出者 Uriel Maimon 的名字命名的。这项技术和 Null ,FIN ,以及 Xmas 扫描是一样的,但是要注意它的探测报文使用的是 FIN/ACK 。本来按照网络 RFC 标准约定无论端口 开放或者关闭,都应该对这样的探测响应 RST 报文。但是 Uriel 注意到如果端口开放,许多基于 BSD 的系统只是默默的丢弃该探测报文。
2.8. TCP 定制扫描
--scanflags (定制的 TCP 扫描) 通过这个选项我们可以定制我们需要的扫描,所谓定制就是指定我们需要的 TCP 标志位。
--scanflags 指定选项可以是由一个数字标记值比如 9 (9指的是 PSH 和 FIN ),也可以使用标志位的字符名。TCP 标志位的字符名称有: URG , ACK ,PSH , RST ,SYN ,FIN 指定的时候可以使用字符名称进行任意的组合使用。比如设置所有的标志位 --scanflagsURGACKPSHRSTSYNFIN 。
除了设置我们需要使用的标志位之外同时还可以设置 TCP 的扫描类型比如同时指定扫描类型 -sA 。如果你不指定扫描类型 nmap 默认使用 SYN 扫描。详细内容可以查看 https://nmap.org/book/idlescan.html。
2.9. TCP Idlescan 扫描
-sI <zombie host[:probeport]> (Idlescan) 空闲扫描,允许完全盲端口扫描。 攻击者实际上可以扫描目标而无需向目标发送单个数据包 目标来自他们自己的IP地址,一个聪明的侧信道 攻击允许扫描被一个哑巴反弹 “僵尸宿主” 。 入侵检测系统 (IDS) 报告将指无辜的僵尸作为攻击者,这种扫描类型允许发现基于 IP 的信任 关系机器之间。空闲扫描是终极隐形扫描。
在了解 Idlescan 扫描工作原理之前需要知道前面 2.1 讲解的 SYN 扫描,还需要知道机器接受一个未经请求的 SYN/ACK 包会返回 RST ,一个未经请求的 RST 会被忽略。还有一点很重要需要知道,那就是任何数据包在互联网上都有一个片段标识号 IP ID ,当数据包发送的时候,大部分操作系统只是简单的增加了数字,未做其他处理。所以攻击者只需要探究 IP ID 就可以知道最终发送了多少个报文。
空闲扫描由三个步骤组成: 对每个端口重复:
- 探测僵尸的
IP ID 并记录下来。 - 伪造一个
SYN 包从僵尸并将其发送到所需的目标端口。 根据端口状态,目标的反应可能会或可能不会导致僵尸的 IP ID 增加。 - 再次探的
IP ID 。 然后目标端口状态是 通过将此新 IP ID 与步骤中记录的 IP ID 进行比较确定。
经过上面的三个步骤 Zombie (僵尸) 主机的 IPID 应该会增加 1~2。如果只是增加了1,那么就可以说明Zombie 主机还没有发出任何包,当然响应攻击者的探查请求除外。没有发送包也就意味着目标端口没有开放(也可能是目标主机向 Zombie 主机发送了一个 RST 包导致请求被忽略,或者是根本就是什么都没有做)。增加的如果是 2,那就表明 Zombie 主机成功在两个探测器之间发送了包。这种情况一般情况都意味着目标端口是开放的(目标大概会向 Zombie 主机发送一个 SYN/ACK 包去响应攻击者伪造的 SYN ,从Zombie 主机诱导 RST 包)。如果是增加了一个比 2 还大的数字,那么就说明 Zombie 主机不可用可能不能胜任预测 IP ID 数值,也可能是正在忙于其他与 Idle Scan 无关的事情。
closed(关闭的) 的端口与 filtered(被过滤的) 端口会发生不同的情况,攻击者在两种情况下使用相同的处理结果,即 IP ID 增加 1,因此空闲扫描无法区分closed(关闭的) 端口与 filtered(被过滤的) 端口。 当 nmap 记录一个 IP ID 增加 1 表示端口状态是closed|filtered 。
2.10. IP 协议扫描
-sO (IP 协议扫描) 这里 -sO 是字母 O 而不是数字 0,IP 协议扫描可以让您确定目标机支持哪些 IP 协议 TCP ,ICMP ,IGMP ,或其他。从技术本质上来说这不属于端口扫描,扫描遍历的是 IP 协议号而不是 TCP 或者 UDP 的端口号。
2.11. FTP 弹跳扫描
-b <ftp relay host> (FTP 弹跳扫描) FTP 协议的一个有一个特点是支持代理 ftp 连接。代理连接指的是它允许用户连接到一台 FTP 服务器,然后要求此 FTP 服务器将文件送到一台第三方服务器。所以导致 FTP 服务器可以利用于对其它主机端口扫描。
使用该选项支持 ftp 弹跳扫描。参数格式是 username:password@server:port 。 server 是某个脆弱的 FTP 服务器的名字或者 IP 地址。您也许可以省略 username:password ,如果服务器上开放了匿名用户 (user:anonymous password:-wwwuser@)。端口号(以及前面的冒号) 也可以省略这个前提是 server 使用默认的 FTP 端口 21。
|