Openssl Heartbleed漏洞攻击报文分析和防范
作者:易隐者 发布于:2014-4-12 18:50 Saturday 分类:网络安全
Heartbleed漏洞一爆出来我便从微博中安全大拿们发布的信息
中普及了相关知识,只是没想到这个漏洞竟然会火到连身边那些环保、律师行业的朋友见面都会在第一时间内问我跟这个漏洞有关的问题,这几天微博中基本都是关
于这个漏洞的刷屏信息,业内的朋友也有给我推荐检测的脚本和方法,甚至昨晚我还在CCTV看到相关报道………
我想作为一个这个行业内的从业人员,我至少能够站在报文的角度对这个heartbleed漏洞做一个简单分析,帮助大家理解这个漏洞,同时提供一些利用这个漏洞进行攻击的防护方法,这远远强于做一个纯粹娱乐心态的旁观者。
Heartbleed的利用过程在贴攻击报文截图之前,我们还是通过一个交互示意图展示一下这个漏洞是如何被利用的:
Openssl的客户端可以向服务器发送heartbeat请求报文,这个报文申明payload的长度(最大长度为64K),服务器在收到客户端的这个 heartbeat请求报文之后,会根据申明的payload长度大小用内存的数据填充后,给客户端发送响应报文。而服务器内存中的数据就可能包含用户名、用户密钥、口令、cookie等敏感信息,黑客正是利用这个特性,将可能存在内存中的用户名、密钥、口令、cookie等敏感数据经分析后获得,从而达到攻击的效果。Heartbleed攻击的报文交互过程
我们结合这个攻击的报文来一起回顾一下这个过程。
1,heartbeat request报文解码2,服务器响应报文解码
有兄弟可能会说这个里面没看到什么敏感数据啊。嗯,这个需要多尝试,运气好的话,说不定几次就能蹦出来点什么你想要的,运气不好的话,人工就没法做这个低效的分析了,需要黑客搞个自动分析的程序来跑啦。Heartbleed报文特征值
Heartbleed报文特征值非常明显,那就是客户端的heartbeat request报文的解码中所展示的,下面我们再次专门把它列出来加深印象:一图胜千言,不需我再描述了吧。如果有人利用openssl heartbleed这个漏洞对服务器进行扫描或攻击的话,我们可以通过其报文的特征值进行分析、过滤和拦截。
Heartbleed攻击的应对
1,升级openssl
参见《OpenSSL Heartbleed漏洞修复》一文,链接为:http://www.linuxidc.com/Linux/2014-04/99978.htm2,防火墙过滤
对于linux服务器可以利用Iptables的u32或者BPF匹配机制实现对heartbleed报文的识别、检测和过滤,从而达到防护通过利用这个漏洞进行攻击的尝试。网上有网友@白金-PT给出了过滤规则的设置,如下图所示:
摘录其中关于heartbleed攻击报文的BPF(BSD Packet Filter)表达式如下:
tcp src port 443 and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04) and ((ip[2:2] - 4 * (ip[0] & 0x0F) - 4 * ((tcp[12] & 0xF0) >> 4) > 69))
分解这个过滤表达式:# A response from server on port 443. This can be modified if server not using 443.
tcp src port 443
//TCP443端口,可以改为其他端口
# This calculates the start of payload data beyond TCP.
tcp[((tcp[12] & 0xF0) >> 4 ) * 4
//这个是TCP报文字段开始位置
# Use that start-of-payload calculation to see if first payload byte is 0x18 (TLS Heartbeat message)
(tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18)
//第一个特征字段:0x18,这个字段说明是heartbeat报文
# Use that start-of-payload calculation to see if second payload byte is 0x03 (TLS major version 3)
(tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03)
//第二个特征字段:0x03,这个字段为TLS主版本号
# Use that start-of-payload calculation to see if third payload byte is less than 0x04 (TLS minor version 0-3)
(tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04)
//第三个特征字段:< 0x04(0x03或0x02),这个字段为TLS子版本号
# Determine if the TCP payload length is greater than 69. NOTE: if this generates too many false positives, this number can be increased
((ip[2:2] - 4 * (ip[0] & 0x0F) - 4 * ((tcp[12] & 0xF0) >> 4) > 69))
//检测TCP负载长度是否大于69字节
如果网络中部署有ips类设备,也可以参照riverbed的这个BPF自定义此类特征值实现对利用heartbleed漏洞进行扫描和攻击尝试的发现和拦截。
后记以前在学习协议的时候,好像linux下ping超长报文时,系统就是使用内存中的数据进行填充的(为什么用内存中的数据来填充?因为效率啊。),按照heartbleed攻击的这个思路,很多以前使用内存中的数据做填充的,都是存在被利用的可能。当然,这些个就交给挖洞的黑阔去干吧,在此我就不负责深究了,O(∩_∩)O
标签: TCP iptables openssl heartbleed heartbeat 特征值 heartbleed漏洞 内存填充 攻击报文 heartbeat请求 u32 BPF riverbed 过滤策略
日历
最新日志
链接
分类
最新碎语
- 如果一个人想要做一件真正忠于自己内心的事情,那么往往只能一个人独自去做"——理查德·耶茨
2019-06-25 21:34
- 日后我们知道,真正的人生道路是由内心决定的。不论我们的道路看上去如此曲折、如此荒谬地背离我们的愿望,它终归还是把我们引到我们看不见的目的地。(茨威格《昨日世界》)
2019-03-16 21:27
- 如果你渴望得到某样东西,你得让它自由,如果它回到你身边,它就是属于你的,如果它不会回来,你就从未拥有过它。——大仲马《基督山伯爵》
2018-10-09 22:07
- 人生有两大悲剧:一个是没有得到你心爱的东西;另一个是得到了你心爱的东西。人生有两大快乐:一个是没有得到你心爱的东西,于是可以寻求和创造;另一个是得到了你心爱的东西,于是可以去品味和体验。——弗洛伊德
2018-09-25 18:06
- 一个人越有思想,发现有个性的人就越多。普通人是看不出人与人之间的差别的——布莱兹·帕斯卡尔
2018-08-30 18:44
存档
- 2020年11月(2)
- 2018年1月(1)
- 2017年12月(1)
- 2017年11月(6)
- 2017年6月(1)
- 2017年5月(1)
- 2017年4月(1)
- 2017年3月(1)
- 2016年11月(1)
- 2016年4月(1)
- 2015年7月(2)
- 2015年6月(1)
- 2015年5月(5)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(1)
- 2014年4月(3)
- 2014年2月(2)
- 2014年1月(2)
- 2013年12月(1)
- 2013年11月(1)
- 2013年10月(2)
- 2013年9月(1)
- 2013年8月(1)
- 2013年7月(3)
- 2013年6月(2)
- 2013年5月(1)
- 2013年4月(3)
- 2013年3月(1)
- 2013年2月(2)
- 2013年1月(2)
- 2012年12月(11)
- 2012年11月(12)
- 2012年10月(12)
- 2012年9月(26)
- 2012年8月(29)
- 2012年7月(18)
- 2012年6月(2)
- 2012年5月(25)
- 2012年4月(16)
- 2012年3月(13)
- 2012年2月(6)