Cobalt Strike与赛门铁克攻防实战:绕过终端防护建立C2通道

本文详细记录了使用Cobalt Strike构建C2基础设施对抗赛门铁克终端防护的实战过程,包括payload生成、HIPS绕过技术、流量伪装技巧以及64位与32位shellcode的不同检测结果分析。

与Cobalt Strike和赛门铁克共度的早晨

Joff Thyer //

如果你从事渗透测试有一段时间了,很可能已经或即将参与红队行动。从命令通道的角度来看,Raphael Mudge为Cobalt Strike所做的工作使其成为团队协作的理想平台。与使用Linux “screen"配合PowerShell Empire和/或Metasploit等传统方法不同,Cobalt Strike允许建立操作攻击基础设施,进一步促进真实的威胁模拟可能性。

社区中的Black Hills朋友(Lee Kagan)贡献了一篇优秀的博客文章,详细介绍了如何使用威胁模拟配置文件设置Cobalt Strike,可在https://www.blackhillsinfosec.com/build-c2-infrastructure-digital-ocean-part-1/找到。(他承诺第二部分即将发布。)

作为该文章的一部分,它包含一个指向shell脚本的链接,该脚本自动化了部分设置过程,从而创建适当的Cobalt Strike配置文件。这可以从@KillSwitch的GitHub仓库https://github.com/killswitch-GUI/CobaltStrike-ToolKit/blob/master/HTTPsC2DoneRight.sh找到。

在最近的一些红队活动中,我利用了上述所有信息,配合一些精美的自定义域名和我自己独特的DNS名称服务器基础设施,所有这些都在Digital Ocean的虚拟机中运行。这使我能够创建一个操作基础设施,可以通过适当"成熟"的域名正确提供DNS、HTTP或HTTPS命令通道,并完全模拟类似亚马逊的Web流量。所有这些都使用IP地址不易追溯到我自己的虚拟系统。

我对此感到相当满意,并开始我的冒险,向客户网络投递C2有效载荷。在这种情况下,客户实际上很乐意为运行一些东西,从而消除了测试中的社会工程学方面。我的自然倾向是转向PowerShell和/或可执行内容,尽管我需要意识到端点保护解决方案的存在。

一些使用可执行内容的初步尝试显示,赛门铁克端点保护正在起作用,某些东西会在端点上触发签名。赛门铁克(和其他厂商)随着时间的推移在功能集上发生了一些有趣的变化,其中一些有效,一些则不太有效。我确实保持了非企业消费者版赛门铁克的订阅,因此我进入了一段时间的研究模式。

就赛门铁克端点保护功能而言,我在渗透测试过程中主要遇到以下障碍:

  • 端点/基于主机的入侵防御(HIPS)
  • 对磁盘上可执行内容的基于签名的保护
  • 似乎在进程创建管道期间利用应用程序兼容性工具包(ACT)填充程序的基于签名的保护
  • 基于内存的shellcode检测

鉴于这些知识,以及正确威胁模拟的目标,我决定用Cobalt Strike设置三种不同的场景,对赛门铁克端点保护响应进行一些高级测试。在这些场景中,我故意避免了DLL/EXE内容和任何TLS通道。我想专注于防御的HIPS和基于内存的检测功能。

  1. Cobalt Strike团队服务器,没有自定义HTTP/HTTPS配置文件,使用HTTP在端口80上设置监听器。
  2. Cobalt Strike团队服务器,使用由HTTPSC2DoneRight.sh脚本生成的亚马逊Web服务器配置文件,并使用HTTP监听器。
  3. Cobalt Strike团队服务器,使用自定义版本的亚马逊HTTP监听器配置文件。

我用于此测试的赛门铁克软件版本在以下屏幕截图中显示。是的,它截至今天已完全更新。

上述所有场景的有效载荷都是作为PowerShell命令从Cobalt Strike生成的,并粘贴到测试系统的命令shell中。Cobalt Strike可以生成基于32位的shellcode或基于64位的shellcode。

32位有效载荷生成IPS警报

第一个发现是,无论服务器端监听器配置如何,32位有效载荷总是会生成IPS警报,并在任何流量到达服务器之前被阻止。上面显示了一个示例警报。

64位有效载荷成功!

在64位有效载荷的情况下,在以上两个用例中成功建立了到Cobalt Strike团队服务器的命令通道会话:

  • 完全没有特定/自定义配置文件的HTTP监听器
  • 高度自定义配置文件的HTTP监听器

最奇怪的情况是第二个场景,其中使用了HTTPSC2DoneRight.sh脚本来生成类似亚马逊的配置文件。在这种情况下,使用64位有效载荷,我观察到第二阶段的有效载荷二进制文件传递得很好。在那之后是初始的HTTP GET请求。上面的类似亚马逊脚本生成如下GET请求。

1
GET /s/ref=nb_sb_noss_1/167-3294888-0262949/field-keywords=books

完全奇怪的是,回到Cobalt Strike的C2通道没有建立,而且客户端工作站上绝对没有恶意活动的输出或反馈。

我决定使用数据包嗅探器,并注意到第二阶段有效载荷传递的观察结果,然后看到当客户端尝试上述GET请求时,连接请求立即被TCP RESET拆除。

客户端工作站的四次单独重试,每次重试之间等待五秒

Cobalt Strike团队服务器上"amazon.Profile"文件的摘录

然后我决定在团队服务器上为相同的配置文件使用嗅探器,但在没有安装赛门铁克端点保护的客户端系统上。

果然,如下面Wireshark的屏幕截图所示,流量按预期顺利通过。

从未安装赛门铁克的系统捕获的C2通道GET请求

我变得非常清楚,赛门铁克HIPS在TCP堆栈尝试传输上述GET请求时阻止并重置TCP连接,这一定是为匹配脚本化亚马逊配置文件而编写的特定签名。

极其轻微修改的配置文件

自然,我决定对团队服务器配置文件进行一个小更改,将GET请求中的原始数字序列全部替换为8。请注意,这是一个非常小的更改,甚至不会绕过构造良好的正则表达式和/或具有多个匹配条件的IPS签名。我没有为此测试更改任何其他参数。其他可能暴露的参数包括主机头,当然还有一些固定的cookie值。

结果?是的,你猜对了,建立了一个愉快的C2会话。

已建立的C2会话

总之,虽然我认为端点保护套件总体上正在变得更好,但对于自定义恶意软件活动仍然有很多工作要做。在执行这项测试工作时,我推测在赛门铁克端点保护环境中:

  • 使用典型注入技术传递到内存中的64位shellcode仍然有很好的成功机会。
  • HIPS功能似乎完全不会检查第二阶段shellcode的传递。
  • 针对广泛发布的渗透测试人员威胁建模技术编写特定的HIPS签名似乎相当武断,而且不是有效的防御。
  • 不通知最终用户潜在的恶意活动是一种"假阴性”。坦率地说,没有比不知道更糟的了。

这里给渗透测试人员学到的教训是不要陷入尝试按下"简单按钮"的陷阱。我知道我们经常急于完成事情,但使用互联网上的现成脚本最终会以某种形式被阻止。即使现成脚本是善意的威胁建模,情况显然也是如此。始终审查和验证你将要做什么!祝大家狩猎愉快。

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