在之前的文章《Google Cloud 中的 Maldoc Transfers》中,我写了关于使用 Google Cloud Provider 无服务器功能从 Google 控制的域提供恶意文档的文章。写完那篇文章后,我继续探索 Google Cloud 可以为攻击性安全从业者提供什么。
我们之前发布过一篇博客文章以及一个概念验证,介绍如何使用 Azure 无服务器函数作为 C2 重定向器。以之前的研究为起点,我还将此重定向器函数移植到了 Google Cloud Provider。PoC 可从FunctionalC2 github 存储库获取。
功能配置
本演练假设读者已经创建了 Google Cloud 帐户。首先,在 Google Cloud Console 中创建一个项目。
-
云函数 API -
云构建 API -
Artifact Registry API -
Cloud Run API -
日志 API
gcloud config set project <PROJECT ID>
-
函数的名称来自c2Get或c2Post。请记住,这些函数将是将流量重定向到 C2 服务器的 URI 端点!因此,请选择对任何监控出站 HTTP 流量的人或事物都可见的函数名称。 -
teamserver_url的值设置为您的团队服务器的可公开访问的 HTTP URL。这可能是服务器本身、代理或其他重定向器。 -
beacon_endpoint的值到函数的名称。
c2Get需要改变的价值观
现在,在每个get和post目录中运行以下命令一次。确保将其更改<your function name>为区分大小写的函数名称main.py。
gcloud functions deploy <your function name> --runtime python310 --trigger-http --allow-unauthenticated
如果一切顺利,输出将如下所示:
成功部署输出的屏幕截图,突出显示函数的公共 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 作为我们的有效载荷,并且将其保留在启用状态可能会导致我们的团队服务器被标记为恶意。
可锻造 C2 轮廓初始设置块显示host_stage设置为false
我们还必须更改配置文件的和块的set uri属性以指向我们的 GCP 功能端点,如下所示。http-gethttp-post
http-getblockuri属性设置为我们的重定向函数的名称
保存文件后,我们运行了c2lint Cobalt Strike 附带的工具,以确保在修改配置文件时不会引入任何语法问题。
c2lint输出
最后,我们可以用这个配置文件启动团队服务器:
./teamserver <teamserver_ip_address> <password> <malleableC2profile>
一旦我们确认服务器已启动,我们就可以从 Cobalt Strike 客户端登录它,并设置一个指向我们刚刚创建的配置文件的监听器。我们必须将其指向我们的云函数的 HTTP URL。
监听器设置
Cobalt Strike 将通过弹出消息提醒我们侦听器已成功启动。我们创建一个信标有效负载,在 Windows 10 VM 上运行它,然后我们得到一个信标。为了测试,我们运行了一些命令以确保它正确地获取常用功能的输出。
非托管 PowerShell 命令的输出
我们可以在该函数的 Google Cloud 日志中确认c2Get该函数正在执行。首先,点击云控制台侧边栏中“Serverless”下的“Cloud Functions”页面。
Google Cloud Console 中的 Cloud Functions 按钮
然后点击该c2Get功能,进入“日志”选项卡,如下图所示:
我们可以看到,日志已确认该函数已运行。这些日志对于故障排除非常有用,因为任何输出都将STDOUT打印到此日志中。
此 PoC 演示了如何使用无服务器函数作为 Cobalt Strike 信标的 C2 传输。同样,同样的技术理论上应该适用于其他 C2 框架,但还需要进一步测试。
快乐黑客!
原文始发于微信公众号(Ots安全):使用 Google Cloud Functions 混淆 C2 流量
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论