0x00. TearDrop简介
TearDrop是存在于上个世纪的拒绝服务攻击,尽管对现代的电脑已经基本不管用了,但是了解它的原理仍然是我们需要掌握的,这篇文章笔者是写给自己看的,大家不感兴趣的话可以绕过。
0x01. 数据链路层包结构分析
[*]这是一个完整的数据链路层数据包结构图,下面笔者将介绍其中具体的包结构信息
1. 目的地址:数据包目标MAC地址
2. 源地址:数据包来源MAC地址
3. 类型:代表上层协议,对于数据链路层来说它的上层协议是IP协议(0x0800)
4. 数据:数据部分中包含有上层协议数据,对于数据链路层来说就是网络层、传输层、应用层,占46-1500字节,也就是最大容纳的数据量是1500字节
5. FCS:FCS是数据帧校验位,用于确定数据包在传输过程中是否损坏
0x02.IP数据包分析
[*]上图相当于数据链路层的数据部分的详细结构
接下来分析一下IP数据包中主要的字段信息,也正是在IP数据包中会存在TearDrop攻击的原理:
1. Version:IP协议版本信息,现在一般是IPV4,占4bit(看清楚,是比特不是字节)
2. Total Length:IP数据包的总长度
3. Identification:该字段标记当前分片为第几个分片,当数据量过大超过1480字节时,IP层会将数据分段多次传输,但是都会带有相同的Identification来表示这是同一段数据,当接收端接受到所有的数据之后又会将这些小段数据重组成原来的报文数据
4. Flags:标志位,表示该报文是否分片,如果置为0x01则表示后面还有数据需要接受,与Identification一样是用来控制大数据(超过1480byte)传输的
5. Fragment Offset:片偏移,当需要分片传输数据时用来表示当前分片在原数据字段的偏移量,以后重组数据时的排序依据
6. Time To Live:也就是常说的TTL值,表示当前报文还能生存多久,每经过一个路由器TTL值减一,用来减少网络垃圾
7. Protocol:表示上层所用的协议,IP层上层协议可能是UDP、TCP、ICMP等
8. Source IP Address:源IP Destination IP Address:目标IP
9. Data:IP数据包实际传输的数据,当然所指的数据和IP包结构类似,需要层层划分才能得到真正传输的数据
[*]上面所介绍的IP包头总共占用20byte,所以Data部分最多还能传输1480byte的数据
0x03. ICMP数据包抓包分析
上面介绍了这么多原理性的概念,那么接下来笔者实际抓取一些数据包来给大家分析看看包头结构。
[*]通过抓取ICMP数据包就可以很好的分析IP包结构,因为此时抓取到的数据包中IP上层协议只有ICMP,所以Data部分就只表示ICMP协议数据,没有更高层协议的影响
sudo ping xx.xx.xx.xx -c 3 -s 5912
[*]先介绍一下我所使用的命令,ping表示发送ICMP数据包,-c 3表示总共发3个ICMP层的数据包,-s 5912表示每个ICMP数据包中的数据量为5912 byte。
[]之所以要用5912 byte,是为了满足1478\4 + 2*4 = 5920 ,也就是一个5912 byte大小的ICMP包一次性肯定发不完,所以需要分片发送,一个数据包发送的Data段最多为1480 = 1478 + 2 ,也就是我们所要求的数据(1478 byte)加上2 byte的Protocol协议号,这样分成4片刚好能发完
[*]上面就是我所抓取到的数据包,可以看到包的Total Length是1500 byte,包头占了20 byte,剩下的Data全部占满,占用了1480 byte。刚好分成4片传输5920 byte的Data
0x04. TearDrop攻击原理
写了这么多笔者都快写懵了:),但是必须要有上面的知识储备才能真正理解TearDrop形成的原理,所以我还是全部写下来了,还有就是为了以后再来回顾的时候很容易就能看懂,同时给大家普及一点协议方面的知识。
原理介绍
1. 最开始介绍了Fragment Offset可以控制片偏移量,而正常情况下这是一个很不错的功能,可以帮助我们重组数据包,就如上面截图所示,但是作为一名安全研究者我们就要研究它不正常状态会发生什么情况
2. 假如正常情况下第一片传输了1480 byte的数据,那么第二片的Fragment Offset在正常情况下肯定为1480,偏移这么多之后再传输数据,这样传输过程并不会发生什么错误
3.但是,如果hacker主动修改第二片的Fragment Offset,让Fragment Offset:1380传输过去,那么就会覆盖第一片中的数据,此时这种结果对于上个世纪的机器来说是非预期情况,就会出现蓝屏死机等现象,就达到了攻击的预期目的
4.然而,对于现代操作系统来说一旦出现这种情况则会直接覆盖数据或者丢弃数据包来应付,所以此种攻击几乎无效了
[*]下面是笔者修改后的shell脚本,主要就是利用hping3来发送修改Fragment Offset后的包到目标机器
123456789101112 if test $# -eq 1thenfor((i=100;i<150;i++))dohping3 $1 -1 -x -d 1000 -N $i -c 1hping3 $1 -1 -d 200 -g 400 -N $i -c 1doneelseecho "[*]YOU SHOULD DO LIKE THIS: ./teardrop [target_IP]"echo "[*]please enter again!!"fi