IP数据报格式:
从前往后依次是:报头中字段含义及所占位数
版本4bit,首部长度4bit,区分服务8bit,总长度16比特,标识16bit,标志3bit,分片便宜13bit,生存时间8bit,协议号8bit,校验和16bit,源IP32bit,目标ip32bit,选项。
---ip数据包,报头总大小是20Byte,160bit
----TCP协议号为6,UDP协议号为17
----IP数据包的总大小范围不能超过65535字节,2的16次幂
----分片偏移用于表示,数据包切割时是从第多少个字节切割的。英文:Fragement offset
----标志总共3位,第二位为0表示允许分片(用 may fragment关键字表示),第三位为1表示后面还有分片(用morefragments关键字表示),为0表示最后一个分片(用last fragment关键字表示)。用flags表示。
IP分片:每种不同类型的网络的链路层,可以传输的帧长度是不同的,所以要经过网络设备对iP数据包进行切割分片。
-----比如以太网帧的最大长度(MTU值)只能是1500字节,小于这个字节数的ip包会直接被封装成1个帧,而大于这个字节数的会被切割为1500字节大小
----PPP链路的MTU值为296字节
再分片:被分片的IP数据包的每个分片通过首部的标识,也称数据包ID来归类自己属于哪一个数据包,然后所有的分片到达目的地后会根据偏移量来重装,如果碰到链路层为更小MUT的网络,就会将分片的Ip包再分片。
分片安全问题:在老式操作系统中遇到IP分片中偏移量不合理的情况,就会产生分片重叠,然后系统崩溃,认为制造这种不合理分的话,就成为泪滴攻击。
linux中的hping命令,可以构造各种IP,ICMP,TCP,UDP报文,发给目标主机
-1 则会发送ICMP报文,即经过ICMP报头封装后又经IP报头封装的IP数据包
-2则会发送UDP报文,即经过UDP报头封装后又经IP报头封装的IP数据包
-p 可以指定目的主机端口号
-i 可以设置时间间隔,如:-i u100表示100微秒
-S 设置SYN标志
-a 伪造源ip地址
-c 发送数据包个数
-N 设置IP包的ID
-t 设置TTL 默认64
-x 设置ip报头 more fragments 标志
-g 设置fragment offset
-C 设置ICMP类型
-d 设置载荷大小,即ip数据包或分片IP数据包总大小,不算额外添加其他协议时的报头。
ICMP报文
ICMP报文首部主要字段内容依次为:
类型8bit代码8bit校验和16bit其余首部部分
长见类型分别为:0,3, 4, 5,8,11, 12
类型0,和 8 用于查询,分别为回送请求Echo 和回送应答 Echo Reply
类型3 用于回送终点不可达报告,终点不可达又分为主机不可达和端口不可达,分别在代码字段用代码1和3表示
类型4 用于回送源抑制通知,当网络拥塞时,告知发送源放慢发送速度。
类型5 改变路由报告
类型11 用于回送超时报文,当路由器或主机收到数据报后,发现ttl分别为0或1的的话,将回送超时报文,并在代码段标记0;当主机长时间没有收到所有分片时,将回送超时报文,并在代码段标记1
类型12 报告参数问题
注意:此处的超时与ping命令的超时要区分开,ping命令是发出Echo请求后2秒没有收到回送应答就会显示超时request timed out .
几种构造ip数据包或分片,或ICMP报文的命令实例:
实例1:ping –l 2000 192.168.1.1 –n 1
//发送一个载荷量为2000 的echo请求报文给192.168.1.1
实例2:构造两个正常的ICMP 请求,ip数据包分片
./hping 192.168.1.1 -1 –x –d 1000 –N 100 –c 1
./hping 192.168.1.1 -1 –d 200 –g 1008 –N 100 –c 1
//第一个表示构造ICMP 的启用more fragment标志的,载荷量1000的标识为100的一个分片;第二个类似,只是多设置了偏移量为1008 且没设置 more fragment 标志,(默认设置last fragment标志)
实例3:构造两个重叠便宜的IP分片
./hping 192.168.1.1 -1 –x –d 1000 –N 100 –c 1
./hping 192.168.1.1 -1 –d 200 –g 400 –N 100 –c 1
//构造了两个ICMP请求ip包分片,第一个载荷量1000,标识100,第二个载荷量200标识100,但本应偏移量为1008,可他却设置了400
这样在分片重组时就会重叠。
如果将向上述命令写入脚本,并用循环语句,持续发送,就成了发送泪滴攻击的攻击程序了。
TCP
tcp报文段封装在IP数据报中,
IP首部 TCP报文段
TCP报文段的首部格式
源端口号16bit目标端口号16bit序号32bit确认号32bit首部长度4位保留6bit控制位6bit窗口值16bit校验和16bit紧急指针16bit选项40Byte
当TCP从进程接收数据字节时,会把接收到的每个字节放在缓存中编号,第一个字节的编号会随机产生,范围是0~223-1,其他字节按顺序排列,第一个字节编号作为整个ctp数据段的序号。接收端会把数据按这个序号开始排列。
----CTP首部长度20byte,最大60byte
---窗口值,可以用来实现流量控制
---紧急指针,当URG控制位为1时,紧急指针有效。
----选项,最多40byte
控制位:
URG---紧急指针有效位,根据紧急指针的值从报文段中提取数据放在队列最前面执行。
ACK--- ack=1时确认序列号字段有效
PSH---PSH为1时,要求接收方尽快将数据送达应用层
RST----RST为1时,重新建立TCP连接
SYN---同步序号位,ctp要建立连接时,此位设为1
FIN---当需要断开连接时,此位为1
连接建立:
第一次握手:客户端发送SYN到服务器,端口进入syn-send状态
第二次握手:服务器发送SYN+ACK到客户端,并进入syn-recv状态
第三次握手:客户端发出ACK 报文段,服务器和客户端都进入 established状态
连接终止:
客户端发送FIN+ACK报文到服务器,通知服务器自己要关闭端口
服务器发送ACK报文给客户端
服务器发送FIN+ACK报文到客户端
客户端发送ACK报文确认。
连接复位:
通过RST位置为1实现
一般应用于拒绝连接请求,或异常终止,或终止空闲连接。
TCP的MSS:
MSS表示 可以被终点接收的TCP报文段最大长度,不包括TCP首部长度
一般情况MSS=MTU-20-20
MSS通过客户机与服务器进行协商确定的,当两边都有声明时,取较小的一个值
都没申明,或有一方没有声明的话,取默认值536
MSS信息只存在SYN报文和SYN+ACK报文的选项字段中。
TCP其他机制:
1流量控制: TCP流量控制使用类似滑动窗口的机制实现,将缓存队列中的数据分为:已发送且已确认数据,已发送但未确认数据,可立即发送数据,在窗口展开前不能被发送的数据。
窗口范围内包含:已发送但未确认数据和可立即发送数据,通过窗口向前后展开的大小来控制一次性读取数据的多少,从而实现流量大小的控制。
2.差错控制
3:拥塞控制
4:TCP计时器
分为:重传计时器,持久计时器,保活计时器,时间等待计时器。
UDP协议:
首部格式:
源端口号16bit 目的端口号16bit UDP长度16bit校验和16bit。
UDP除了校验和外没有其他差错控制机制,使用UDP需要额外提供这些机制。
实例模拟实现:死亡之ping (ping of death),当然如今的系统已经修复了老式系统的漏洞。
ping 192.168.1.1 –s 7000 –c 1
//结果为系统报错
hping 192.168.1.1 -1 –d 70000 –c 1
//结果为系统只截取4464大小的数据
实例:SYN Flood攻击
hping 192.168.1.1 –p 80 –i u1 –S –a 1.1.1.1
// 网页打开缓慢,CPU使用率升高,netstat –an 看到有很多 SYN_RECEIVED.
--------------------------------------------------------------------------------Frank Chen