导语:引言 我一直是Ebowla项目的忠实粉丝,通过该项目,我发现无论是在标准渗透测试还是在红队的运作过程中,能够自动生成密钥的Payload都是非常有价值的。使用环境密钥不仅有助于实现沙箱逃逸、增加终端安全产品的检测难度,同时还能够降低事
引言
我一直是Ebowla项目的忠实粉丝,通过该项目,我发现无论是在标准渗透测试还是在红队的运作过程中,能够自动生成密钥的Payload都是非常有价值的。使用环境密钥不仅有助于实现沙箱逃逸、增加终端安全产品的检测难度,同时还能够降低事件响应的反应速度。实际上,能够同时对上述所有的防御措施产生影响的技术是非常少见的。
我通常使用脚本语言(如PowerShell/VBS/JS)作为钓鱼的初始执行向量,或用于实现持久性访问。我曾经沉迷于GoGreen,因为它结合了环境密钥功能,可以通过该功能为脚本语言提供保护。在这篇文章中,我们不仅会为读者介绍密钥生成技术的优缺点,还会演示如何通过整合其他密钥生产技术来进一步改进payload。
之前的工作
如上所述,Ebowla不仅是具有密钥生成功能的payload,同时也是Josh Pitt在研究这项技术过程中的重大成果。在继续阅读本文之前,请读者首先查阅Josh Pitt提供的幻灯片以及他演讲材料,因为这些材料是理解本文的基础。
另外,也可以浏览@Killswitch_GUI推荐的关于HTTP密钥技术的文章。
环境密钥综述
首先,为什么环境密钥功能如此强大?站在更高的层面来看,是因为该技术能够用预期存在于目标机器上的一系列变量作为密钥来加密“恶意payload”(例如CACTUSTORCH)。这些变量可以是你期望的文件路径,也许你认为Photoshop可能安装在“C:Program files 86AdobePhotoshop CS6”。 或者,这些密钥也可以是预期的用户名、系统架构和域名:“jdoeamd64contoso.com”。
实际上,在末级payload中并没有包含这些变量的值,也就是说,payload中不会含有相应的解密密钥。到达目标系统后,它会搜索系统上的所有文件路径,访问环境变量,然后尝试将两者结合起来作为密钥来解密末级payload,如果解密成功的话,就会执行末级payload。再次重申,如果还没搞清楚的话,或者想了解更多信息,请参阅前面推荐的阅读材料。
基于GoGreen的环境密钥技术
GoGreen采用了Ebowla的许多功能,并将其应用于PowerShell(v2 +)、JScript或VBScript。
为了实现环境密钥技术,payload会从一个起始目录(如C:Program Files)开始爬取/遍历目录树,并将找到的文件路径全部收集起来。接下来,它会读取代码中指定的所有环境变量(可以通过配置文件指定),并创建所有可能的组合(而不是排列)。然后执行以下步骤:
1. 循环遍历所有文件路径
2. 对于每个文件路径,循环遍历环境变量的每个组合
3. 使用以下方式构建密钥:sha512([文件路径] [环境变量组合])
4. 将上面的sha512哈希值的前32个字符作为密钥,尝试是否能够正确解密
5. 如果出错,或(解密后的)sha512与payload哈希值不一致,则尝试下一个密钥
下面展示的是GoGreen的示例配置文件。根据这个配置,它会从C:Program Files (x86)处开始爬取文件路径,(这里考虑到性能问题)深度设为两层目录。实际的密钥是PathKey,所以最终能否在目标机器上计算出正确的密钥,关键是看目标机器上面是否安装了Office。此外,该配置虽然包括了根据列出的5个环境变量生成所有可能的组合,但是实际上仅使用了3个。
{ "Language": "jscript", "WSHAutoVersion": "Yes", "StartDir": "C:Program Files (x86)", "Depth": "2", "PathKey": "C:Program Files (x86)Microsoft Officeroot", "EnvVars": { "USERNAME": "jdoe", "COMPUTERNAME": "win7pc35", "USERDNSDOMAIN": "contoso", "PROCESSOR_ARCHITECTURE": "", "LOGONSERVER": "" }, "Payload": "", "PayloadPath": "/tmp/CACTUSTORCH.js", "MinusBytes": "3" }
使用环境密钥技术时需要考量的因素
如你所见,配置文件中的爬取深度只设置了2层。这样做的好处是,可以尽快收集所有的文件路径以进入尝试解密环节;但是,如果你根本不设定深度的话,它会直接抓取起始目录下的所有文件夹和文件,这样一来,可能的路径组合就会更少。当然,在实际部署的时候,你必须考虑并理解自身的需求。需要注意的是,环境变量和文件/文件夹路径越多,需要花费的时间就会越长,同时,CPU的使用率也会激增。
GoGreen的局限性
环境密钥技术与脚本语言一起使用时,其不足之处在于一旦环境密钥或目标系统被识别,就很容易解密并找到末级payload。显然,因为脚本语言是明文的(而不是编译的二进制文件),所以很容易通过修改GoGreen的输出来找到末级payload。
举例来说,假设在我的环境中发现了一个活跃的钓鱼攻击。经过一番努力后,我得到了payload,即HTA。在查看源代码之后,发现它正试图利用环境变量作为密钥完成解密,所以,我使用“eval”做了一个标记:
摘自GoGreen JScript输出,这里突出了显示“eval”语句
如果存在这些变量的话,就会针对解密后的payload执行"eval"语句。我们也可以编辑HTA中的JScript代码,用Wscript.Echo代替“eval”,并将其写入新的.js文件。最后,我们可以通过多种手段让这个脚本在所有目标终端用户机器上执行。如果预期的环境变量存在,这个脚本就会将末级payload输出到屏幕上。然后,我就得到shellcode或C2服务器地址了。
这种技术在绕过沙箱检测或终端安全产品方面,非常有价值,而且它还能影响事件响应速度。当然,如果使用Ebowla编译的二进制文件的话效果会更好,不过这样一来,这里就必须首先逆向二进制文件,然后使用正确的环境值对payload进行动态分析。
当然,作为一名职业渗透测试人员,如果蓝队的朋友在响应这类payload方面有不同的想法或方法的话,请告诉我一声!
通过HTTP密钥技术强化GoGreen
在我设法让自己的payload给事件响应者制造更大的困难的时候,想起了一篇关于HTTP密钥技术的博客文章。我注意到,在Veil 3.0中已经不再提供这种payload类型的Veil,但是,你仍然可以在不提供支持的Veil-Evasion版本中使用它。
HTTP密钥是这样一种技术,您可以在互联网上的某个地方托管一个网页,然后,payload会跟这个网页进行交互,计算HTML响应的哈希值,并将该哈希值用作解密payload的密钥。这样做的好处是,您可以完全控制这个解密密钥,并且可以将其删除,因为只要您愿意的话,可以随时更改页面的内容。下面是这个简单的例子,通过它们您会发现这种技术到底有多么强大:
创建一个网页,设置HTTP密钥,然后更改其内容。让payload继续检查并尝试解密。等待几个小时后,将网页切换回原来的内容,这样payload就能解密和执行您的低层payload了。
这只是一个可以进一步扩展的例子。 我们来看看GoGreen的工作原理。 我决定让GoGreen首先设置HTTP密钥技术代码,然后使用环境密钥技术隐蔽HTTP密钥技术代码。具体步骤如下:
GoGreen使用环境密钥(目录/环境变量)来解密和执行代码 解密的代码将处理HTTP密钥 新执行的代码将访问HttpKeyUrl对应的页面并计算该页面的哈希值 新执行的代码将使用这个哈希值来解密并执行payload
GoGreen流程图
这样做的好处是,乍一看payload是通过环境变量作为密钥来执行解密的,根本没有启动HTTP调用。对于PowerShell来说,这意味着这里没有使用“Net.WebClient”。
考虑到文本的哈希计算和加密操作的副作用、不同字符集以及其他因素(如不同语言),GoGreen会输出一个“tester”文件,用于验证HTTP密钥的设置是否正确。为了避免这些麻烦,建议使用一个简单的网页。即使是标准的Microsoft 403页面也行,这样更易于使用。
综合运用
下面,我们讲解如何综合运用上面的知识。假设我们已经为环境密钥配置了:Office文件夹路径,以及预期目标用户名“username”。此外,还通过配置文件让其抓取给定URL处的HTTP密钥,并在放弃和退出之前重试300次。关于GoGreen的更多信息,请参阅GitHub页面上的自述文件。 对于那些不想安装Golang的用户,也提供了Windows、Linux和Mac的二进制版本。
GoGreen示例配置和执行情况
GoGreen将生成所需的所有密钥和代码,同时还将访问配置中提供的站点并确定HTTP密钥。 如果您愿意的话,也可以使用GoGreen -httpkey <HttpKey>来指定一个自定义密钥。最后将输出payload文件和一个HTTP密钥“tester”文件。 我建议使用HTTP密钥页面来运行tester文件,以确保payload格式生成相同的密钥。
运行HTTP密钥tester文件以确保密钥/哈希算法能够正常工作。
payload文件现在准备好了,接下来就可以部署到您的目标机器上面了!
总结
我认为带有密钥生成功能的payload对更有利于主动性进攻活动。如果使用脚本语言来获得持久性的话,那么很容易被蓝队发现,所以这种方式风险很大。
虽然这些密钥生成技术并非无法识别,但它们无疑延长了您停留在网络中的时间,同时也为您的攻击活动和工具提供了相应的保护。另一方面,对于蓝队来说,这也意味着需要学习一些新东西,以便做好更加充分的准备。
支持密钥生成技术的payload是纵深入侵的一个新的关注焦点,如果与业内流行的混淆技术搭配使用的话,红队的基础设施就会变得更加强悍。