概念
端口扫描是指向目标主机的特定端口发送探测数据包,并分析其响应,以了解目标系统上哪些网络服务正在运行、处于监听状态,以及是否存在潜在的安全漏洞
一个常规的端口扫描框架图
多达65536个探测

如果把一台电脑比作一栋房子:
- IP地址 :这栋房子的门牌号
- 端口 :这栋房子上的各个门(比如80 是 HTTP 网页服务的门,443 是 HTTPS 加密网页服务的门)
- 端口扫描 :一个小偷沿着房子挨个敲门,看哪个门是开着的,哪个门是关着的,以及门后面有没有人应答
为什么需要端口扫描?
- 网络管理员视角:
1)了解网络中有哪些设备,这些设备开启了哪些服务,确保没有未经允许开启的服务
2)检查防火墙规则是否生效,确保只有必要的端口对外开放,关闭不必要的端口以减小攻击面 - 攻击者视角
1)信息收集: 这是网络攻击的第一步。通过扫描,攻击者可以知道目标运行了什么操作系统,开启了哪些服务
2) 寻找突破口: 知道了具体的服务,就可以查找该版本是否存在已知漏洞,从而进行下一步攻击
端口扫描类型
- TCP 全连接流程扫描
原理: 完整地完成 TCP 三次握手(SYN -> SYN-ACK -> ACK),如果连接建立成功,说明端口开放
特点: 准确率高,不需要特殊权限,但速度慢,容易被目标系统日志记录 - SYN 半连接扫描(隐蔽扫描,也是目前最流行的扫描方式)
原理: 发送 SYN 包,如果收到 SYN-ACK 包,说明端口开放,此时攻击者不发送最后的 ACK 包,直接中断连接。
特点: 速度快,且因为没建立完全连接,很多应用程序不会记录,相对隐蔽,需要 root 权限才能构造这种数据包 - UDP 扫描
原理: UDP 是无连接的,所以判断逻辑不同,如果发送 UDP 包后收到 ICMP 端口不可达 的错误,说明端口关闭。如果没收到任何回应(或收到特定服务响应),通常认为端口开放或被过滤。
特点: 速度慢且不可靠,因为 UDP 协议本身不保证送达,而且防火墙会丢弃 ICMP 包,导致误判 - FIN扫描
原理: 发送违反常规的标识位数据包。根据 RFC 规范,关闭的端口会回复 RST包,而开放的端口会忽略该包
特点: 更隐蔽,能绕过一些简单的无状态防火墙,但通常只对 Unix/Linux 系统有效
端口扫描常用工具
- Nmap: 业界标准,功能极其强大,支持几乎所有扫描类型,还能识别操作系统和服务版本。
- Masscan: 号称最快的扫描器,可以扫描全网
- Zmap: 专门用于大规模互联网扫描
端口分类(针对server)

为什么针对server?
IANA(互联网数字分配机构)维护端口号分配表的初衷,主要是为了解决服务端的冲突问题,所以这个主要是服务端的规范
因为客户端遵循:/proc/sys/net/ipv4/ip_local_port_range

端口扫描,大多是用于黑客攻击的
探测和扫描端口,极少部分是用于正向的网络管理,每一次的扫描更像是最初的信息收集步骤,再发起攻击前寻找感兴趣的漏洞。那我们就要引出定向端口扫描的概念。
定向端口扫描
在目标端口寻找特定的漏洞。如今更复杂的工具会尝试识别硬件、操作系统和版本软件。这些工具被设计用来确认目标服务是否可能有一个特定的漏洞。

探测行为是无害的,但是DOS攻击却不是
DOS攻击思想
- 用数据淹没系统资源,打扰或者严重的使互联网连接降级,用捆绑本地服务的方式使合法的请求不能被响应,甚至使系统崩溃
DOS攻击类型
- TCP SYN泛洪(SYN Flood)
- ping 泛洪(ping-Flood)
- UDP泛洪(UDP-Flood)
- 分片炸弹(fragmentation bombs)
- 缓冲区溢出(buffer overflow)
- ICMP路由重定向炸弹(ICMP routing redirect boomb)
以TCP SYN泛洪(SYN Flood)为例:
- TCP SYN这种攻击会消耗系统资源,是的系统资源无法再分配给更多的TCP 连接,这种攻击通过建立三次握手,并结合IP源地址欺骗

这种情况下,SERVER应答后,泛洪攻击的主机并不会进行相应(ACK),永远也不会,更不可能发送RST消息拆除这个连接,只能坐等超时。所以当前的连接是一个半打开的TCP连接。
Linux系统急救方案
- 采用源地址过滤方案:过滤掉常用于欺骗的源地址,但不能保证过滤的在合法分类中的伪造地址
- 启用内核Linux cookie模块:这能够显著缓解由于SYN泛洪导致的资源短缺
启用内核Linux cookie模块方案,有什么优点:
- 当链接队列被填满时,系统开始使用SYN cookies来应答SYN请求,并且会释放队列中的空间,所以队列永远不会被填满
- cookies的超时时间很短暂,所以client必须要快速应答,而后server才会使用SYN-ACK进行相应。
启用内核Linux cookie模块方案方法:
- echo 1 > /proc/sys/net/ipv4/tcp_syncookies

- 内核源码:make menuconfig开启

分片炸弹(fragmentation bombs)
攻击者通过发送大量精心构造的IP分片包,迫使目标系统消耗大量资源进行重组,最终导致系统瘫痪
如何理解:
你把整个屋子的卫生搞得乱七八糟,家里人是不是得花费大量的时间和劳动力去打扫和清洁,最终人累得趴下了,导致无法去正常的去安排家里的事务
分片
数据包在从一个路由器眼路径到下一个路由器时,网关路由器可能需要将包传递到下一个路由器前,分切为更小的片段
嗯?这个分片怎么跟我理解的分片不一样?为什么在路由器还要分片呢?
- 分片炸弹中的"分片"和理解的IP分片,概念本质上是同一个机制,但谁来做、什么时候做有重要区别

如上情况,发送3000字节的数据包,是不是就需要分片了呢,所以我们的重点再网关之间的分片,而非发送端的ip分片
回归正题
在正常的分片中,第一个分片会包含传输层报文中的源端口号 和目的端口号,而接下来的分片则不会包含!
发送端如何进行分片探测的?
发送端的系统通常回想目的主机发起连接前进行MTU发现,通过发送IP包头选项域中设置了不分片标志实现的。如果中间路由器必须分片,他会丢弃数据包并返回ICMP 3(目的不可达)错误消息以达到告知"需要分片"
攻击方法
对小分片的使用时构造最初的分片,如果第一个分片被送到目的主机,再非法让传输层的源端口和目的端口都包含在第二个和后续的分片中,防火墙通常也会允许这些分片通过,因为他们过滤所基于的信息还未呈现出现,这种攻击非常有用,可以使数据包穿过能不被允许穿过的防火墙并重新组装超大(可能是超过65535字节的数据包)的数据包使得系统崩溃
核心原因
接下里的分片中,数据偏移字段可以被更改,可以覆盖第一个分片中的端口信息,可以访问不被允许的服务,因为数据偏移字段可以被更改,以至于数据包重组时使用的偏移量可以变成负数,但是内核字节拷贝通常使用的是无符号的变量,这个负值就会变成非常大的正数,导致污染内核内存。
PS:更多的DOS攻击类型深入需要您的自行深入,希望能抛砖引玉