如何使用Digital Ocean构建命令与控制基础设施:C2K重构
Lee Kagan* //
基于本系列之前的文章,我决定重写C2K(在此处找到)以改变其行为和用户选项。
在本文中,我们将逐步介绍C2K的更改,并使用所有新功能重新部署演示C2基础设施。值得注意的是,并非所有演示内容都是自动化的或属于C2K脚本的一部分。C2K还在添加更多功能,目前仍在进行中。
C2K,即命令与控制工具包,是一个我编写的bash脚本,用于加速重复的C2构建和任务。新设计允许用户轻松快速地删除、添加或编辑所需功能以完成任务。目前C2K提供以下功能:
- 部署Cobalt Strike团队服务器
- 为HTTP C2实例部署Apache mod_rewrite重定向器
- 为HTTP C2实例添加HTTPS支持
- 配置C2流量的防火墙规则
- 锁定C2实例的SSH访问
- 配置终端日志记录
- 在C2实例上配置Logwatch
在本文中,我们将使用上述所有功能以及一些手动添加,例如:
- 将Cobalt Strike信标事件集成到Slack
- 将Digital Ocean性能警报集成到Slack
- 使用Digital Ocean doctl CLI创建全局基础设施防火墙
为了使用C2K(和手动警报设置),您需要满足以下要求:
- Digital Ocean账户
- Digital Ocean API密钥
- Cobalt Strike许可证
- Slack
- 创建Slack应用以获取传入webhook
- 域名和DNS管理(例如GoDaddy)
新C2K演练
让我们看看代码以及如何使用C2K。
C2K包包含3个项目,可以从GitHub获取:
- c2k.sh – 要执行的主脚本
- HTTPsC2DoneRight.sh – 来自@Killswitch_GUI的设置HTTPS支持的脚本
- sshd_config – 用于锁定SSH访问的自定义SSHD配置模板
注意:您需要负责自己的Cobalt Strike副本。下载所有内容后,将解压的存档放在与上述相同的文件夹中。
继续打开c2k.sh,让我们看看里面。
c2k.sh脚本中的所有内容都分为部分、桶和函数,以允许用户快速轻松地修改任何内容。在上图中,您需要设置以下变量:
- DOTOKEN – 在引号之间放置您的Digital Ocean API密钥
- NEWUSER – 在引号之间放置您将用于通过SSH登录新droplet的用户名
从这里开始的一切都按函数分解。这使得添加/删除/编辑命令和功能非常容易。
函数“func_getDependencies”是一个基本的更新和安装一些要求。在极少数情况下,如果您没有安装python,它也会添加。☺
函数“func_createUser”将为SSH访问创建新用户,并将该账户添加到sudoers组。
函数“func_setupSSH”将进行必要的更改以设置新用户的SSH访问,并将droplet上现有的密钥移动到该用户(现有的SSH密钥是您第一次通过root登录新droplet时使用的)。
函数“func_createDroplets”是droplet创建魔法发生的地方。它利用Digital Ocean API。在上图中,我展示了如何一次创建多个droplet。如果您希望一次创建一个,只需删除以curl开头的第二个和第三个块。
您需要为每个droplet设置“YOUR_DROPLETS_HOSTNAME”字段。您还可以根据需要设置区域、大小和镜像(这仅在Ubuntu 16.04上测试过)。最后,您需要在“YOUR_SSHKEY_FINGERPRINT”字段中添加您的SSH密钥指纹。这可以在您添加SSH密钥时在Digital Ocean控制面板中获取(我们稍后会看到)。
由于此脚本围绕使用Cobalt Strike,上图中的函数都与之相关,但可以修改为您喜欢的框架,即MSF或Empire。
函数“func_getCSDependencies”安装Cobalt Strike的Java要求。函数“func_installCobaltStrike”解压并运行安装程序,这将提示您输入许可证。函数“func_getMalleable”将拉取Malleable C2配置文件到解压的Cobalt Strike目录中。函数“func_addHTTPSSupport”将运行HTTPsC2DoneRight.sh脚本。
限制与团队服务器的连接非常重要。在上图中,有一个简单的函数“func_createFirewall”来设置哪些端口可访问。这不是一个坚不可摧的防火墙,因此鼓励根据需要限制访问(注意:我们稍后还将使用doctl查看全局基础设施防火墙)。
当在C2K中选择HTTP重定向器选项时,上图中的函数“func_createHTTPRedirector”利用了一个优秀的脚本,由@n0pe_sled提供。此脚本将自动化配置HTTP重定向实例的过程。强烈建议访问作者的GitHub页面(https://github.com/n0pe-sled/Apache2-Mod-Rewrite-Setup)以查看所有可用选项。
在上面的示例中,函数将拉取脚本以及Malleable C2配置文件。该脚本支持使用Malleable配置文件进行重定向,尽管在上面的示例中未使用。在使用前需要编辑的重要字段是“—block_url”和“—allow_url”。添加一个您希望发送流量但不接触团队服务器或不符合重定向条件的域。然后添加应代理流量的C2域(这是您的HTTP C2实例)。
最后,最后一个函数是“func_installDefensiveTools”。此函数是向C2实例添加一些防御措施的起点。首先安装lterm,这是一个来自@Killswitch_GUI的实用程序,记录控制台活动并将其写入文件。它还将安装Logwatch并通过电子邮件向您发送服务器上发生的情况报告。在上图中,您需要编辑2个字段以输入您的电子邮件地址(显示为[email protected])。您还可以调整上述任何设置,以选择您喜欢的通知方式、时间和详细程度。
C2K准备
在执行C2K之前,让我们准备开始创建基础设施所需的一切。计划如下:
- 域 – 我将使用ilikedemos[.]com进行此演示
- 需要为我们的不同主机设置A记录
- 4个droplet – 这些将是我们的模拟C2实例
- 有效负载主机 – 用于托管下载、脚本、植入物等的Cobalt Strike实例
- HTTP主机 – 用于接收反向HTTP信标的Cobalt Strike实例
- HTTP重定向主机 – 用于代理的Apache mod_rewrite实例
- HTTPS主机 – 接收反向HTTPS信标的Cobalt Strike实例
- SSH密钥 – 将创建新的SSH密钥并添加到Digital Ocean
- Slack频道和webhook
- 来自@bluscreenofjeff的Cobalt Strike和Slack集成Aggressor脚本(https://github.com/bluscreenofjeff/AggressorScripts)
让我们开始。 从Digital Ocean开始,登录您的账户,我们将获取API密钥并向我们的配置文件添加SSH密钥。
单击页面顶部的“API”,如果您还没有API密钥,请单击“Generate New Token”创建一个新的API密钥。
为您的令牌命名。创建后,请务必记下密钥,因为它只会显示一次。如果丢失,您需要生成新令牌。
接下来,在您的配置文件安全设置部分,单击“Add SSH Key”创建新的SSH密钥,或记下您现有SSH密钥的指纹。
现在是更新c2k.sh并添加您的Digital Ocean API密钥和SSH指纹的好时机。
我们现在可以运行c2k.sh脚本并为我们的C2创建droplet。我将创建4个具有以下设置的droplet:
- 所有都将位于nyc3进行此演示
- 所有都将为2gb,尽管我建议实际操作中使用更多
- 每个主机名将为:
- payload.ilikedemos.com
- http.ilikedemos.com
- httpred.ilikedemos.com
- https.ilikedemos.com
选择选项1以自动部署您在脚本中配置的droplet。
运行完成后,检查您的Digital Ocean droplets页面,您应该看到新创建的droplet。
现在是更新您将用于C2基础设施的域的A记录的好时机。
接下来,我们需要将C2K文件夹内容传输到每台机器(实际上不需要将Cobalt Strike传输到重定向器)。在下图中,为每个droplet重复SCP过程。
将C2K包复制到每个droplet后,正常以root身份SSH登录,这将使用SSH密钥登录。
在droplet上运行C2K脚本之前,我喜欢设置root密码。因为我们稍后将使用sudoers组中的新用户通过SSH登录,如果您想直接提升到root,您将有一个密码可以这样做(尽管不是真正必要的)。
此演示中的4个droplet并不都需要在c2k.sh中运行相同的选择。以下是我将在每个上执行的内容的分解:
- 有效负载主机 – 安装Cobalt Strike,安装日志记录和防御工具。
- HTTP主机 – 安装Cobalt Strike,安装日志记录和防御工具。
- HTTPS主机 – 安装Cobalt Strike,安装HTTPS支持,安装日志记录和防御工具。
- 在运行HTTPsC2DoneRight.sh之前确保设置了A记录
- 请注意,此脚本默认将使用amazon.profile Malleable C2配置文件与HTTPS支持。确保编辑此文件或使用该配置文件运行您的HTTPS团队服务器
- 完成后停止Apache运行,否则它将与Cobalt Strike设置侦听器冲突。
- HTTP重定向主机 – 安装HTTP重定向,安装日志记录和防御工具。
- 在运行此选项之前,确保在c2k.sh脚本中设置apache_mod_rewrite_setup标志
还要注意sshd_config模板中的设置。有一个自定义SSH端口和用户名设置,您需要更改。SSH端口由您决定,但确保c2k.sh中的NEWUSER变量与sshd_config模板中的AllowUser指令匹配。一旦c2k.sh脚本完成,您将必须使用newusername@droplet_address -p 7654(或您选择的任何自定义端口)通过SSH登录一次。
脚本完成上述选择后,断开连接并使用新用户账户重新登录。
完成所有droplet的c2k.sh脚本选项后,让我们添加更多监控和警报。
首先,让我们添加Digital Ocean Slack集成以进行droplet性能监控。在您的Digital Ocean控制面板中,单击顶部导航中的“Monitoring”。
开始时这应该是空白的,但也要注意上图底部。有一个命令我们需要在要监控性能的每个droplet上执行。在创建新策略之前,执行该命令(将很快将其集成到c2k.sh脚本中)。
完成后,单击“Create alert policy”。
选择一个要警报的指标,如CPU,然后选择所需的阈值设置。按名称或标签添加您的droplet,然后在警报部分下选择“Connect Slack”。您需要验证到您的Slack账户并选择要接收警报的频道。完成后,单击“Create alert policy”。下图显示了Digital Ocean和Slack上的结果。
很好。现在我们将把Cobalt Strike信标的警报集成到同一个Slack频道中。您需要创建一个新的Slack应用并记下webhook以添加到Cobalt Strike。这个过程可以跟随@bluescreenofjeff的优秀文章:https://bluescreenofjeff.com/2017-04-11-slack-bots-for-trolls-and-work/
转到您的Slack账户的应用页面,选择“Create an App”。
为您的应用命名和您希望接收警报的Slack频道,然后单击“Create App”。
在接下来出现的页面中,选择“Incoming Webhooks”。
在Webhooks页面上,您需要切换它以激活功能。
启用后,在页面底部,您需要选择并创建新的Webhook。单击“Add new Webhook to Workspace”,在弹出窗口中选择Slack中的相同频道(或如果您喜欢,可以选择不同的频道)以接收警报。
完成后,您的新Webhook URL将显示。记下这一点,因为您需要将其输入到Cobalt Strike的Aggressor脚本中。
现在剩下的就是测试我们的C2基础设施,并确保一切按预期工作。
将我的Cobalt Strike客户端连接到所有活动的团队服务器后,我添加了eventlog-to-slack.cna Aggressor脚本并输入了适当的设置。
此集成可以在相应的Slack频道中确认。
接下来,我创建了两个侦听器。一个在HTTP主机上,也设置为其信标回调到HTTP重定向器。第二个在HTTPS侦听器上,直接连接回它(无重定向)。
在有效负载主机上,我托管了一个PowerShell web交付脚本,该脚本暂存到HTTP主机,将通过重定向器代理。
在受害机器上执行PowerShell有效负载后,一切通过重定向器成功暂存,并通过HTTP主机获得访问权限。
通过跟踪重定向器上的Apache日志,我们还可以看到重定向器的运行情况。
最后,我从HTTP主机上的访问生成一个新的信标,以回调到HTTPS主机。
很好。看起来一切现在完全运行,我们还有新信标进入的Slack通知。
全局防火墙
最后,我想回到一开始提到的doctl实用程序。这是一个安装在您物理主机上的CLI工具(但不必是),允许您访问和配置Digital Ocean提供的几乎所有选项。
我对此的想法是使用Digital Ocean防火墙功能创建一个防火墙,限制对整个基础设施的访问。这样做的一个原因是设置规则,只允许您和您的客户接触基础设施。
当您第一次运行doctl时,您需要使用API密钥进行身份验证。
之后,所有选项现在都可用。
在上图中,您可以看到如何使用几个命令从您的Digital Ocean账户查询各种信息。
让我们创建一个防火墙,然后将其应用于所有droplet。这里的想法是演示如何不仅限制进出实例的流量,还可以在需要时限制它们之间的流量。
在上图中,我正在创建一个名为“c2-infra-firewall”的演示防火墙,并定义入站和出站规则。对于入站,您可能希望将0.0.0.0/0更改为您的原始IP,以及可能来自您测试对象的IP地址。
如此严格限制流量的其他一些优势是,如果您的目标与蓝队在不同的网络上。此外,限制互联网噪音和潜在的不需要的访问者接触您的C2。
创建防火墙后,您可以列出它及其设置,并开始全局向其添加droplet。您只需要防火墙ID和droplet ID,如上图所示。这些设置也反映在您的Digital Ocean控制面板中。
结束语和提及
在结束本文之前,对上述设计的一些想法:
- 从OPSEC的角度来看,将整个C2托管在单个提供商上可能会出现问题,如果Digital Ocean的整个范围被阻止。
- 同样关于OPSEC,让所有C2流量调用单个域也不好。混合并分散它☺
- eventlog-to-slack Aggressor脚本可能不是您或您的客户满意的,如果某些潜在敏感信息发布到Slack。请考虑这一点。
- 最近有一些关于云VPS上攻击基础设施和您实际上无法真正控制的系统的Twitter辩论,以及这方面的道德问题。这是一个有效的观点,需要考虑,因此请确保您和您的客户了解如何以及在哪里保护他们的数据。
C2K远非一个完成的项目。我仍在努力添加许多新功能,例如DNS团队服务器和重定向器、更多防御设置和带有SMTP中继自动化的网络钓鱼实例。
我想特别感谢那些编写了我集成到C2K中的工具的人,以及一些对我影响很大的人和有用资源:
- @Killswitch_GUI 用于lterm和HTTPsC2DoneRight.sh
- @bluscreenofjeff 用于创建Red Team Infrastructure Wiki
- BlackHills Infosec员工允许我在他们的优秀博客上发布。
- @armitagehacker 用于Cobalt Strike
非常感谢大家的阅读,祝黑客愉快☺
*Lee Kagan是来自RedBlack Security的客座博主。他是一名进攻性安全专业人士,在IT和InfoSec领域有近十年的经验。一名渗透测试员、红队队员,目前是RedBlack Security的Rogue Team负责人,专注于加拿大多伦多的威胁和对手模拟。Lee在团队和实践中的重点是进攻性基础设施支持、Windows和Active Directory环境的后期利用、PowerShell和C#武器化。