美文网首页
CBC字节翻转(异或xor)攻击

CBC字节翻转(异或xor)攻击

作者: ESE_ | 来源:发表于2018-11-06 10:54 被阅读0次

CBC 攻击

CBC加密过程

CBC工作于一个固定长度的比特组,将其称之为块。在本文中,我们将使用包含16字节的块。

CBC加密

如图:


加密

加密的过程

1、首先将明文分组(常见的以16字节为一组),位数不足的使用特殊字符填充。
2、生成一个随机的初始化向量(IV)和一个密钥。
3、将IV和第一组明文异或。
4、用密钥对3中xor后产生的密文加密。
5、用4中产生的密文对第二组明文进行xor操作。
6、用密钥对5中产生的密文加密。
7、重复4-7,到最后一组明文。
8、将IV和加密后的密文拼接在一起,得到最终的密文。

特点就是:前一块的密文用来产生后一块的密文[为了解决ECB模式的缺点]。

CBC解密

如图:


解密

解密过程

1、从密文中提取出IV,然后将密文分组。
2、使用密钥对第一组的密文解密,然后和IV进行xor得到明文。
3、使用密钥对第二组密文解密,然后和2中的密文xor得到明文。
4、重复2-3,直到最后一组密文。

CBC攻击(解密)

利用异或(xor)的特性,在CBC模式解密[也就是服务器解密验证]的时候进行攻击。如图:


攻击

通过修改密文的bit[这里毁损这一块密文,这个不重要],达到我们想要的目的明文。
比如账号是xdmin,通过CBC攻击,改成admin,提升权限.

作用:借由此可以绕过过滤器,或者改变用户权限提升至管理员

Ex

这里借助一道CTF题目来加深练习.
地址:https://github.com/pbiernat/BlackBox/tree/master/FL!P
搭建好题目,发现

1、题目采用AES_CBC模式
2、输入,以"getapikey:"+email.数据里不能有";"

    def mkprofile(self, email):
       if((";" in email)):
          return -1
       prefix = "comment1=wowsuch%20CBC;userdata="
       suffix = ";coment2=%20suchsafe%20very%20encryptwowww"    
       ptxt = prefix + email + suffix
       return encrypt_cbc(self.key, self.iv, ptxt)

#输入:
if(data.startswith("getapikey:")):
    data = data[10:]
    resp = self.mkprofile(data)

3、判断输入的字符是否含有";admin=true"字符串

    def parse_profile(self, data):
       ptxt = decrypt_cbc(self.key,self.iv, data.encode('hex'))
       ptxt = ptxt.replace(" ","")
       print ptxt
       if ";admin=true" in ptxt:
          return 1
       return 0

分析

这里要求输入没有";", 判断必须有";"。 怎么办....
这里将ptxt提取出来进行分组[16]字节为一组,qadmin=truexxxxx是输入的数据,与生成的密文

comment1=wowsuch  ------>   58bda6ae81ee242225740b1deb58c60f    1
%20CBC;userdata=  ------>   44df15e1a75deb24f863bb3140cd3d3f    2
qadmin=truexxxxx  ------>   cd54766107c2104554d7a19d104ddfee    3
;coment2=%20such  ------>   f8c877b0349d39b5e0f1846599943ce7    4
......

这里关注将 qadmin=true ---> ;admin=true

cd54766107c2104554d7a19d104ddfee解密的第一位为X = Decode(cd54766107c2104554d7a19d104ddfee)[0]

其中q解密提取
q = 0x44 ^ X [0x44是上一步的密文,解密过程]

想将q变成";",这里就用上xor的特性。如果将0x44改成md ---> md = (0x44 ^ q ^ ;)

其中q解密提取
md ^ X = 0x44 ^ q ^ ; X =0x44 ^ X ^ q ^ ;= q ^ q ^ ;= ; (q^q=0)

这样就可以将q变成;

exp

#python3
import socket
import binascii

host = '172.10.22.70'
port = 9002

def Tostr(st):
    return st.encode(encoding='UTF8')

def listTostr(data):
    for i in range(len(data)):
        n = hex(data[i])
        if len(n)==4:
            data[i] = str(hex(data[i])[2:])
        else:
            data[i] = '0'+str(hex(data[i])[2:])
    return "".join(data)

def exp():
    s = socket.socket()
    s.connect((host,port))
    s.recv(1024)
    s.send(Tostr("getapikey:qadmin=truexxxxx"))
    data = s.recv(1024)
    data = binascii.unhexlify(data)  #32->16byte
    data = list(data)
    data[16] = ord("q") ^ ord(";") ^ data[16] #第二个字符串加密后的第一位xor

    data = listTostr(data)

    s.send(Tostr("getflag:" + data))
    data = (s.recv(1024)).decode('utf-8')
    print(data)

if __name__ == '__main__':
    exp()

相关文章

网友评论

      本文标题:CBC字节翻转(异或xor)攻击

      本文链接:https://www.haomeiwen.com/subject/sfwyxqtx.html