导语:在这篇文章中,我们将介绍C2K的变化以及重新部署具有所有新功能的演示C2基础架构。值得注意的是,并非所有显示的内容都是自动的或是C2K脚本的一部分。当前正在进行的C2K中还增加了更多功能。
在本系列的前一篇文章中,我决定重写C2K(可以在此处找到),以更改其用户的行为和选项。
在这篇文章中,我们将介绍C2K的变化以及重新部署具有所有新功能的演示C2基础架构。值得注意的是,并非所有显示的内容都是自动的或是C2K脚本的一部分。当前正在进行的C2K中还增加了更多功能。
C2K又叫命令和控制工具包,是一个bash脚本,用于加速重复C2构建和任务的过程。新的设计允许用户轻松快速地移除,添加或编辑完成工作所需的功能。目前C2K提供以下功能:
· 部署Cobalt Strike团队服务器
· 为HTTP C2实例部署Apache mod_rewrite重定向器
· 将HTTPS支持添加到HTTP C2实例
· 为C2流量配置防火墙规则
· 锁定对C2实例的SSH访问
· 配置终端记录
· 在C2实例上配置Logwatch
在这篇文章中,我们将使用所有上述功能以及一些手动添加,如:
· 将Cobalt Strike信标事件整合到Slack中
· 将Digital Ocean性能警报集成到Slack中
· 使用Digital Ocean doctl CLI创建全球基础设施防火墙
为了使用C2K(和手动警报设置),在使用它之前,你需要一些下面的要求:
· Digital Ocean账户
· Digital OceanAPI密钥
· Cobalt Strike工许可证
· Slack
· 为传入的webhook创建Slack应用程序
· 域名和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实例中添加一些防御措施的起点。首先,它会再次从@Killswitch_GUI安装lterm,这是一个很不错的实用程序,它记录控制台活动并将其写入文件。它还会安装Logwatch并通过电子邮件报告你服务器上发生的事情。在上图中,你需要编辑电子邮件地址的2个字段(显示为 [email protected] )。你还可以调整上述任何设置,以便设置你所希望收到通知的首选方式,通知时间以及详细程度。
C2K准备
在执行C2K之前,让我们准备好开始创建基础架构所需的一切。计划如下:
· 域名(s) – 我将使用ilikedemos [.] com进行此演示
· 需要为我们的不同主机设置A记录
· 4个droplet – 这些将是我们模拟的C2实例
· Payload主机 – 用于托管下载,脚本,后门等的Cobalt Strike实例。
· HTTP主机 – 用于接收反向HTTP信标的Cobalt Strike实例
· HTTP重定向主机 – 用于代理的Apache mod_rewrite实例
· HTTPS主机 – Cobalt Strike实例接收反向HTTPS信标
· SSH密钥 – 将创建一个新的SSH密钥并添加到Digital Ocean
· Slack通道和webhook
· Cobalt Strike和Slack集成的攻击者脚本来自@bluscreenofjeff(https://github.com/bluscreenofjeff/AggressorScripts)
让我们开始吧。
从Digital Ocean开始,登录到你的帐户,我们将获得API密钥并将SSH密钥添加到我们的配置文件。
点击页面顶部的“API”,如果你还没有点击“生成新令牌”,则创建一个新的API密钥。
给你的令牌取一个新的名字。当它被创建时,一定要记下密钥,因为它只会显示一次哦。如果你忘记了,那么你需要重新生成一个新的令牌。
接下来,在你的配置文件安全设置部分,通过单击“添加SSH密钥”创建新的SSH密钥或记下现有的SSH密钥指纹。
现在将是更新c2k.sh并添加Digital Ocean API密钥和SSH指纹的好时机。
我们现在可以运行c2k.sh脚本并为我们的C2创建droplet。我将使用以下设置创建4个droplet:
· 所有的droplet都将在nyc3中进行演示
· 所有的droplet的大小都是2GB,但我建议根据实际操作分配更多的空间
· 每个droplet的主机名将分别是:
· payload.ilikedemos.com
· http.ilikedemos.com
· httpred.ilikedemos.com
· https.ilikedemos.com
选择选项1可以自动部署在脚本中配置的droplet。
一旦完成运行,检查你的Digital Ocean 的droplet页面,你应该可以看到新创建的droplet。
现在将是更新你用于C2基础架构的域名的A记录的好时机。
接下来,我们需要将C2K文件夹的内容转移到每台机器上(实际上你不需要将Cobalt Strike转移到重定向器)。在下面的图片中,重复每个droplet的SCP过程。
一旦你完成了将C2K包复制到每个droplet中的过程,SSH通常以root用户身份使用SSH密钥登录。在droplet上运行C2K脚本之前,我想设置一个root密码。因为我们稍后将使用sudoers组中的新用户通过SSH登录,如果你想直接提升到root用户,你将需要拥有一个密码(尽管不是必需的)。
在这个演示中,并不是所有的这4个droplet都需要在c2k.sh中运行相同的选择。下面是我将在每个droplet上执行的细节。
· Payload主机 – 安装Cobalt Strike,安装日志记录和防御工具。
· HTTP主机 – 安装Cobalt Strike,安装日志记录和防御工具。
· HTTPS主机 – 安装Cobalt Strike,安装HTTPS支持,安装日志记录和防御工具。
· 运行HTTPsC2DoneRight.sh之前,请确保设置了A记录
· 请注意,此脚本默认使用了带有HTTPS支持的amazon.profile Malleable C2配置文件。请务必编辑该文件或使用该配置文件运行你的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控制面板中,点击顶部导航栏中的“监控”。
注意上图的底部。我们需要在每个想要监视性能的droplet上执行一条命令。在创建新策略之前,执行该命令(将很快将其集成到c2k.sh脚本中)。
完成后,点击“创建警报策略”。
选择一个度量标准来提醒你,例如CPU,然后设置你所需的阈值设置。按名称或标记添加你的droplet,然后在警报部分下选择“Connect Slack”。你需要向你的Slack帐户进行身份验证,然后选择你希望收到提醒的频道。完成后,点击“创建警报策略”。下面的图片显示了Digital Ocean和Slack的结果。
不错。现在我们将把来自Cobalt Strikes beacon的警报整合到同一个Slack通道中。你需要创建一个新的Slack应用程序,并记下webhook以添加到Cobalt Strike中。这个过程可以跟在@bluescreenofjeff这里的优秀帖子一起使用:
https://bluescreenofjeff.com/2017-04-11-slack-bots-for-trolls-and-work/
转到你的Slack帐户应用程序页面并选择“创建应用程序”。
点击“创建应用程序”,为你的应用程序指定一个名称和希望收到警报的Slack频道。
在出现的下一页中选择“传入Webhooks”。
在Webhooks页面上,你需要将其切换为激活该功能。
一旦启用,你需要选择页面底部并创建一个新的Webhook。点击“添加新的Webhook到工作区”,然后在弹出窗口中选择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和dropletID。这些设置也反映在你的Digital Ocean控制面板中。
最后的想法和说明
在结束这篇文章之前,我对上述设计进行了一些思考:
· 从OPSEC的角度来看,如果Digital Ocean的整个范围受阻,则将整个C2托管在单个提供商处可能会出现问题。
· 关于OPSEC,将所有C2流量呼叫到单个域也不是很好。应该将其混合并分散出去 。
· 如果某些可能敏感的信息发布到Slack,则事件日志到缓冲的Aggressor脚本可能不是你或你的客户所满意的。考虑到这一点。
· 最近有一些关于云VPS和系统上的攻击基础设施的Twitter辩论,你实际上并没有真正的控制权和伦理道德。这是一个有效的且需要考虑的事情,以确保你和你的客户知道他们的数据将如何以及在何处受到保护
C2K远未完成项目。我还在努力添加诸如DNS团队服务器和重定向器,更多防御性设置以及SMTP中继自动化的网络钓鱼实例等新增内容。
我想特别感谢那些撰写了我已经整合到C2K中的工具的人以及一些对我有很大影响和有用资源的人:
· @Killswitch_GUI for lterm和HTTPsC2DoneRight.sh
· 用于创建Red Team Infrastructure Wiki的@bluscreenofjeff
· BlackHills Infosec的工作人员让我可以在他们的博客上发帖。
· @armitagehacker Cobalt Strike