使用CloudFront中继Cobalt Strike流量以隐藏C2通信

本文详细介绍了如何利用Amazon CloudFront内容分发网络来中继Cobalt Strike命令与控制流量,以隐藏C2服务器真实IP并绕过环境中的某些防护措施,包括设置CS服务器、域名注册、HTTPS证书生成、CloudFront分发配置及生成定制化CS配置文件等具体技术步骤。

使用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配合的步骤。通用步骤如下:

  1. 设置Cobalt Strike (CS) 服务器
  2. 注册一个域名并将其指向你的CS服务器
  3. 为你的域名生成HTTPS证书
  4. 创建一个指向你域名的CloudFront分发
  5. 生成一个利用你的HTTPS证书和CloudFront分发的CS配置文件
  6. 生成一个CS有效负载来测试设置

1. 设置Cobalt Strike (CS) 服务器

本例中,我在Digital Ocean上设置了一个基于Debian的节点(我称其为“你的服务器”)。我运行了以下命令来更新系统并安装Cobalt Strike (CS) 所需的OpenJDK:

1
apt-get update && apt-get upgrade -y && apt-get install -y openjdk-8-jdk-headless

https://www.cobaltstrike.com/download 获取最新的Cobalt Strike .tgz文件并放到你的服务器上。使用以下命令解压.tgz文件,进入目录并进行安装:

1
tar -xvf cobaltstrike-trial.tgz && cd cobaltstrike && ./update

注意,此时你需要输入许可证密钥。目前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:

1
nslookup bhisblogtest.xyz

注意:Debian并不总是安装了DNS工具……如果你无法使用nslookup、dig等,可能需要先运行以下命令:

1
apt-get install -y dnsutils

3. 为你的域名生成HTTPS证书

过去,你必须付费购买由受信任证书颁发机构签名的有效证书。如今,我们可以使用LetsEncrypt快速免费地生成它们。具体来说,我们将使用@KillSwitch-GUI的HTTPsC2DoneRight.sh脚本。在使用HTTPsC2DoneRight.sh脚本之前,我们需要安装一些先决条件。假设是Debian系统,请在服务器上运行以下命令来安装先决条件:

1
apt-get install -y git lsof

接下来,确保你在根目录下,获取HTTPsC2DoneRight.sh脚本,启用执行权限并运行它:

1
cd && wget https://raw.githubusercontent.com/killswitch-GUI/CobaltStrike-ToolKit/master/HTTPsC2DoneRight.sh && chmod +x HTTPsC2DoneRight.sh && ./HTTPsC2DoneRight.sh

脚本运行后,你需要输入你注册的域名、HTTPS证书的密码以及你的“cobaltstrike”文件夹的位置。

如果一切顺利,你应该在你的“cobaltstrike”文件夹内的名为“httpsProfile”的文件夹中有一个基于Amazon的CS配置文件,名为amazon.profile。与你的HTTPS证书关联的Java密钥库也将位于“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 并登录,或者如果你还没有账户则创建一个;这是免费的。点击页面顶部的“Create Distribution”。

在页面的“Web”部分下点击“Get Started”。

在“Origin Domain Name”字段中输入你的域名。“Origin ID”字段将自动为你填充。确保其余设置与以下截图匹配。

上面截图未包含的其余设置无需更改。滚动到页面底部并点击“Create Distribution”按钮。

你将返回CloudFront主菜单,应该会看到一个与你的域名关联的cloudfront.net地址。从现在开始,我们将使用这个CloudFront地址来引用我们的服务器。你应该在“Status”列下看到“In Progress”。等待“In Progress”变为“Deployed”后再继续。你可能需要刷新几次页面,因为这可能需要10或15分钟。

你的分发部署完成后,通过访问https://<你的_cloudfront.net_地址>来测试它是否正常工作,并验证你看到了Apache2默认页面且没有任何证书错误。

5. 生成一个利用你的HTTPS证书和CloudFront分发的CS配置文件

我们现在将生成一个CS配置文件以利用我们的CloudFront分发。由于大多数默认的CS配置文件会被标记,我们将花时间在这里生成一个新的。在你的服务器上,返回主目录并获取bluescreenofjeff的Malleable-C2-Randomizer脚本。

1
cd && git clone https://github.com/bluscreenofjeff/Malleable-C2-Randomizer && cd Malleable-C2-Randomizer

下一步是生成一个随机的CS配置文件。我发现Pandora.profile模板使用这种技术时问题最少。运行以下命令生成配置文件。

1
python malleable-c2-randomizer.py -profile Sample\ Templates/Pandora.profile -notest

我们需要将创建的配置文件复制到我们“cobaltstrike”文件夹中的“httpsProfile”文件夹。

进入“httpsProfile”文件夹,以便修改我们新创建的CS配置文件。

1
cd /root/cobaltstrike/httpsProfile

记得我们在amazon.profile文件上运行了tail命令并看到了以“https-certificate”开头的四行吗?我们需要抓住那四行并将它们放在我们新的CS Pandora配置文件的底部。再次在amazon.profile上运行tail命令并复制最后四行(https-certificate部分)。

用你选择的文本编辑器打开新创建的Pandora配置文件。将你刚复制的四行粘贴到Pandora配置文件的底部。

为了良好的操作安全(OpSec),我们应该更改有效负载将生成的默认进程。将以下行添加到你的Pandora配置文件文件的末尾,在你添加的https-certificate部分之下。

1
2
3
4
post-ex {
        set spawnto_x86 "%windir%\\syswow64\\mstsc.exe";
        set spawnto_x64 "%windir%\\sysnative\\mstsc.exe";
}

我们需要在Pandora配置文件中修改的最后一件事是有效负载将信标(beacon)指向的主机。在配置文件中有两个地方需要更改主机。在Pandora配置文件中找到两处提到“Host”的地方,并将地址更改为指向你作为CloudFront分发一部分生成的cloudfront.net地址。

在你的服务器上停止apache2服务,因为它将与我们在最后一步创建的CS监听器冲突。在服务器上运行以下命令:

1
service apache2 stop

我们现在准备用新的配置文件启动我们的CS团队服务器。向上移动一个目录,进入cobaltstrike目录(本例中为/root/cobaltstrike)。使用以下命令模板运行CS团队服务器:

1
./teamserver <CS服务器的IP> <服务器密码> <PANDORA配置文件的路径> <C2终止日期>

CS团队服务器现在应该启动并运行,我们可以进行最后一步了。

6. 生成一个CS有效负载来测试设置

最后一步是启动一个CS监听器并生成一个CS有效负载。此步骤假设你已在系统上安装了CS客户端。打开CS客户端并连接到你的CS团队服务器。

在CS客户端中选择添加新监听器。随意命名监听器,本例中为“rhttps”。在下拉菜单中选择“windows/beacon_https/reverse_https”有效负载。在“Host”字段中,输入你之前创建的CloudFront分发的地址。在“Port”字段中输入443,然后点击保存。

将会显示一个额外的弹出屏幕,要求你输入一个用于信标的域名。输入你的CloudFront分发地址作为信标域名,并点击“Ok”按钮。

你现在应该有一个启动并运行的CS监听器,它利用了到目前为止完成的所有工作。最后一步是生成一个有效负载来测试一切是否正常工作。在此我需要说明,你生成并尝试使用的任何CS有效负载,如果没有额外的步骤,几乎肯定会被AV引擎捕获。生成不被AV捕获的有效负载足够另写一篇博客文章。其要点是你通常生成CS Shellcode并使用一种方法将该shellcode注入内存。我们不会在本文中深入探讨这些细节,因为本文的重点是如何使用CloudFront作为CS的中继。就本文而言,请在你将运行有效负载的Windows系统上禁用所有AV。从下图的菜单中选择“HTML Application”有效负载。

确保“Listener”下拉菜单与你给监听器的名称匹配,本例中为“rhttps”。从“Method”下拉菜单中选择“Executable”。点击“Generate”按钮,选择一个位置保存有效负载,然后双击生成的文件运行有效负载。你应该在CS客户端窗口中观察到一个会话已建立!

防护措施

不幸的是,防止攻击者在你的环境中使用CloudFront作为中继并不像仅仅禁止访问CloudFront那么容易。禁止访问CloudFront可能会为你公司“破坏”一部分互联网,因为许多网站依赖CloudFront。为了帮助降低攻击者建立使用CloudFront作为中继的C2通道的机会,我们建议制定强大的应用程序白名单策略,首先防止用户运行恶意负载。

结论

使用CloudFront作为C2服务器的中继有许多好处,可以让你绕过环境中的多重防护并隐藏C2服务器的来源。本文详细介绍了设置CloudFront分发以用作Cobalt Strike团队服务器中继所需的所有步骤。生成规避AV的CS有效负载将在未来的文章中讨论。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计