概述
概念
- Transmission Control Protocol传输控制协议,工作在传输层,制定了一种数据可靠传输标准。
- 数据包过大时,在传输层会对数据进行分段,在网络层会对数据进行分片;
传输层标准:
- TCP:面向连接实现点对点的高可靠传输(超时重传)
- UDP:不面向连接的高效率传输
特点:
-
基于字节流
-
面向连接(点对点)
- 数据传输前需要建立连接(三次握手)
- 数据传输完毕后需要断开连接(四次挥手)
-
高可靠传输
- 超时重传
- 数据校验
应用层使用TCP进行数据传输的常见协议
数据字段
Source Port: 53918 源端口,一般随机申请系统闲置端口
Destination Port: 443 目标端口,跟接收数据的服务程序相关
Sequence Number: 1 (relative sequence number) 序号,表示本报文段发送的第一个字节编号
Sequence Number (raw): 279391623 序列号(在三次握手和四次挥手时用于标识身份)
Acknowledgment Number: 33 (relative ack number) 确认序列号(在三次握手和四次挥手时用于校验身份)
0101 .... = Header Length: 20 bytes (5) 头部数据长度,定位上层数据开始位置
Flags: 0x010 (ACK) 标识,各种状态标识
URG:紧急报文数据状态,需要发送紧急数据时,该状态值为1
SYN:建立请求连接状态
ACK:确认状态
FIN:断开连接(释放连接)状态
PSH:推送状态,当前数据需要推送给上层设备处理,该状态值为1
RST:重置连接状态,当连接出现错误,需要重新建立连接时,该状态值为1
Window: 511 窗口大小,表示接收到接收窗口剩余空间大小
Checksum: 0x4752 [unverified] 校验和,保证数据完整性
Urgent Pointer: 0 紧急指针,紧急数据的字节大小
三次握手(建立连接)
案例
win10发起建立连接请求
- 请求数据:SYN(1)+seq(win10身份号),将自己50711端口状态更改为
SYN_SENT;
蜗牛服务器接收到请求后
- 确认数据:SYN(1)+ACK(1),seq(蜗牛服务器身份号)+ackSeq(win10身份号+1),将自己80端口状态更改为
SYN_RCVD;
win10接收到服务器确认数据后
- 将自己的身份号加1后与蜗牛服务器发送的ackSeq值进行比对,如果不同,说明该数据包不可信,则不处理该包,否则,数据包可信;
- 再次确认数据:ACK(1),seq(win10身份号+1)+ackSeq(蜗牛服务器身份号+1),将自己50711端口状态更改为
ESTAB_LISHED;
-
蜗牛服务器接收到再次确认数据后
- 将自己的身份号加1后与win10发送的ackSeq值进行比对,如果不同,说明该数据包不可信,则不处理该包,否则,数据包可信;
- 将自己80端口状态更改为
ESTAB_LISHED;
四次挥手(断开连接)
半连接状态
- 在TCP3次握手过程中,如果客户端发起SYN数据包,但未发送ACK数据包,服务器会处于
SYN_RCVD状态(半连接状态),服务器需要分配相应的系统资源维持该半连接状态,如果同一时间服务器需要维持大量半连接状态,需要消耗大量系统资源,可能导致服务器资源耗尽,达到攻击目的;
SYN泛洪攻击实验
主机
- 靶机:win10
- 攻击主机:kali
步骤(kali)
- 查看网络中主机端口开启情况
nmap 目标主机IP
nmap 目标网络
nmap 192.168.126.140
nmap 192.168.126.0/24 - 使用命令向靶机发送大量TCP的SYN数据包
hping3 -c 数据包个数 -d 数据包大小 -S -w 64 -p 目标端口 --flood --rand-source 靶机IP
hping3 -c 100000 -d 1000 -S -w 64 -p 445 --flood --rand-source 192.168.126.140
SYN泛洪攻击研判
- 使用捕包攻击抓取网卡数据包,查看是否存在大量SYN状态数据包
SYN泛洪攻击
防火墙
-
TCP代理
- 使用防火墙代替服务器与外界主机进行3次握手过程,如果握手正常,则防火墙将数据包转发到内部服务器,如果握手异常(只有SYN数据包,没有ACK数据包),则丢弃该数据包;
-
TCP源探测
- 防火墙收到SYN数据包后,会主动发送一个伪造的SYN+ACK,如果客户端是真实客户端,验证确认序列号不正确时,会发起RST(重置连接)数据包,如果客户端没有发送RST数据包,则防火墙判定该SYN数据包为不正常连接数据包,不处理该数据包;