阅读:2759回复:0
常见的HTTPS攻击方法
◆0 背景
研究常见的https攻击方法 Beast crime breach,并针对https的特性提出一些安全部署https的建议。 针对于HTTPS的攻击,多存在于中间人攻击的环境中,主要是针对于HTTPS所使用的压缩算法和CBC加密模式,进行side-channel-attack。这几类攻击的前置条件都比较苛刻,且都需要受害主机提交很多次请求来收集破译关键数据的足够信息。 常见的攻击方法,主要有,BEAST Lucky-13 RC4 Biases CRIME TIME BREACH等。主要对其中三中进行介绍。 ◆1 CRIME Compression Ratio Info-leak Made Easy攻击原理 攻击者控制受害者发送大量请求,利用压缩算法的机制猜测请求中的关键信息,根据response长度判断请求是否成功。 如下面的https头,攻击这可以控制的部分为get请求地址,想要猜测的部分为Cookie。那么攻击者只需要在GET地址处,不断变换猜测字符串,进行猜测。 GET /sessionid=a HTTP/1.1Host: bank.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0Cookie: sessionid=d3b0c44298fc1c149afbf4c8996fb924GET /sessionid=a HTTP/1.1Host: bank.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0)Gecko/20100101 Firefox/16.0Cookie: sessionid=d3b0c44298fc1c149afbf4c8996fb924比如上面的情况Response长度为 1000byte。 GET /sessionid=d HTTP/1.1Host: bank.comUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0)Gecko/20100101 Firefox/16.0Cookie: sessionid=d3b0c44298fc1c149afbf4c8996fb924当攻击者猜对了cookie的第一个字母,Response的长度会缩小到9999byte。 当Response被SSL加密之后,如果使用RC4加密模式,长度并不会发生随机改变。使用BCB加密模式时,因为padding的原因,长度会有略微的改变。 受影响的加密算法 Deflate = LZ77 + HuffManGZip = Headers + Data Compressed using Deflate攻击前提 攻击者可以获取受害者的网络通信包。(中间人攻击,ISP供应商) 浏览器和服务器支持均支持并使用压缩算法。 攻击这可以控制受害者发送大量请求并可以控制请求内容。 防御方法 客户端可以升级浏览器来避免这种攻击。 • Chrome: 21.0.1180.89 and above• Firefox: 15.0.1 and above• Opera: 12.01 and above• Safari: 5.1.7 and above服务器端可以通过禁用一些加密算法来防止此类攻击。 Apache • SSLCompression flag = “SSLCompression off” • GnuTLSPriorities flag = “!COMP-DEFLATE" 禁止过于频繁的请求。 修改压缩算法流程,用户输入的数据不进行压缩。 随机添加长度不定的垃圾数据。 影响范围 TLS 1.0.SPDY protocol (Google).Applications that uses TLS compression.Mozilla Firefox (older versions) that support SPDY.Google Chrome (older versions) that supported both TLS and SPDY.POC 这个poc并不是模拟真实环境下的中间人攻击,只是在python中利用CRIME的思想验证了攻击的可行性。 #!pythonimport stringimport zlibimport sysimport random charset = string.letters + string.digits COOKIE = ''.join(random.choice(charset) for x in range(30)) HEADERS = ("POST / HTTP/1.1rn" "Host: thebankserver.comrn" "Connection: keep-alivern" "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1rn" "Accept: */*rn" "Referer: https://thebankserver.com/rn" "Cookie: secret="+COOKIE+"rn" "Accept-Encoding: gzip,deflate,sdchrn" "Accept-Language: en-US,en;q=0.8rn" "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3rn" "rn")BODY = ("POST / HTTP/1.1rn" "Host: thebankserver.comrn" "Connection: keep-alivern" "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1rn" "Accept: */*rn" "Referer: https://thebankserver.com/rn" "Cookie: secret=")cookie = "" def compress(data): c = zlib.compressobj() return c.compress(data) + c.flush(zlib.Z_SYNC_FLUSH)def getposset(perchar,chars): posset = [] baselen = len(compress(HEADERS+perchar)) for i in chars: t = len(compress(HEADERS+ perchar+i)) if (t |
|
|