49. tem_body = BODY[trun:
]
50. posset = getposset(tem_body+cookie,tem_posset)
51. trun = trun +1
52. if len(posset)==0:
53. return False
54. cookie += posset[0]
55. print posset[0]
56. return True
57.
58.while BODY.find("\r\n")>=0:
59. if not doguess():
60. print "(-)Changebody"
61. BODY = BODY[BODY.find("\r\n") + 2:
]
62.print "(+)orign cookie"+COOKIE
63.print "(+)Gotten cookie"+cookie
0x02TIME
TimingInfo-leakMadeEasy
攻击原理
攻击者控制受害者发送大量请求,利用压缩算法的机制猜测请求中的关键信息,根据response响应时间判断请求是否成功。
其实TIME和CRIME一样都利用了压缩算法,只不过CRIME是通过长度信息作为辅助,而TIME是通过时间信息作为辅助。
Unabletorenderembeddedobject:
File(1.jpg)notfound.
如上图当数据长度,大于MTU时会截断为两个包发送,这样就会产生较大的相应时间差异。
攻击者吧包长控制在MTU左右,不断尝试猜测COOKIE。
Unabletorenderembeddedobject:
File(QQ图片20140724174303.jpg)notfound.
如上图所示,我们通过添加Padding来吧数据包大小增加到和MTU相等,Case1中我们添加的extraByte和需要猜测的数据重合,因为压缩算法的原因,并不会增加包的长度,而Case2中extraByte和需要猜测的数据并不一致,导致了分包。
攻击这可以通过响应时间的不同来区分Case1Case2两种情况。
攻击前提
攻击这可以控制受害者发送大量请求并可以控制请求内容。
稳定的网络环境。
防御方法
在解密Response过程中加入随机的短时间延迟。
阻止短时间内的频繁请求。
0x03BEAST
BrowserExploitAgainstSSL/TLS
攻击原理
攻击者控制受害者发送大量请求,利用CBC加密模式猜测关键信息。
CBC模式工作的方法是当加密第i块的时候,和第i-1块的密文异或。
更正式地表达如下:
Ci=E(Key,Ci-1⊕Mi)
很显然,当你加密第一块的时候,没有前一块的密文和它异或,因此,标准的做法是产生一个随机的初始化向量(IV),并且用它和第一块明文异或。
第一块M0的加密如下:
C0=E(Key,IV⊕M0).
然后,接着第一块M1加密如下:
C1=E(Key,C0⊕M1).
现在,除非C0碰巧和IV一样(这是非常不可能的),那么,即使M0=M1,对于加密函数来说,两个输入是不同的,因此,C0≠C1。
CBC有两种的基本的使用方法:
1.对于每条记录都认为是独立的;为每一个记录产生一个IV
2.把所有的记录当作一个链接在一起的大对象,并且在记录之间继续使用CBC的状态。
这意味着最后一条记录n的IV是n-1条记录的密文。
SSLV3和TLS1.0选择的是第二个用法。
这好像本来就是个错误
CBC有两种的基本的使用方法:
1.对于每条记录都认为是独立的;为每一个记录产生一个IV
2.把所有的记录当作一个链接在一起的大对象,并且在记录之间继续使用CBC的状态。
这意味着最后一条记录n的IV是n-1条记录的密文。
SSL3.0和TLS1.0选择的是第二个用法。
因此产生了加密算法的安全问题。
攻击者可以把想要猜测的数据段替换掉成:
X⊕Ci-1⊕P
当这个注入的内容被加密,X会被异或,结果传给加密算法的明文块如下:
Ci-1⊕P
如果P==Mi,新的密文块将和Ci一样,这意味着,你的猜测是正确的。
攻击前提
攻击者可以获取受害者的网络通信包。
(中间人攻击,ISP供应商)
攻击者需要能得到发送敏感数据端的一部分权限。
以便将自己的信息插入SSL/TLS会话中。
攻击者需要准确的找出敏感数据的密文段。
攻击这可以控制受害者发送大量请求并可以控制请求内容。
防御方法
使用RC4加密模式代替BCB加密模式。
部署TLS1.1或者更高级的版本,来避免SSL3.0/TLS1.0带来的安全问题。
在服务端设置每传输固定字节,就改变一次加密秘钥。
影响范围
TLS1.0.
SPDYprotocol(Google).
ApplicationsthatusesTLScompression.
MozillaFirefox(olderversions)thatsupportSPDY.
GoogleChrome(olderversions)thatsupportedbothTLSandSPDY.
POC
仅在python上模拟了攻击思想的实现,编码中只实现了第一个字母的猜测。
1.import sys
2.import string
3.import random
4.from Crypto.Cipher import AES
5.
6.key = 'lyp62/22Sh2RlXJF'
7.mode = AES.MODE_CBC
8.vi = '1234567812345678'
9.charset = string.letters + string.digits
10.cookie = ''.join(random.choice(charset) for x in range(30))
11.HEADERS = ("POST / HTTP/1.1\r\n"
12. "Host:
\r\n"
13. "Connection:
keep-alive\r\n"
14. "User-Agent:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1\r\n"
15. "Accept:
*/*\r\n"
16. "Referer:
17. "Cookie:
secret="+cookie+"\r\n"
18. "Accept-Encoding:
gzip,deflate,sdch\r\n"
19. "Accept-Language:
en-US,en;q=0.8\r\n"
20. "Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"
21. "\r\n")
22.global pad_num
23.def add_padding(plaintext):
24. global pad_num
25. pad_num = 16 - len(plaintext) % 16
26. for i in range(0,pad_num):
27. plaintext += chr(pad_num)
28. return plaintext
29.def check_padding(plaintext):
30. global pad_num
31. for i in range(1,pad_num+1):
32. if (plaintext[-i]!
=chr(pad_num)):
33. return False
34. return True
35.
36.def encrypto(plaintext):
37. global pad_num
38. obj = AES.new(key,mode,vi)
39. if (len(plaintext) % 16):
40. plaintext = add_padding(plaintext)
41. else:
42. pad_num=0
43. ciphertext = obj.encrypt(plaintext)
44. if (check_padding(ciphertext)):
45. return ciphertext
46. else:
47. return 0
48.
49.def decrypto(ciphertext):
50. obj = AES.new(key,mode,vi)
51. plaintext = obj.decrypt(ciphertext)
52. return plaintext
53.
54.def findcookie():
55. global HEADERS
56. return HEADERS.find('secret=')+7
57.
58.guess_cookie=''
59.pos_cookie=findcookie()
60.pos_block_s = pos_cookie + 16 - pos_cookie%16
61.HEADERS = HEADERS[:
pos_cookie] + (16 - pos_cookie % 16 + 15)*'a' +HEADERS[pos_cookie:
]
62.encry_head = encrypto(add_padding(HEADERS))
63.per_per_block = encry_head[pos_block_s - 16:
pos_block_s] #Ci-1
64.per_block = encry_head[pos_block_s:
pos_block_s+16] #x
65.aft_block = encry_head[pos_block_s+16:
pos_block_s+32] #Ci+1
66.for i in charset:
67. guess_block = 'a' * 15 + i
68. insert_block = ''.join(chr(ord(a) ^ ord(b) ^ ord(c)) for a,b,c in zip(per_block,per_per_block,guess_block))
69. temp_header = HEADERS[:
pos_block_s+16] + insert_block + HEADERS[pos_block_s+16:
]
70. encry_temp_header = encrypto(add_padding(temp_header))
71. if (aft_block == encry_temp_header[pos_block_s+32:
pos_block_s+48]):
72. print "(+)first byte is:
"+i
73.print "(+)orign cookie:
"+cookie
攻击者首先使用降级攻击,来让浏览器使用sslv3.0,再通过sslv3.0CBC-mode存在的缺陷,窃取到用户传输的明文。
0x04POODLE
降级攻击
sslv3.0是一个存在了很久的协议了,现在大多数浏览器为了兼容性都会支持这个协议,但是并不会首先使用这个协议,中间人攻击者可以驳回浏览器协商高版本协议的请求,只放行sslv3.0协议。
PaddingOracle攻击
针对于CBC的攻击之前已经有一些了,比如,Beast,Lucky17之类的,详细可以看这里
首先来看CBC-mod的加解密流程。
解密流程
加密流程
校验流程
MAC1=hash(明文)
密文=Encode(明文+MAC1+Padding,K)明文=Decode(密文,k)-MAC1-Padding(padding的长度由最后一个字节标识)
MAC2=hash(明文)如果MAC1==MAC2则校验成功否则失败
知二求三
PaddingOracle攻击一般都会满足一个知二求三的规律,如下图
(1)VI
(2)解密后的数据,叫它midText把
(3)Plaintext
这三个值我们得到其中两个就可以推出另外一个,因为他们在一起Xor了嘛。
http:
//drops.wooyun.org/wp-content/uploads/2014/12/file0004.jpg
在Poodle攻击中,我们会把最后一个数据块替换成我们想要猜测的数据块。
如下图所示。
这样导致的直接后果就是,CBC完整性验证失败,数据包被驳回。
我们假设最