利用CloudFront中继Cobalt Strike流量
Brian Fehrman
许多人都听说过域前置(Domain Fronting)。域前置是一种技术,通过让C2流量看起来像是向目标拥有的域名发出请求,从而使其与目标的流量混在一起。这对红队隐藏流量非常有用。Amazon CloudFront曾是实现域前置的热门服务。然而,最近CloudFront的更改不再支持通过CloudFront进行域前置以与Cobalt Strike配合使用。那么CloudFront和Cobalt Strike就没用了吗?我认为不是!CloudFront仍然非常有用,原因如下:
- 无需为C2流量使用分类域名
- 流量在一定程度上与CDN流量混合
- 一些公司白名单了CloudFront
- 由于源IP被隐藏,减少了暴露整个C2基础设施的风险
- 流量仍通过HTTPS传输
在本文中,我将逐步介绍我通常用于将CloudFront与Cobalt Strike配合使用的步骤。一般步骤如下:
- 设置Cobalt Strike(CS)服务器
- 注册域名并指向CS服务器
- 为域名生成HTTPS证书
- 创建指向域名的CloudFront分发
- 生成利用HTTPS证书和CloudFront分发的CS配置文件
- 生成CS载荷以测试设置
1. 设置Cobalt Strike(CS)服务器
在这种情况下,我在Digital Ocean上设置了一个基于Debian的节点(我称之为“您的服务器”)。我运行以下命令进行更新并安装Cobalt Strike(CS)所需的OpenJDK:
|
|
从https://www.cobaltstrike.com/download 获取最新的Cobalt Strike .tgz文件,并将其放置到您的服务器上。使用以下命令解压.tgz,进入目录并安装:
|
|
请注意,此时您需要输入许可证密钥。这是我们现在需要在CS上完成的所有设置。我们将在过程中进行更多配置。
2. 注册域名并指向CS服务器
我们需要注册一个域名,以便生成HTTPS证书。CloudFront要求您有一个有效的域名和HTTPS证书,该证书指向运行Apache等服务的服务器,以便验证证书的有效性。域名不需要分类,这使事情变得简单。我喜欢使用https://www.namesilo.com,但您可以使用任何您喜欢的注册商。在这种情况下,我只是搜索了“bhisblogtest”并选择了最便宜的扩展名,即bhisblogtest.xyz,每年0.99美元。
我喜欢namesilo.com的原因之一是您可以获得免费的WHOIS隐私;一些公司对此收费。此外,它不会附加额外的ICANN费用。
注册域名后,使用namesilo.com更新DNS记录。我通常删除它创建的默认记录。删除默认DNS记录后,创建一个指向您服务器的单个A记录。在这种情况下,我的服务器IP是159.65.46.217。
注意:对于那些现在有些冲动的人,我不建议攻击它,因为它在发布之前已被暴露,如果当前活跃,可能属于其他人。
等待DNS记录传播后再进行下一步。根据我的经验,这通常需要大约10-15分钟。在您注册的域名上运行您最喜欢的DNS查找工具,并等待返回的IP地址与您服务器的IP地址匹配。在这种情况下,我们运行以下命令直到看到返回159.65.46.217:
|
|
注意:Debian并不总是安装DNS工具…如果您无法使用nslookup、dig等,可能需要先运行以下命令:
|
|
3. 为域名生成HTTPS证书
在过去,您必须花钱购买由受信任证书颁发机构签名的有效证书。如今,我们可以使用LetsEncrypt快速免费地生成它们。特别是,我们将使用@KillSwitch-GUI的HTTPsC2DoneRight.sh脚本。在使用HTTPsC2DoneRight.sh脚本之前,我们需要安装一些先决条件。假设是Debian,在您的服务器上运行以下命令以安装先决条件:
|
|
接下来,确保您在根目录中,获取HTTPsC2DoneRight.sh脚本,启用执行并运行它:
|
|
脚本运行后,您需要输入您注册的域名、HTTPS证书的密码以及“cobaltstrike”文件夹的位置。
如果一切顺利,您应该在“cobaltstrike”文件夹内的名为“httpsProfile”的文件夹中有一个基于Amazon的CS配置文件,名为amazon.profile。与您的HTTPS证书关联的Java Keystore也将在“httpsProfile”文件夹中。
如果您在amazon.profile上运行tail命令,您将在CS配置文件中看到与HTTPS证书关联的信息。我们实际上将在稍后生成一个新的CS配置文件,但需要amazon.profile末尾的四行用于该配置文件。
此时,您应该能够打开Web浏览器,访问https://<您的域名>,并看到默认的Apache页面,没有任何证书错误。如果上述情况没有发生,那么过程中的某个地方出了问题,剩余的步骤可能不会成功。
4. 创建指向域名的CloudFront分发
下一步是创建CloudFront分发并将其指向您的域名。以下是我最初使用并仍然参考以正确设置的文章: https://medium.com/rvrsh3ll/ssl-domain-fronting-101-4348d410c56f
访问https://console.aws.amazon.com/cloudfront/home 并登录或创建帐户(如果您还没有);它是免费的。单击页面顶部的“创建分发”。
在页面的“Web”部分下单击“开始使用”。
在“源域名”字段中输入您的域名。“源ID”字段将自动为您填充。确保其余设置与以下屏幕截图匹配。
未包含在上述屏幕截图中的其余设置不需要更改。滚动到页面底部并单击“创建分发”按钮。
您将被带回CloudFront主菜单,您应该看到一个与您的域名关联的cloudfront.net地址。CloudFront地址将是我们从现在起引用服务器的方式。您应该在“状态”列下看到“进行中”。等待“进行中”变为“已部署”后再继续。您可能需要刷新页面几次,因为这可能需要10或15分钟。
分发部署后,通过访问https://<您的_cloudfront.net_地址> 测试它是否正常工作,并验证您看到Apache2默认页面,没有任何证书错误。
5. 生成利用HTTPS证书和CloudFront分发的CS配置文件
我们现在将生成一个CS配置文件以利用我们的CloudFront分发。由于大多数默认CS配置文件被标记,我们将在这里花时间生成一个新的。在您的服务器上,返回主目录并获取bluescreenofjeff的Malleable-C2-Randomizer脚本。
|
|
下一步是生成一个随机的CS配置文件。我发现Pandora.profile模板使用这种技术时问题最少。运行以下命令以生成配置文件。
|
|
我们需要将创建的配置文件复制到“cobaltstrike”文件夹中的“httpsProfile”文件夹。下面的屏幕截图显示了Malleable-C2-Randomizer脚本输出的示例以及将该文件复制到“httpsProfile”文件夹。
进入“httpsProfile”文件夹,以便我们可以修改新创建的CS配置文件。
|
|
记得当我们在amazon.profile文件上运行tail时,看到了以“https-certificate”开头的四行吗?我们需要抓住那四行并将它们放在我们新的CS Pandora配置文件的底部。再次在amazon.profile上运行tail命令,并复制最后四行(https-certificate部分)。
在您选择的文本编辑器中打开新创建的Pandora配置文件。将您刚复制的四行粘贴到Pandora配置文件的底部。
为了良好的操作安全(OpSec),我们应该更改载荷将生成的默认进程。将以下行添加到Pandora配置文件文件的末尾,在您添加的https-certificate部分之下。
|
|
我们需要在Pandora配置文件中修改的最后一件事是载荷将信标的主机。配置文件中有两个位置需要更改主机。在Pandora配置文件中找到两个提到“Host”的位置,并将地址更改为指向作为CloudFront分发一部分生成的cloudfront.net地址。
在您的服务器上停止apache2服务,因为它将与我们在最后一步创建的CS侦听器冲突。在您的服务器上运行以下命令:
|
|
我们现在准备使用新配置文件启动我们的CS团队服务器。向上移动一个目录,以便您位于cobaltstrike目录中,在这种情况下是/root/cobaltstrike。使用以下命令模板运行CS团队服务器:
|
|
CS团队服务器现在应该启动并运行,我们可以进行最后步骤。
6. 生成CS载荷以测试设置
最后一步是启动CS侦听器并生成CS载荷。此步骤假设您已在系统上安装了CS客户端。打开CS客户端并连接到您的CS团队服务器。
在CS客户端中选择添加新侦听器的选项。将侦听器命名为您喜欢的任何名称,在此示例中为“rhttps”。在下拉菜单中选择“windows/beacon_https/reverse_https”载荷。在“主机”字段中,输入您之前创建的CloudFront分发的地址。在“端口”字段中输入443,然后单击保存。
将显示一个额外的弹出屏幕,要求您输入用于信标的域名。输入您的CloudFront分发地址作为信标域名,并单击“确定”按钮。
您现在应该有一个启动并运行的CS侦听器,它利用了到目前为止完成的所有工作。最后一步是生成一个载荷以测试一切是否正常工作。我在此指出,您生成并尝试使用的任何CS载荷如果没有额外步骤,几乎肯定会被AV引擎捕获。生成不被AV捕获的载荷足够另一篇博客文章的材料。要点是您通常生成CS Shellcode并使用一种方法将该shellcode注入内存。我们不会在本文中深入探讨这些细节,因为本文的重点是如何使用CloudFront作为CS的中继。出于我们的目的,在您将运行载荷的Windows系统上禁用所有AV。从下面屏幕截图所示的菜单中选择“HTML应用程序”载荷。
确保“侦听器”下拉菜单与您给侦听器的名称匹配,在这种情况下是“rhttps”。从“方法”下拉菜单中选择“可执行文件”。单击“生成”按钮,选择保存载荷的位置,然后通过双击生成的文件运行载荷。您应该在CS客户端窗口中观察到会话已建立!
防护措施
不幸的是,防止攻击者在您的环境中使用CloudFront作为中继并不像仅仅禁止访问CloudFront那样容易。禁止访问CloudFront可能会“破坏”您公司的一部分互联网,因为许多网站依赖CloudFront。为了帮助减轻攻击者建立使用CloudFront作为中继的C2通道的机会,我们建议制定强大的应用程序白名单策略,首先防止用户运行恶意载荷。
结论
使用CloudFront作为C2服务器的中继有许多好处,可以让您绕过环境中的多个保护措施并隐藏C2服务器的来源。本文逐步介绍了设置CloudFront分发以用作Cobalt Strike团队服务器中继所需的所有步骤。生成逃避AV的CS载荷将在未来的帖子中讨论。