业务范围
联系我们

地址:这里是您的公司地址

电话:0896-98589990

传真:0896-98589990

邮箱:

新闻资讯当前位置:官网首页 > 新闻资讯 >
Linux内核TCP MSS机制详细分析

发布时间:2019-11-12

   Linux内核TCP MSS机制详细剖析

上星期Linux内核修正了4个CVE缝隙[1],其间的CVE-2019-11477感觉是一个很厉害的Dos缝隙,不过由于有其他事打断,所以发展的速度比较慢,这期间网上现已有相关的剖析文章了。[2][3]

而我在测验复现CVE-2019-11477缝隙的进程中,在第一步设置MSS的问题上就遇到问题了,无法到达预期作用,可是现在揭露的剖析文章却没对该部分内容进行详细剖析。所以本文将经过Linux内核源码对银河娱乐赌场TCP的MSS机制进行详细剖析。

1. 存在缝隙的靶机

操作体系版别:Ubuntu 18.04

内核版别:4.15.0-20-generic

地址:192.168.11.112

内核源码:

带符号的内核:

封闭内核地址随机化(KALSR):

装一个nginx,供测验:

2. 宿主机

操作体系:MacOS

Wireshark:抓流量

虚拟机:VMware Fusion 11

调试Linux虚拟机:

编译gdb:

gdb进行长途调试:

3. 进犯机器

自己日常运用的Linux设备就好了

地址:192.168.11.111

日常习气运用Python的,需求装个scapy结构自定义TCP包

有三种方法能够设置TCP SYN包的MSS值

1. iptable

2. route

3. 直接发包设置

PS:运用scapy发送自定义TCP包需求ROOT权限

flags选项S表明SYN,A表明ACK,SA表明SYN, ACK

scapy中TCP可设置选项表:

可是这个会有一个问题,在运用Python发送了一个SYN包今后,内核会主动带上一个RST包,查过材料后,发现在新版体系中,关于用户发送的未完结的TCP握手包,内核会发送RST包停止该衔接,应该是为了避免进行SYN Floor进犯。解决方法是运用iptable过滤RST包:

关于该缝隙的细节,其他文章中现已剖析过了,这儿简略的提一下,该缝隙为uint16溢出:

所以在mss_now小于等于8时,才干发作整型溢出。

深入研究的原因是由于进行了如下的测验:

进犯机器经过iptables/iproute指令将MSS值为48后,运用curl恳求靶机的http服务,然后运用wireshark抓流量,发现服务器回来的http数据包确实被分割成小块,可是只小到36,离料想的8有很大的距离

Linux内核TCP MSS机制详细剖析

这个时分我挑选经过审计源码和调试来深入研究为啥MSS无法到达我的预期值,SYN包中设置的MSS值到代码中的mss_now的进程中发作了啥?

随机进行源码审计,对发作溢出的函数tcp_set_skb_tso_segs进行回溯:

随后对tcp_current_mss函数进行剖析,要害代码如下:

看完这部分源码后,咱们对MSS的意义就有一个深入的了解,首要说一说TCP协议:

TCP协议包含了协议头和数据,协议头包含了固定长度的20字节和40字节的可选参数,也就是说TCP头部的最大长度为60字节,最小长度为20字节。

在__tcp_mtu_to_mss函数中的mss_now为咱们SYN包中设置的MSS,从这儿咱们能看出MSS最小值是48,经过对TCP协议的了解和对代码的了解,能够知道SYN包中MSS的最小值48字节表明的是:TCP头可选参数最大长度40字节 + 数据最小长度8字节。

可是在代码中的mss_now表明的是数据的长度,接下来咱们再看该值的核算公式。

tcphdr结构:

该结构体为TCP头固定结构的结构体,巨细为20bytes

变量tcp_sk(sk)->tcp_header_len表明的是本机宣布的TCP包头部的长度。

因而咱们得到的核算mss_now的公式为:SYN包设置的MSS值 – (本机宣布的TCP包头部长度 – TCP头部固定的20字节长度)

所以,假如tcp_header_len的值能到达最大值60,那么mss_now就能被设置为8。那么内核代码中,有方法让tcp_header_len到达最大值长度吗?随后咱们回溯该变量:

所以在Linux 4.15内核中,在用户不干涉的情况下,内核是不会宣布头部巨细为60字节的TCP包。这就导致了MSS无法被设置为最小值8,终究导致该缝隙无法使用。

咱们来总结一下整个流程:

三次握手完结

随后依据不同的服务,靶机主意向进犯者发送数据或许接收到进犯者的恳求后向进犯者发送数据,这儿就假定是一个nginx http服务。

这儿假定一下该缝隙或许使用成功的场景:有一个TCP服务,自己设定了TCP可选参数,而且设置满了40字节,那么进犯者才有或许经过结构SYN包中的MSS值来对该服务进行Dos进犯。

随后我对Linux 2.6.29至今的内核进行审计,mss_now的核算公式都相同,tcp_header_len长度也只会加上时刻戳的12字节和md5值的18字节。


地址: 电话:
Copyright © 2018 银河国际赌场银河国际赌场-银河娱乐赌场 All Rights Reserved