Nmap-网络扫描实战(2)--端口扫描

开放的端口意味着远程主机上正在运行着联网的服务,而某些难以察觉的编程错误或实现缺陷会使这些服务容易受到攻击,有时甚至成为侵入整个系统的突破口。
这些网络服务往往使用 TCP 或 UDP 作为传输协议。TCP(Transmission Control Protocol)是一种连接导向的协议,相对更常用。而 UDP(User Datagram Protocol)是一种非连接导向的协议,多用于对传输速度的要求高于数据完整性的服务。
而通过检测端口及服务来入侵远程系统的渗透测试方法即为端口扫描

一、TCP 端口扫描技术

1. Connect 扫描

Connect 扫描对每一个端口都尝试建立完整的 TCP 连接(三步握手),如果连接创建成功,则该端口被判定为开放的。
connect scan 的报文信息

2. Stealth 扫描

Stealth 扫描也常被称作 SYN 扫描半开放扫描。该技术向每一个被扫描的端口发送一个单独的 SYN 包,如果收到 SYN+ACK 回复,则该端口被判定为开放的。这之后不会再遵照三步握手的程序向目标主机发送 ACK 包,所以并没有开启完整的TCP连接,而目标主机的日志系统一般也不会记录这类扫描的痕迹。SYN scan 的报文信息

3. Zombie 扫描

『僵尸』扫描背后的实现原理比较负责。整个过程如下图所示:Zombie Scan
简单来说,

  1. 先找一个远程系统作为『僵尸』主机,该主机与网络中的其他主机之间不存在活跃的网络连接。
  2. 向『僵尸』主机发送一个 SYN+ACK 包并记录下该主机初始的 IPID 值。
  3. 伪装成『僵尸』主机(将报文中的源IP地址替换为『僵尸』主机的)向目标主机发送一个 SYN 数据包。
  4. 如果目标端口是开放的,则目标主机会向『僵尸』主机返回一个 SYN+ACK 包,而『僵尸』主机(觉得很懵逼。。。)则返回一个 RST 包并把自己的 IPID 值增加 1。
    如果目标端口是关闭的,则目标主机会向『僵尸』主机返回 RST 响应,而收到 RST 的『僵尸』主机(依然不清楚发生了什么)则不做任何动作,IPID 值也不会增加。
  5. 向『僵尸』主机发送另一个 SYN+ACK 包,从返回的 RST 包中获取最终的 IPID 值。如果该值比第 2 步时增加了 1,则目标端口是关闭的。如果最终增加了 2,则目标端口是开放的。

一点儿也不简单哈。。。

命令示例

在特权用户下执行时,nmap 默认采用 SYN 扫描方式(即不开启完整的TCP连接)以节省扫描时间。同时这种扫描行为也不易被目标主机的日志系统记录到。
而普通用户不具有修改原始数据包的权限,所以只能通过 connect系统调用 打开完整的 TCP 连接以完成对远程系统的扫描。
所以从效率和安全的角度出发,应优先选择 SYN 扫描而非 connect 扫描。
具体可参考 nmap 官方文档——端口扫描技术

1
2
3
4
5
$ sudo nmap 10.2.64.1 -p 80
# 特权用户 SYN 扫描

$ nmap 10.2.64.1 -p 80
# 普通用户 connect 扫描

也可以显式地指定采用哪种扫描方式,-sT 表示 connect 扫描,-sS 表示 SYN 扫描。-p 选项用来指定扫描的端口号或端口范围(一共有65535个端口可供扫描,默认扫描1000常用的端口)。如:

1
2
$ sudo nmap 10.2.64.1 -p 21,22,80,443
$ sudo nmap 10.2.64.1 -p 20-25

Scan results
从上述命令的输出结果中可以看出,该主机的 22,80 端口是开放的(很可能运行着ssh服务和http服务),21 和 443 端口是关闭的。

二、UDP 端口扫描技术

UDP 扫描相对显得更有难度,同时也更乏味和耗时。
其中一种方式依赖于ICMP端口不可达响应,即假设每一个被扫描的 UDP 端口在不开放时都会回复 ICMP 端口不可达的响应,而收不到该响应时则判定端口为开放的。
但有时候被扫描主机不允许生成端口不可达响应,或该响应被限制在一定频率内,也可能是被主机的防火墙隔离。此种方法就会产生不准确的结果。
另一种方式是通过发送服务相关的请求来探测远程主机上对应的服务。此种方法可信度更高,但同时消耗的时间也更多。
UDP scan
open|filtered 表示该端口可能是开放的,也可能被防火墙屏蔽掉了。