注:这一篇会写得比较详细,之后就略写了
很多实验是需要配合docker的,这里以seed lab2.0的“Hash Length Extension Attack Lab”为例介绍如何搭建环境
首先由于众所周知的原因,我们需要设置docker国内镜像源
新建如下文件
写入源
保存后退出
执行以下命令执行镜像
并查看是否设置成功
回显的最后如果有下图红框内容则说明设置成功
接下来切到实验的yml文件所在路径执行下列命令build容器镜像
然后启动
可以使用docker ps查看目前正在运行的容器id
要在该容器上shell如下所示即可
在ubuntu上编辑/etc/hosts绑定ip和域名
浏览器访问测试
可以看到是没问题的
服务端的代码在这里
可以看到有两个目录
www目录是服务端代码,Labhome目录有一个secret文件以及key用于计算MAC
。
服务端接收下列命令:
Lstcmd:用于列出在Labhome文件夹下的文件
Download:服务端将会从labhome返回指定的文件
发送请求时,服务端需要一个uid参数,它使用uid从labhome/key.txt获得mac key。
以下面的命令为例,是在使用lstcmd命令,其值设置为1,这要求服务端列出所有文件。最后一个参数是mac值,它是基于客户端和服务端共享的secret key以及命令参数计算得到的。在执行命令前,服务端会校验mac以确保命令的完整性。
http://www.seedlab-hashlen.com/?myname=JohnDoe&uid=1001&lstcmd=1
&mac=dc8788905dbcbceffcdd5578887717c12691b3cf1dac6b2f2bcfabc14a6a7f11
再比如下面的命令。这里包括两条命令:列出文件以及下载secret.txt。同样,需要加上有效的mac值,否则服务端不会执行命令
http://www.seedlab-hashlen.com/?myname=JohnDoe&uid=1001&lstcmd=1
&download=secret.txt
&mac=dc8788905dbcbceffcdd5578887717c12691b3cf1dac6b2f2bcfabc14a6a7f11
在ubuntu的浏览器上执行效果如下
Task1:发送列出文件的请求
格式是这样的:
http://www.seedlab-hashlen.com/?myname=&uid=
&lstcmd=1&mac=
这里myname使用自己的,uid可以从key.txt中挑一个,如下所示
冒号的左边是uid,右边是key
比如可以使用1001作为uid,那么对应的key就是123456
另外还需要mac
将key以及请求的命令按照如下格式拼接即可:
Key:R = 123456:myname=JohnDoe&uid=1001&lstcmd=1
然后就可以hash得到mac值
这样就构造出了完整的请求
http://www.seedlab-hashlen.com/?myname=JohnDoe&uid=1001&lstcmd=1
&mac=7d5f750f8b3203bd963d75217c980d139df5d0e50d19d6dfdb8a7de1f8520ce3
Task2:构造填充
为了实现hash长度扩展攻击,我们需要理解单向hash的padding是如何计算的。
Sha-256的块大小为64字节,所以在hash运算时,消息M会被分组为64字节大小,根据RFC 6234,SHA 256的填充包括1字节的\x80,然后跟着一些0,然后跟着一个8字节的长度域(长度的值是M的bit的数量)
假设M是This is a test message,其有22字节,所以填充就是64-22=42字节,其中包括8字节的长度域。M的长度就是22*8=176bit,176=0xB0。SHA256就会填充如下
这里需要注意长度域使用大端序。比如如果消息的长度为0x012345,那么长度域的内容应该是\x00\x00\x00\x00\x00\x01\0x23\x45
任务是要求对key.txt中的key和uid进行padding
这里要注意,在URL中,所有的16进制数字需要被编码为从\x到%,比如\x80要变为%80。在服务端,这会被重新解码回来
Task3:长度扩展攻击
我们将在不知道key的情况下为URL生成有效的MAC
假设我们知道一个有效的请求R的MAC,我们也知道MAC key的大小
我们的目标就是基于R构造一个新的请求,同时仍能计算出有效的MAC
现在给定原消息M=“This is a test message”,以及它的mac值,我们将会展示如果在M后加上消息"Extra message"并计算其MAC,而不需要知道密码的MAC key
新的mac可以用如下程序计算
并编译
运行即可得到新mac
Task4使用HMAC缓解攻击
从上面的例子中我们观察到当开发者以不安全的方式通过连接key和message来计算mac时会造成危害。解决办法就是使用HMAC来计算MAC
在本例中,修复时,修改verify_mac的如下部分
使用python的hmac。
修复完成后重启容易即可
如果要重复之前的实验,计算hmac可以使用下面的代码
(假设key是123456)