先查看网页。这里大意就是,需要将用户ID和组ID都等于“000”才能成为root用户。
再查看URL,发现其后面跟着一串16进制字符串
根据经验,这些一般是参数的输入,或许可以通过这里来跳转页面或者修改页面上的输出的效果。
先随便修改一下来进行尝试(把前两个16进制数'6b'修改成'11')
再次查看页面,发现ApplicationID的值改变了
说明它是存在漏洞的,我们需要修改参数达到把UserID 和GroupID的值均为000。
我们先来补习一下CBC相关的知识
CBC模式加解密原理
加密时,第一个明文分组,需要通过和IV(初始化向量)进行异或处理之后,才可以进行加密处理;每一个明文分组(除了第一个明文分组)加密之前都需要和前一个密文分组进行异或处理之后,才可以进行加密处理。
加密过程 :
1.将明文的第一个分组与IV进行异或,送入加密模块进行加密,得到第一个密文分组。
2.从第二个明文分组开始,将明文分组与前一个密文分组进行异或。
3.将第2步得到的结果送入加密模块进行加密。
4.将每一个密文分组拼接起来形成密文。
有公式 :
如下所示
CBC模式的解密:
第一个密文分组,解密之后,需要通过和IV进行异或处理,才可以得到第一个明文分组;每一个密文分组(除第一个密文分组外)经过解密处理之后,都需要和前一个密文分组进行异或处理,才可以得到对应的明文分组。
解密过程:
1.将密文的第一个分组进行解密,得到的结果与IV进行异或处理,得到第一个明文分组。
2.从第二个密文分组开始,先对每一个密文分组进行解密处理,到第3步。
3.将第2步得到的结果与前一个密文分组进行异或处理,得到对应的明文分组。
4.将每一个明文分组拼接在一块,便得到原先的明文。
有公式 :
如下所示
攻击的思路是:虽然我们不知道密钥(即代码中的key),但是我们可以通过篡改前一块的密文,来控制最终输出的明文。
为了便于理解,我们考虑单个字节的操作,则在CBC下存在如下相应的公式
Pnew为我们想要的明文,根据上述理论,我们只需控制前一个密文分组对应的字节为
,就可以达到修改明文的目的。
用文字来说就是,将前一个密文分组中的对应字节篡改为一个值,该值等于“前一个密文分组原来的值 xor 这一个明文分组中对应字节的值xor 希望控制的解密后的新的明文的值”
补习到这里,想了解更多的可以去合天网安实验室的平台上做一遍实验——CBC字节翻转攻击
在Mutillidae II平台上,当我们修改URL上的值时,会改变显示的值。那从我们的角度来看,可以看成是CBC的解密过程。经过分析,这里URL上每一个字节(8位,两个16进制字符)相当于CBC中的前一个密文分组,页面显示的值相当于这一个明文分组中对应字节的值,即:
URL(分成单个字节后) -------> CBC中的前一个密文分组
Application, User ID, Group ID ---------> 这一个明文分组中对应字节的值
而且在那串密文(6bc24fc1ab650b25b4114e93a98f1eba)中
前四字节(6bc24fc1)对应Application
第五(ab),六(65),七(0b)字节对应着User ID
第八(25),九(b4),十(11)字节对应着Group ID
我们的目标是要把User ID 和Group ID 修改成000。根据CBC的加密模式,即使不知道加密的密钥,我们只需要修改前一个密文分组的值(URL)即可。那么,修改成什么呢?
根据XOR的运算规则(具体看上面)
P(new) = "前一个密文" ^ "当前明文" ^ "需要改成的明文"
然后这个P(new) 会跟当前的加密块(如图)异或,得到新的明文
P(new1) = 0xab ^ 0x31 ^ 0x30
P(new2) = 0x25 ^ 0x31 ^ 0x30
用Python计算一下
得到了新的密文值,将其替换掉原来的URL,变成
页面跳转后,成功取得root权限。
参考文章
合天网安实验室:http://www.hetianlab.com/expc.do?ec=ECIDf328-1dc9-464c-918b-543b4a2d6590
某个博主:mutillidae实战(3)-CBC反转提权https://blog.csdn.net/weixin_41177699/article/details/83063101