使用 Google Cloud Functions 混淆 C2 流量

admin 2024年8月12日21:14:22评论20 views字数 2330阅读7分46秒阅读模式

使用 Google Cloud Functions 混淆 C2 流量

在之前的文章《Google Cloud 中的 Maldoc Transfers》中,我写了关于使用 Google Cloud Provider 无服务器功能从 Google 控制的域提供恶意文档的文章。写完那篇文章后,我继续探索 Google Cloud 可以为攻击性安全从业者提供什么。

我们之前发布过一篇博客文章以及一个概念验证,介绍如何使用 Azure 无服务器函数作为 C2 重定向器。以之前的研究为起点,我还将此重定向器函数移植到了 Google Cloud Provider。PoC 可从FunctionalC2 github 存储库获取。

功能配置

本演练假设读者已经创建了 Google Cloud 帐户。首先,在 Google Cloud Console 中创建一个项目。

使用 Google Cloud Functions 混淆 C2 流量

在 Google Cloud Console 中创建项目按钮
红队操作员需要注意的最重要的事情是,您的项目名称和地区将显示在函数的面向公众的 URL 中,因此请选择适合您的借口的项目名称和地区。
还要确保为项目启用必要的 Google Cloud API。这些 API 包括:
  • 云函数 API
  • 云构建 API
  • Artifact Registry API
  • Cloud Run API
  • 日志 API
启用这些功能后,安装gcloud CLI 工具并登录。您需要使用以下命令选择我们将部署功能的当前项目:
gcloud config set project <PROJECT ID>
FunctionalC2 存储库克隆到本地计算机,然后在您最喜欢的 IDE 或文本编辑器中打开文件夹。cd进入GoogleCloud目录,您将看到getpost。我们必须修改main.py这两个目录中的文件。
get和文件post main.py几乎相同。我们必须更改每个文件的三行:
  1. 函数的名称来自c2Getc2Post。请记住,这些函数将是将流量重定向到 C2 服务器的 URI 端点!因此,请选择对任何监控出站 HTTP 流量的人或事物都可见的函数名称。
  2. teamserver_url的值设置为您的团队服务器的可公开访问的 HTTP URL。这可能是服务器本身、代理或其他重定向器。
  3. beacon_endpoint的值到函数的名称。

使用 Google Cloud Functions 混淆 C2 流量

c2Get需要改变的价值观

现在,在每个getpost目录中运行以下命令一次。确保将其更改<your function name>为区分大小写的函数名称main.py

gcloud functions deploy <your function name> --runtime python310 --trigger-http --allow-unauthenticated

如果一切顺利,输出将如下所示:

使用 Google Cloud Functions 混淆 C2 流量

成功部署输出的屏幕截图,突出显示函数的公共 URL

注意返回的 URL:我们需要将我们的 C2 基础设施和侦听器指向它。当get和post功能都部署完成后,我们可以继续设置命令和控制基础设施。

C2 配置

我在本研究中使用了 Cobalt Strike,但我们也可以使用其他支持 HTTP 植入和监听器的 C2 框架,只需对无服务器功能进行少量修改即可。本节假设读者已经启动了一台机器来托管 C2 团队服务器。用于此 PoC 的团队服务器主机是运行 Debian 11 的 Digital Ocean Droplet。

在启动团队服务器之前,我们必须生成 Malleable C2 配置文件。FunctionalC2 GitHub 存储库中包含的 [此示例配置文件](在此处添加 URL) 最初是使用C2Concealer生成的。但是,我们必须修改此配置文件以确保它适用于我们的功能。首先,我们将其包含set host_stage "false";在初始设置块中,因为我们不使用 stager 作为我们的有效载荷,并且将其保留在启用状态可能会导致我们的团队服务器被标记为恶意。

使用 Google Cloud Functions 混淆 C2 流量

可锻造 C2 轮廓初始设置块显示host_stage设置为false

我们还必须更改配置文件的和块的set uri属性以指向我们的 GCP 功能端点,如下所示。http-gethttp-post

使用 Google Cloud Functions 混淆 C2 流量

http-getblockuri属性设置为我们的重定向函数的名称

保存文件后,我们运行了c2lint Cobalt Strike 附带的工具,以确保在修改配置文件时不会引入任何语法问题。

使用 Google Cloud Functions 混淆 C2 流量

c2lint输出

最后,我们可以用这个配置文件启动团队服务器:

./teamserver <teamserver_ip_address> <password> <malleableC2profile> 

一旦我们确认服务器已启动,我们就可以从 Cobalt Strike 客户端登录它,并设置一个指向我们刚刚创建的配置文件的监听器。我们必须将其指向我们的云函数的 HTTP URL。

使用 Google Cloud Functions 混淆 C2 流量

监听器设置

Cobalt Strike 将通过弹出消息提醒我们侦听器已成功启动。我们创建一个信标有效负载,在 Windows 10 VM 上运行它,然后我们得到一个信标。为了测试,我们运行了一些命令以确保它正确地获取常用功能的输出。

使用 Google Cloud Functions 混淆 C2 流量

非托管 PowerShell 命令的输出

我们可以在该函数的 Google Cloud 日志中确认c2Get该函数正在执行。首先,点击云控制台侧边栏中“Serverless”下的“Cloud Functions”页面。

使用 Google Cloud Functions 混淆 C2 流量

Google Cloud Console 中的 Cloud Functions 按钮

然后点击该c2Get功能,进入“日志”选项卡,如下图所示:

使用 Google Cloud Functions 混淆 C2 流量

我们可以看到,日志已确认该函数已运行。这些日志对于故障排除非常有用,因为任何输出都将STDOUT打印到此日志中。

此 PoC 演示了如何使用无服务器函数作为 Cobalt Strike 信标的 C2 传输。同样,同样的技术理论上应该适用于其他 C2 框架,但还需要进一步测试。

快乐黑客!

原文始发于微信公众号(Ots安全):使用 Google Cloud Functions 混淆 C2 流量

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月12日21:14:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   使用 Google Cloud Functions 混淆 C2 流量http://cn-sec.com/archives/3055470.html

发表评论

匿名网友 填写信息