近期,我一直在研究CloudFront域名劫持相关的问题。虽然这并不是一种新出现的安全问题,但其重要性显而易见:
1. CloudFront的某些默认行为不够直观,某些标准DNS配置会误导用户并让他们认为自己存在安全问题的域名已经配置正确了。
2. 在过去的一年里,错误配置的S3 Bucket已经成为了一个非常严重的问题,其他的AWS安全问题也日益突出。
3. 由于错误配置的域名将导致严重的问题出现,攻击者会将其视作重点攻击对象。
很明显,这方面的安全问题对于那些没有深入研究过相关内容的人来说,肯定是不明显的。虽然HackerOne上有一些相关话题的讨论,但我认为还是有很多人没有意识到这些问题的严重性的。
背景资料
CloudFront是亚马逊Web服务(AWS)提供的一种内容分发网络(CDN),CloudFront用户需要创建CloudFront Distribution来托管其他来源的内容(例如S3 bucket),每一个CloudFront Distribution给用户提供了一个唯一的终端节点来指向他们的DNS记录(例如d111111abcdef8.cloudfront.net)。所有域名所使用的特定Distribution需要记录在一个CNAME域中。当CloudFront节点接收到了一个请求之后,它并不会自动将相应Distribution中的内容呈现出来。相反,CloudFront使用了请求中的HOST头来判断去使用哪一个Distribution。这意味着下面两件事情:
1. 如果HOST头跟CNAME域中的域名不匹配,请求将失败。
2. 任何其他的CloudFront Distribution如果包含了HOST头中的指定域名,它将接收到请求并对其进行正常响应。
这样一来,将会导致域名被劫持。
例子
域名test.disloops.com是一条只想disloops.com的CNAME记录。
disloops.com域名使用了一个CloudFront Distribution。
由于test.disloops.com没有添加到Distribution备用域名的CNAME域之中,发送至test.disloops.com的请求将会失败。
其他用户可以创建一个CloudFront Distribution并将test.disloops.com添加到备用域名CNAME域中,并实现域名劫持。
这也就意味着,CloudFront所绑定的唯一节点跟唯一Distribution就没有任何意义了:
研究分析
我专门编写了一个名叫CloudFrunt的Python脚本来自动化地扫描存在此漏洞的域名:
1. 可接受域名列表;
2. 通过dnsrecon寻找更多的相关域名;
3. 选择出指向CloudFrontIP地址空间的域名;
4. 测试目标域名是否存在错误配置问题;
5. (可选)将它们添加到CloudFront Distribution之中;
脚本获取:【点我获取】
目前,我们已经发现了90500个唯一的域名地址,与之绑定的IP地址大约有一百万个。所以我创建了一个EC2实例来对它们进行测试,并以并行的方式用CloudFrunt来对它们进行扫描。
结果分析
脚本运行了几天之后,我发现了2000多个新的CloudFront Distribution域名,具体信息请查看这个【CloudFront劫持Demo】。
总结
实际上,在云端方案不断普及的过程中,这种问题的出现是在所难免的。不过AWS安全团队和CloudFront的工程师目前已经在抓紧时间处理这个问题了,广大用户无需过分担心。我们也已经将CloudFrunt扫描工具上传到了GitHub上,感兴趣的同学可以用它来检测自己的CloudFront是否受到了此问题的影响。
资源获取
* 参考来源:darknet,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM