情报背景
随着近些年来企业上云不断加速,相关技术落地成熟,公私有云等平台服务已经广泛应用在了各大业务场景中,企业暴露在公网的云服务数量出现爆发式增长。这些暴露在公网的云服务包含对象存储、弹性计算、云函数、云数据库等,其中不乏包含配置错误与密钥泄露等问题的公开服务,攻击者可轻松利用云服务特性直接利用或者接管对应的云资源,成为其优质的攻击资源。本文以 AWS S3 Bucket 出发,讲述如何利用 S3 对象存储服务,实现可信子域下的钓鱼服务部署。
01 S3 Bucket 接管
我们在实际访问一些站点时,可能会出现以下的响应结果,其中提示包含 NoSuchBucket 等关键字。
查看其 DNS 解析记录可以发现,该域名被 CNAME 记录解析到了 AWS S3 对象存储服务提供的子域名上。
我们在使用 S3 Bucket 的过程中,AWS 会提供一个专属的域名给用户进行存储桶的访问和使用,如下所示:
-
DOC-EXAMPLE-BUCKET代表用户自定义的 Bucket Name
-
s3代表服务类型
-
us-west-2代表对象存储的区域为美国西部
https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/photos/puppy.jpg
而在实际的业务运行过程中,用户可能会将自己的域名 CNAME 到上述域名中,方便在业务中进行使用;由于 Bucket Name 是由用户自定义命名的,当访问一个不存在的 Bucket 时,AWS 就会响应NoSuchBucket的状态码,其中 BucketName 标签中的值代表着自定义的存储桶名称,我们可以创建该名称的 S3 Bucket 实现对目标子域的接管。
创建时需要注意 存储桶名称 和 AWS区域 都需要与目标 CNAME 的 AWS 子域名保持一致。
成功创建 S3 Bucket 后,再次访问目标子域时,返回的状态码变成了 AccessDenied,表示已经成功接管目标子域,但是默认情况下创建的存储桶不具备公开可读权限。
配置存储桶关闭阻止所有公开访问并配置存储桶策略开启公有读权限,上传文件进行访问测试。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BucketName/*"
}
]
}
可以看到我们已经成功接管了该子域,此时恶意的攻击者可以利用该可信子域,向目标进行恶意载荷投递、C2通信等攻击行为。
02 S3 Bucket 静态页面部署
S3 Bucket 对于上传到其中的 HTML 文件,访问对应的对象 URL 可以直接响应相关的 HTML 页面,因此可以利用该功能实现单个静态页面的部署,直接上传自定义的 HTML 文件到 S3 Bucket。
访问对应的 URL 可以看到响应的Content-Type为text/html,Server为 AmazonS3。
结合上面的S3 Bucket 子域接管和S3 Bucket静态页面托管,我们可以通过接管子域来实现到钓鱼页面的访问,达到基于可信子域进行钓鱼的目的。从被钓目标的视角来看,访问的站点可能是自己公司或者其他高可信公司名下的某个子域,具备很强的迷惑性,从而有效的提高钓鱼的成功率。
03 S3 Bucket 静态站点托管
利用上述的 S3 Bucket 特性,我们可以完成单个静态页面的部署,但是仅是单个静态页面可能会引起目标用户的怀疑,整个钓鱼站点的交互逻辑还是过于简单,例如随便改动访问的目标页面文件,通过响应内容就可能暴露我们使用的是 S3 Bucket 托管的单页面文件。
那么是否可以基于 S3 Bucket 部署一个交互更加复杂,更加具备迷惑性,并且可以基于可信子域下的钓鱼站点 ?
根据官方文档可以获知,可以使用 S3 Bucket 进行静态站点的托管功能,从而完成 React JS、Vue JS 等框架编写的单页应用程序的部署。
攻击者可以结合 S3 Bucket 静态站点配置访问可信子域名时的默认页面、设置自定义的报错页面,以及配置路由重定向等功能,进一步增强整个钓鱼站点的伪装特性,提高社工钓鱼的成功率。
AWS 上的每个 S3 Bucket 都可以单独开启静态网站托管的功能,主动开启相关功能后,同样需要配置存储桶的规则开启存储对象的公有读权限。
开启该功能以后,访问静态站点需要使用存储桶 AWS 区域上特定的终端节点进行访问,简而言之,我们访问站点的 URL 会有所变化:
http://bucket-name.s3-website-us-east-1.amazonaws.com/
-
bucket-name代表用户自定义的存储桶名称,当用户使用自己的域名 CNAME 到 S3 Bucket 时,bucket-name 需要与域名保持一致,AWS 通过 HTTP 请求中的主机名来完成对应存储桶的关联
-
s3-website-us-east-1代表 s3-website-Region
当访问某些域名出现以下的响应方式时,说明该域名被 CNAME 到了 AWS 具备静态站点托管功能的特定终端节点上:
创建与 BucketName 子域名相同名字的 S3 存储桶,完成子域接管,将准备好的单页应用程序上传,配置好索引文档和错误文档后,直接访问子域名。
访问不存在的页面。
可以看到,已经成功接管该子域,并完成静态站点的托管操作。
这里以实战案例为例,尝试部署实际钓鱼场景下的页面进行钓鱼演示,将准备好的钓鱼站点部署到 S3 Bucket Website 中,可以看到此时访问的域名是已经接管的测试域名。
在该页面登录完成后,将直接跳转至真正的邮件登录页面,进入社工钓鱼平台,可以看到已经成功回传了输入的账号密码。
04 检索可接管子域 在上面笔者已经介绍了该如何利用 S3 Bucket 来接管可信的子域,并利用其进行钓鱼页面部署的攻击场景,那么该如何快速寻找符合条件的子域来完成接管 ?
其实可以看到无论是S3 Bucket还是S3 Bucket Website,我们访问不存在 Bucket Name 的 URL 时,都会有特定的响应结果,结合这个特点,可以利用 Fofa 等网络资产测绘平台来检索符合条件的子域:
-
检索可接管的 S3 Bucket
body="<Code>NoSuchBucket</code>" && host!=".amazonaws.com" && host!="aliyuncs.com" && is_domain=true && country="US"
-
检索可接管的 S3 Bucket Website
body="Code: NoSuchBucket" && host!=".amazonaws.com" && host!="aliyuncs.com" && is_domain=true && country="US"
可以看到按照特定的条件筛选下来以后,还是有许多可以利用的子域,在这些子域中可以进一步进行筛选和检索,找到符合条件的可接管子域: 直接筛选与目标公司具有关联性的域名子域 筛选具备高可信价值的域名子域
05 总结
利用 S3 Bucket 这种方式来接管子域,攻击者充分利用可信子域与S3 Bucket服务的特性,将其作为优质的攻击资源,可以应用在各类攻击场景中,除了本文中讲述的可信钓鱼外,还可能被用在恶意载荷投递、C2通信等场景中,由于整个通信过程中都在使用可信的子域环境,其天然的具备较强的迷惑性和隐蔽性,为防守者的检测带来一定的挑战。
绿盟科技天元实验室专注于新型实战化攻防对抗技术研究。 研究目标包括:漏洞利用技术、防御绕过技术、攻击隐匿技术、攻击持久化技术等蓝军技术,以及攻击技战术、攻击框架的研究。涵盖Web安全、终端安全、AD安全、云安全等多个技术领域的攻击技术研究,以及工业互联网、车联网等业务场景的攻击技术研究。通过研究攻击对抗技术,从攻击视角提供识别风险的方法和手段,为威胁对抗提供决策支撑。
M01N Team公众号 聚焦高级攻防对抗热点技术 绿盟科技蓝军技术研究战队 官方攻防交流群 网络安全一手资讯 攻防技术答疑解惑 扫码加好友即可拉群
原文始发于微信公众号(M01N Team):AWS S3 Bucket子域接管实现可信钓鱼服务攻击