欢迎关注:1,欢迎关注本博客,你可点击右手边的【QQ邮件订阅】订阅本博客!2,本博客推出江湖救急计划,主要为工作中遇到疑难杂症的兄弟提供远程技术支持和分析,如有需要,请在江湖救急计划页面给我留言!

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.htm

2,防火墙过滤

       对于linux服务器可以利用Iptables的u32或者BPF匹配机制实现对heartbleed报文的识别、检测和过滤,从而达到防护通过利用这个漏洞进行攻击的尝试。网上有网友@白金-PT给出了过滤规则的设置,如下图所示:

  点击查看原图

      其实大名鼎鼎的wireshark所有者riverbed已有研究者给出更为 细致的BPF过滤策略,原文名为《How to Detect a Prior Heartbleed Exploit》,原文链接为:http://www.riverbed.com/blogs/Retroactively-detecting-a- prior-Heartbleed-exploitation-from-stored-packets-using-a-BPF-expression.html

       摘录其中关于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 过滤策略

评论(1) 引用(0) 浏览(99142)

Powered by 易隐者 基于emlog 皖ICP备12002343号-1