开发CVE-2016-5696利用程序要面临的一些问题

2016年8月,Linux爆出了编号为CVE-2016-5696的TCP连接漏洞。关于该漏洞的一般性描述,可见该篇文章。其官方Paper在这里阅读。 笔者作为某国企的安全研究人员,在研读了其Paper和寻找了大量网站后,并没有发现现成的Exploit代码或者工具,于是想自己写一个来对内网安全进行确认。 关于该漏洞,其主要问题是规范RFC 5961在试图增强TCP安全性时,引入了一个新的安全问题,而Linux算是被坑,因为Linux内核组完全按照规范做了实现(BSD或者AIX为什么没有该问题,大概是并没有完全实现其要求吧)。简述一下其原理就是Linux有一个默认内核参数sysctl_tcp_challenge_ack_limit=100。而Challenge Ack是在TCP过程中对于收到异常包时给予的回应,而该内核参数的意思是每秒钟全局只能发送100个Challenge Ack包。于是因为这个全局阀值的存在,第三方就可以通过发送异常包引出Challenge Ack,从而观察其个数来猜测通讯双方的一些参数。 比如,笔者要破环TCP双方的链路,首先就要猜测出客户端的IP和端口以及服务器端的IP和端口。一般来说服务器端的IP和端口是公开的,假设我们可以通过木马或者其它手段知道客户端IP的情况下,重点就落在了猜测其客户端端口上。这时候,我们冒充客户端端口发送SYN请求到服务器,如果该端口的连接确实已经存在,则会引出服务器消耗一个Challenge Ack来提示客户端,而与此同时我们再作为第三方发送100个RESET请求到服务器,因为服务器已经消耗了一个Challenge Ack,根据全局100个共享Challenge Ack的原则,此时只能给出99个Challenge Ack,从而可以断定客户端使用着探测端口。…