阅读:2116回复:0
弱随机化种子漏洞科普
◆0 背景
上周我参加了一个Bishop Fox和BYU大学举办的CTF比赛,在比赛过程中我决定尝试一下入侵一下计分系统,并且我把入侵的过程记录了下来。 尽管客户端的token欺骗已经不是什么新鲜事了,但是这次的入侵过程可以作为weak randomness漏洞的一个很好的练习。(这次攻击目标所使用的框架并不是像Rails一样常用的框架) 最后说一句:这个漏洞是框架自己带有的而不是Bishop Fox 或者是 BYU的问题。 ◆1 cookie运行原理 在开始之前,我推荐你阅读一下这篇博文,他会告送你一个基于ruby的webapps如何处理cookie。 简而言之,ruby会生成一个hash数值作为一个cookie存储在用户客户端像这样 { 'session_id' => '78894f58c088a9c6555370a0d97e373e715b91bc' } 之后ruby分为三步把他存储到客户端 (1)使用Marshal.dump对数据结构进行序列化 (2)使用base64编码第一步得到的字符串 (3)计算message的HMAC(HMAC被用于message的完整性检查,这是ruby的一种机制以防用户篡改自己的cookie) 当以上三步做完之后,ruby会在头文件中加入如下一段 Set-Cookie:"rack.session={base64-encoded message body}--{hmac};" 实际的cookie是这样 Set-Cookie:"rack.session=BAh7BkkiD3Nlc3Npb25faWQGOgZFVEkiRTViNDY1NjdkYTAzYjYwYTdlZGIy%0ANDg4NWEyMzVlY2E2YzRkYmM5M2IwYzgxZWJlMDc1NmQ0NGRmODE0ZjEzYjAG%0AOwBG%0A--2148e8dc04eeba3bf0f4e0d70c04465b61c4758d;" 上述处理cookie的过程有一个漏洞,message中的信息可以被客户端还原,只需要对它进行base64解码和反序列化即可得到原始的ruby object ruby对于cookie信任的前提是,通过HMAC验证message中的内容必须是有你代码中设定的密钥标记过的,只有这样ruby才会把cookie当做一个有效地凭证。 下图就是上述过程简要流程 图片:2014091810450929878.png 如果你篡改了你的cookie,会导致HMAC验证不通过,从而使你修改过的cookie值失效。 ◆2 简介 CTF的评分系统是一个Sinatra-based的webapp,它使用了一些基本的Rails机制,提供了一个计分板的效果。看一下代码,还是比较简洁的。 这个webapp有一个有趣的现象就是,默认情况下代码库中没有配置文件,配置文件是在程序运行过程中生成的,下面是创建配置文件的代码。 #!ruby begin require './config.rb' rescue Exception => e # create default config.rb open('./config.rb', "w+") {|f| f.puts true }) 通过上述语句重建cookie #!ruby bad_cookie = CGI.escape(Base64.encode64(Marshal.dump(params))) bad_hmac = create_hmac(bad_cookie, key) header = "rack.session=#{bad_cookie}--#{bad_hmac};" 只要把上面得到的cookie内容,加到header里面就可以获取管理员权限了。 到达这一步只要查看源代码就可以很轻易地获取到每一题的答案了。 ◆6 防御方法 我在github上提交了一个修改版本,其中使用这句代替了cookie secret key的生成 Digest::SHA1.hexdigest(Time.now.to_s) 使用SecureRandom库生成随机数 SecureRandom.hex(20) 这会生成一个40个字符的随机字符串 ◆7 结论 这篇文章虽然在技术上没有什么实质性突破,但是作为一个弱随机漏洞的例子还是很不错的,希望在思路上可以启发到各位。 from:http://blog.tjll.net/weak-random-seed-rack-exploit/ |
|