看我如何在短时间内对Shopify五万多个子域名进行劫持今天我要分享的是5万多个Shopify平台子域名劫持漏洞的发现过程。首先,我要说明的是,该漏洞不仅只存在于Shopify平台系统,还存在其它几个云服务平台系统中。在过去几周时间里,我们陆续联系了存在漏洞的各家厂商,Shopify平台的快速反应、认识透彻和持续跟进的处置能力给我们留下了深刻印象。

Shopify 是一个面向中小型企业的多渠道电商服务平台,它集建站、销售和宣传服务,帮助用户通过线上网店或社交媒体随时随地销售产品,Shopify 为全球 60 多万商家提供了线上服务,在高峰期每秒处理 8 万个请求。

Shopify的子域名劫持漏洞

Shopify的域名测试中,如果遇到以下两种网页响应,那么目标网站就可能存在子域名劫持漏洞:

看我如何在短时间内对Shopify五万多个子域名进行劫持看我如何在短时间内对Shopify五万多个子域名进行劫持那接下来,如何来确定是否真的存在漏洞呢?

首先,需要来看两种DNS记录信息:

一种是网页应用名称映射,也就是myshopname.myshopify.com的域名别名记录;

另外就是看DNS映射,也就是shops.myshopify.com的域名别名记录。

当然,还有其它方法,我们在此不作详解。我们就来认真看看以上两种DNS记录信息。

网页应用名称映射

该例子中,我们可以为指向buckhacker.shopify.com的shop.buckhacker.com映射设置一条别名记录(CNAME)。以下是对shop.buckhacker.com的nslookup信息:

看我如何在短时间内对Shopify五万多个子域名进行劫持如果在Shopify记录中,商店名称(像这里的buckhacker)未被注册认领(claim),那么,我们可以注册认领它,然后进行子域名劫持测试。那如何知道某个商店名称是否被注册认领(claim)了呢?

在Shopify账号注册阶段,需要强制填写你的商店名称(Store Name),填写之后,那么Shopify将会把这个Store Name分配为其免费的二级域名地址,如你填写的Store Name是bag,其二级域名就是http://bag.myshopify.com。在这里,如果你填写的商店名称是被别人注册过的,那么,系统会有提示。就像以下两种不可用和可用的商店名称注册状态:

看我如何在短时间内对Shopify五万多个子域名进行劫持看我如何在短时间内对Shopify五万多个子域名进行劫持

在该过程中,如果我们开启了Burp抓包的话,可以看到一个发往 REST API的请求,以下两种操作分别对应了两种响应信息:

#1 Unavailable ({“status”:”unavailable”,”message”:null,”host”:”buckhacker.myshopify.com”})

#2 Available ({“status”:”available”,”message”:null,”host”:”buckhacker2.myshopify.com”})

这种方式,能简单测试某个商店名称是否可注册。为此,可以写个小脚本来跑跑,我们的脚本可点此下载

该场景中,我们以之前我们注册的商店名buckhacker来做演示。如果这个过程中,我们发现某个商店名称是可继续注册的,那么,我们只需在Shopify管理面板中去连接它即可。也就是在如下管理后台中的 “Online Store” 下点击 “Domains”:

看我如何在短时间内对Shopify五万多个子域名进行劫持然后点击 “Connect existing domain”:

看我如何在短时间内对Shopify五万多个子域名进行劫持再在其中填写出可能存在漏洞的对应域名:

看我如何在短时间内对Shopify五万多个子域名进行劫持点击“Next” 和 “Verify Connection”:

看我如何在短时间内对Shopify五万多个子域名进行劫持这之后,会成功跳转到以下页面:

看我如何在短时间内对Shopify五万多个子域名进行劫持到了这步,就完成了Shopify的一个子域名劫持测试了。这种情况下,存在漏洞的原因就是,这条别名记录是存在的,而且商店名称是可注册的,这样子域名劫持漏洞很少见,因为你面对的目标是Shopify账号注册时要填写的商店名称,所以,其前提是,需要原来用户对之前的账户完全删除或执行域名变更,才有可能存在子域名劫持漏洞。经过调查,我们发现大约有2%的Shopify网站存在这样的错误配置问题。

DNS映射

在这个例子中,存在子域名指向shops.myshopify.com的一条CNAME记录,如:

看我如何在短时间内对Shopify五万多个子域名进行劫持这算是Shopify上常见的子域名劫持情况了,这种配置下,我们可以创建一个可注册的商店名,再按照像前述的测试方式,在Shopify管理后台中去连接管理其对应的域名。以下是其操作方式,如在我的后台中去连接sales.buckhacker.com:

看我如何在短时间内对Shopify五万多个子域名进行劫持成功连接后的确认:

看我如何在短时间内对Shopify五万多个子域名进行劫持看我如何在短时间内对Shopify五万多个子域名进行劫持大规模测试发现

在之前的文章中,我们介绍过使用Rapid7的Sonar和FDNS数据集工具可以很方便地进行一些漏洞测试利用。

看我如何在短时间内对Shopify五万多个子域名进行劫持Rapid7的FDNS数据集中包含了大量的CNAMES记录,所以,其实我们要做的就是在这个数据集中寻找CNAME指向shop.myshopify.com或者myshopname.shopify.com的子域名,围绕这两个域名的相关记录,再深入检查是否存在子域名劫持漏洞。

看我如何在短时间内对Shopify五万多个子域名进行劫持所有的漏洞测试步骤都可用一条命令来实现:

zcat $FDNS_DATASET | strings | grep shopify.com | cut -d “\”” -f 8 | grep -v “shopify.com” | while read subdomain; do python3 ShopifySubdomainTakeoverCheck.py $subdomain; done

这里,我们要解释一下,虽然存在其它子域名劫持漏洞的发现工具,但我们还是自行开发了这个工具来做测试,原因在于,其它工具都是基于Shopify的错误响应页面来检测的,这样会导致大量误报,在这些大量误报中仅有小部分是存在子域劫持漏洞的。我们的脚本和方式虽然简单,但执行了三种检查,即错误响应页面检查、CNAME记录检查和 REST API请求检查 ,最终运行结果相对于更加准确。

如果按照2017年版本的FDNSv2数据集来跑,最终的检测结果非常之多:大约有超过55,000个Shopify子域名存在子域名劫持漏洞。然后,从这些结果中,我们就可以对照数据来判断其它厂商的相关域名是否中招了。当然了,这种类似的漏洞检测方式,也可以适用于对其它域名注册提供商的检查。

总结

这种方式的检测手段,可以大概了解某个目标厂商存在的子域名劫持漏洞情况。在云服务时代,除了传统的进程和堆栈的系统漏洞研究之外,还需要一些新的漏洞研究方法,提高思维高度宽度。抽象点说,整个云服务平台就是一个广泛的操作系统。

漏洞上报进程

2018.8.21    通过HackerOne将漏洞上报给Shopify

2018.8.21    Shopify初步响应

2018.8.23   Shopify后续反馈

2018.9.10   公开漏洞

*参考来源:medium,clouds编译,转自FreeBuf