TCP/UDP协议安全:SYN flooding 与nmap的使用

一、SYN Flooding
1.1 简介
鼎鼎大名的SYN flooding攻击相信信安爱好者都很熟知。它发生在TCP三次握手之间,攻击者向服务器发送很多的SYN请求而收到SYN+ACK后不恢复ACK从而占用服务器资源使其丧失正常服务能力。
若目标机器未开启防护措施(echo 0 > tcp_syncookies),我们使用netwox 76命令就可以发起攻击了:

netwox 76 -i 目标IP -p 端口

1.2 防范措施
通过限制相同IP发起的连接数量看似可以解决这个问题,但其实是不行的。因为伪造IP是一件很简单的事,攻击者更可以通过僵尸网络发起攻击。

接下来我们看看另一种方法,叫做syncache。通常一个四元组可以锁定一个连接(源、目的IP及端口),因此我们可以仅储存该必要信息,而不是直接分配TCB(Transmission Control Block)。收到ACK时再检查SYNCache,若找到了对应项则建立连接。

最后介绍一种现在用的最多的方案,叫做SYNCookies,这种方案思路与上面一种类似,不过更加有效,这种方案在ACK到达之前不分配任何资源。接下来重点介绍这种非常巧妙的方法:

1.3 SYNCookies
我们都知道,TCB第二次握手是服务器发送SYN+ACK包,其中SYN的seq是由服务器自己构建,而客户端需要回复seq+1的ACK包才能完成连接。利用这种机制,我们可以仅通过ACK包的seq序列号来判断我们发送的SYN+ACK的序列号,因此我们便可以想办法将我们的信息“储存”在序列号中,而非我们的内存中,这便是SYNCookies的原理。

在收到SYN包后,服务器不为其创建TCB,而回复ACK+SYN,而其序列号是我们精心创建的:

  • 前5位:t mod 32
  • 中3位:表示m的编码值
  • 最后24位:s

其中t是一个缓慢递增的时间戳(通常是time()逻辑上右移6个位置,这给出了64秒的分辨率)
m为服务器在SYN队列条目中存储的最大段大小(MSS)值
s是通过服务器IP地址和端口号、客户端IP地址和端口号以及值t计算的加密哈希函数的结果。返回值s必须是24位值。

那么这么设置有什么作用呢?我们收到未建立连接的ACK包后,检查其SEQ位,将其减1并拆拆分。通过前五位,我们可以得知时间,判断其有没有过期;通过中3位,可以重建SYN队列条目;通过重新计算s可以确认是否是个有效的SYN Cookie。
问题:
1.慢
2.MSS只有三位,只能表示八个值
3.丢弃其余的TCP选项
4.客户端发送的连接ACK数据包丢失,服务器不会重新发送SYN+ACK

二、nmap
2.1 nmap简介
nmap是一个网络连接端扫描软件,用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端,并且推断计算机运行哪个操作系统(这是亦称 fingerprinting)。它是网络管理员必用的软件之一,以及用以评估网络系统安全。

2.2 各种参数介绍
2.2.1 nmap 目标IP(最不建议使用的,也称为 tcp connect -sT)
TCP/UDP协议安全:SYN flooding 与nmap的使用_第1张图片
在这种默认不加参数的情况下,nmap会尝试与目标机器建立TCP连接,若目标端口开放,则顺利建立连接,nmap发送RST释放连接;若端口关闭,则服务器收到SYN包后回复RST直接断开连接。若SYN包被过滤则无法收到回复。

  • 功能:与目标发送并尝试建立TCP连接,通过各种情况判断目标机器端口开放/过滤情况
  • 优点:不需要特殊权限(TCP正常握手过程,不需要权限)
  • 缺点:需要建立连接,不够隐秘;若目标主机防火墙功能强无法判断端口情况
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第2张图片
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第3张图片
    2.2.2 sudo nmap 目标IP (最常用的,也称为TCP SYN 半开-sS)
    提供了权限,这样我们可以违反协议栈的规定来发包了。这样我们会在接受到服务器返回的SYN+ACK后回复RST,不用建立TCP连接。
  • 功能:向目标发送SYN若收到ACK+SYN则回复RST
  • 优点:不需建立TCP连接,隐秘性比较好
  • 缺点:需要权限;若目标主机防火墙功能强无法判断端口情况
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第4张图片
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第5张图片

(以上两种nmap方法,若目标防火墙过滤了就无可奈何了,接下介绍另外几种)
2.2.3 sudo nmap -sA
针对端口被过滤的情况,我们有另一种测试目标是否被过滤的方法,-sA。即向目标直接发送ACK,服务器莫名其妙收到ACK后会很客气的回复一个RST。但如果目标端口被过滤了我们就收不到RST了。

  • 功能:判断目标机器的端口过滤情况
  • 缺点:无法判断端口开放情况
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第6张图片
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第7张图片

2.2.4 sudo nmap -sF/-sX/-sN(判断目标端口是否被关闭)
其中FIN扫描是设置TCP FIN位;Xmas扫描是设置FIN、PSH以及URG位,NULL扫描是不设置任何标志位。

主要是对这些数据包,如果是开放的端口,那么不会产生任何的响应;如果是关闭的端口,会生成一个RST回复。当然,如果端口被过滤,也不会有任何响应。所以,这些扫描并不能判断开放端口,它只能返回open|filtered;或者是closed。

(-sA可以判断目标端口是否被过滤,-sF可以判断目标端口是open|filtered,因此两者综合就可以判断目标主机的端口情况了,如下图)
TCP/UDP协议安全:SYN flooding 与nmap的使用_第8张图片
2.2.5 sudo nmap -f 目标端口
使用微小碎片,将TCP头部拆成几个碎片,使其更加隐蔽与难以被过滤

2.2.6 nmap idle 扫描
这是一种更加隐蔽的扫描方式,攻击者可以不用向目标发送数据包就完成扫描工作。
其要点就是利用一台短时间内没有数据流的zombie主机。
流程:

  • 扫描者发送SYN/ACK给zombie主机,得到一个RST回复,记录下其IP ID
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第9张图片
  • 扫描这伪造数据包,冒充zombie发给目标主机SYN包。如果目标主机上该端口是开着的,那么会发送SYN+ACK,zombie收到这个数据包,会发送RST;如果是关着的,会发送RST,zombie收到这个数据包,会直接忽略。
    TCP/UDP协议安全:SYN flooding 与nmap的使用_第10张图片
  • 扫描者再次发送SYN/ACK到Zombie,查看IPID。如果增加为2,说明目标主机相应端口开放;否则如果增加1,说明目标主机端口关闭。如果是增加了一个比2还大的数字,那么就说明Zombie主机不太称职,它发的包太多了

观察以上流程,在这种扫描形式下,有一点很重要:寻找这样的Zombie主机,并且确保在探测期间,IPID不会因为其他原因而增加

优点:非常隐蔽,可能还能利用zombie主机与服务器的信任关系绕过一些过滤机制。
缺点:无法判断关闭/过滤情况。且收zombie的使用情况影响。

2.2.7 sudo nmap -sV IP(版本扫描)
版本扫描顾名思义,就是针对软件版本的扫描,这种扫描需要发送大量的数据包,并且需要与自己内部的指纹库进行比较,从而判断。

参考:https://zhuanlan.zhihu.com/p/59750145

你可能感兴趣的:(网络安全)