红队战术:使用ADSI和反射注入DLL 侦查Active Directory

文章写的很不错,就用谷歌翻译给翻译过来
https://outflank.nl/blog/2019/10/20/red-team-tactics-active-directory-recon-using-adsi-and-reflective-dlls/

在此博客文章中,我们将说明如何结合使用C / C ++和Active Directory服务接口(ADSI)从Cobalt Strike枚举Active Directory。在PowerShell和.NET受到严格监视的环境中,这可能有助于保持警惕。

假设您正在进行TIBER,CBEST或其他长期的红色团队评估,最终设法进入了目标网络。经过数小时的准备,终于获得了回报,您的有效载荷和C2通道绕过了目标的安全措施。如何在攻击的下一步(例如Active Directory侦查)中运行工具,而又不会在受感染主机上触发现代防御措施(例如AMSI或脚本块日志记录)

本博客文章的其余部分介绍了以下主题:

  • 为什么在某些情况下为什么要避免使用基于PowerShell和C#的工具。
  • 如何使用ADSI在C / C ++中实现Active Directory侦察工具(如PowerView和SharpView)的功能。
  • 如何使用反射性DLL将此功能嵌入到您最喜欢的C2框架/开发后工具包中。

再见PowerShell for AD侦察

很多优秀的工具可以在Active Directory环境中执行侦察。 长期以来,用PowerShell编写的工具一直是标准工具(最著名的PowerView),但是随着PowerShell 5的引入,引入了新的检测光学系统(翻译问题)。 反恶意软件扫描接口(AMSI)和脚本块日志记录吸引了蓝团队,并且,如果正确实施,防御者现在终于可以检测恶意的PowerShell使用情况。 因此,我们不希望冒险通过简单地启动PowerShell脚本而花费大量时间来建立初始立足点-极有可能被检测到或至少记录了我们的操作。

即使绕过AMSI,我们仍然必须克服脚本块日志记录,这通常需要更改注册表,并且可以使用Sysmon之类的工具进行监视。 现在,在许多成熟的环境中,使用PowerShell进行攻击性行为并不是OPSEC安全的选择。
在这里插入图片描述

谁赢了基于.NET的战斗?

在PowerShell 5中为防御者引入了光学组件后,许多威胁参与者,渗透测试者和红色团队成员意识到他们需要远离PowerShell。许多PowerShell脚本已经使用了很多.Net / C#代码来完成繁重的工作,那么为什么不直接使用C#呢?

.NET反射库的另一个非常有趣的特性是对攻击者的保护,它是 Assembly.Load 方法。这种方法允许从内存中加载.NET程序集而无需接触磁盘。现在,我们可以将新的令人反感的C#工具打包到Byte数组中,并使用Load(Byte[])方法从内存中调用该工具。诸如Cobalt StrikeMetasploit之类的工具通过将.NET公共语言运行时(CLR)注入到生成的进程中来使用执行组装技术,并使用此方法在该进程中反射地加载和执行C#程序。

.NET的这些功能是过去几年中我们看到许多工具从PowerShell移植到C#的主要原因。对于此博客文章的Active Directory侦查用例,SharpView是从PowerShell到C#的此类移植的绝佳示例。

但是,Microsoft也注意到了这一转变,并且最近通过将反恶意软件扫描界面集成到最新版本的.NET (v4.8).中来做出了响应。现在,防御者还拥有通过AMSI通过在CLR调用之前扫描字节数组来检测C#恶意使用的方法。这对防御者很有用,但对攻击者却不是那么好。
绕过已经存在,尽管仅适用于最新的4.8版本的.NET,但C#/。NET的争夺战已经开始。防御者已经在尝试诸如CLR 挂钩和使用Windows事件跟踪(ETW)捕获.NET滥用等技术。很难预言,令人反感的.NET Tradecraft在未来几年将变得越来越复杂。
在这里插入图片描述

回到未来:C / C ++

那么,如何使用良好的旧C或C ++开发进攻性工具呢?您可能担心必须将已编译的工具放到磁盘上。使用PowerShell和C#,您可以将程序注入内存,而无需接触磁盘(例如,使用assembly.load方法)。也可以使用C / C ++开发的工具来实现吗?答案是肯定的:要以反射方式将已编译的C / C ++程序注入内存,您也有很多选择。我们当前最喜欢的一些是:

Active Directory Service Interfaces (ADSI)

让我们回到用例:Active Directory侦察。我们希望开始挖掘AD而不会触发AMSI或在受感染主机的事件日志中保留伪像。让我们看看是否可以使用C / C ++做到这一点,并且比使用PowerView和SharpView之类的工具保持更多的关注。要与Active Directory进行接口并枚举其对象和属性,我们可以使用Active Directory服务接口(ADSI)。但是,ADSI到底是什么?

“ Active Directory服务接口(ADSI)是一组COM接口,用于访问来自不同网络提供商的目录服务的功能。”

“独立软件供应商和最终用户开发人员可以使用ADSI对其产品和应用程序进行目录启用。”

听起来不错……让我们看看是否可以在C / C ++中构建自己的Active Directory枚举客户端。为此,我们可以阅读所有文档并编写一个新的客户端应用程序。但是,我们也可以看看Microsoft在此Git存储库中已经提供给我们的出色示例, 并使用这些示例开发我们自己的客户端(无需重新发明轮子)。让我们来看下面的示例: QueryUsers

“ QueryUsers示例向Active Directory域分区查询与指定过滤器匹配的用户对象。”
“该示例使用IDirectorySearch界面执行搜索。”
使用此代码,我们可以搜索特定用户(或所有用户),并返回所标识用户的所有属性。因此,这段代码如何概括地说:

  1. ADSI是基于COM构建的 ,因此我们需要使用CoInitialize()函数在客户端内初始化COM。

  2. 接下来,我们使用ADsOpenObject()绑定到 LDAP rootDSE,
    因此我们可以收集有关目录的信息,并使用返回的IADs COM对象获取 defaultNamingContext。

  3. 当拥有AD defaultNamingContext时,我们可以再次使用ADsOpenObject绑定到Domain容器,并使用它返回
    IDirectorySearch COM接口,该接口可用于查询/搜索Active Directory。

  4. 调用FindUsers函数时,它将 基于函数参数和以下字符串构造一个 LDAP语法过滤器: “(&(objectClass =
    user)(objectCategory = person)%s)”。 如果我们为该程序提供以下搜索过滤器作为参数:
    “(sAMAccountName = Administrator)”,则 我们的搜索过滤器将变为: “(&(objectClass
    = user)(objectCategory = person)(sAMAccountName = Administrator))”

  5. 使用ADS_SEARCHPREF_INFO结构设置搜索首选项。

  6. 现在,将执行IDirectorySearch对象中的ExecuteSearch方法,该方法应基于我们的LDAP过滤器返回所有结果。

  7. 最后,在使用GetFirstRow,GetNextColumnName,GetColumn和GetNextRow方法遍历结果时,将打印特定的用户属性。

有了对这段代码的相对很好的了解以及有关ADSI编程接口的一些知识之后,我们现在可以继续并用C / C ++构建我们自己的自定义枚举客户端。

集成你喜欢的C2框架

但是如何将这种用C / C ++编写的工具集成到您最喜欢的C2 /后渗透利用框架中呢?例如,Cobalt Strike是一个非常受欢迎的红队模拟对抗工具包,我们在评估中也经常使用很多工具。Cobalt Strike具有用于注入代码和DLL的多个选项,并具有功能强大的脚本语言,可用于扩展和修改Cobalt Strike客户端。例如, 如果你要在内存中执行C / C ++(反射)DLL,并且仍然能够为程序提供参数,则 bdllspawn是非常有用的功能。

对于Metasploit,请阅读有关反射式DLL注入的文档,或者,如果要反射性地执行用C / C ++开发的工具,请使用此Donut模块。

建立自己的C2框架?将您最喜欢的shellcode注入技术与Donut或sRDI结合使用,即可开始使用。您可能想看看pinjectra以获得一些注射技术方面的灵感。如果您担心您的注入调用被挂起,请阅读本系列中有关使用直接syscall进行脱钩的上一篇博客文章。

outflank 侦查-AD

作为概念验证,我们开发了一种基于ADSI和反射DLL的Active Directory侦察工具,可在Cobalt Strike中使用。该工具称为“ Recon-AD”,目前由七个Reflective DLL和相应的侵略者脚本组成。

该工具可在我们的Github页面上找到。

包括以下功能:

  • Recon-AD-Domain:枚举域信息(例如域名,GUID,站点名称,密码策略,DC列表)。
  • Recon-AD-Users:查询用户对象和相应的属性。
  • Recon-AD-Groups:查询组对象和相应的属性。
  • Recon-AD-Computers:查询计算机对象和相应的属性。
  • Recon-AD-SPN:查询配置了服务主体名称(SPN)的用户对象并显示有用的属性。
  • Recon-AD-AllLocalGroups:在计算机上查询所有本地组和组成员。
  • Recon-AD-LocalGroups:在计算机上查询特定的本地组和组成员(默认的Administrators组)。

以下屏幕截图显示了有关如何使用该工具的一些示例:

  • 在此处下载Recon-AD工具,然后在Cobalt Strike脚本管理器中加载Recon-AD脚本。
  • 要显示有关本地域的信息,请使用 Recon-AD-Domain 命令

在这里插入图片描述

  • 要列出Domain Admins组的属性,我们可以使用“ Recon-AD-Groups Domain Admins” 命令。
  • 在这里插入图片描述
    此外,还有一个命令使您可以枚举计算机对象,该命令列出所有启用SPN的用户帐户,并使用WinNT ADSI提供程序枚举远程计算机上的本地组。我们计划很快发布更多有用的枚举选项。

侦测

存在使用高级内存扫描技术和API挂钩检测内存中反射性注入的DLL的选项。这是一个好的EDR解决方案在一定程度上应具有的能力。如果您偶然发现使用EDR之类的高级检测软件的客户端,则Cobalt Strike的可延展性配置文件中有一些配置选项可帮助 逃避内存检测。另外,请确保查看本系列中有关脱钩的先前博客文章。

防御者进入ADSI的光学功能是有限的。ADSI的事件跟踪确实存在,但我们认为可能很难大规模收集和监视。

当然,也可以在域级别检测Active Directory侦察,但这可能是将来博客文章的主题。在此博客文章中,我们重点介绍了对原始主机的回避检测。

结论

新的监视和防御光学系统正在Microsoft操作系统和安全产品中应用。这应有助于防御者检测其环境中的恶意行为。尽管PowerShell长期以来一直很受后期开发的欢迎,但现在攻击者正试图避免这种情况。.NET是当前攻击性贸易手段的炒作,但是Microsoft通过添加用于捕获该平台上恶意行为的光学器件,正在迅速开发新的措施。时间将证明攻击者能够使用.NET平台进行攻击性操作多长时间。

在本博客中,我们介绍了Active Directory服务接口(ADSI)编程接口以及如何将其与C / C ++一起使用来枚举Cobalt Strike客户端控制台中的Active Directory。

该示例应为现代商人提供一些有关脱离PowerShell和.NET的见解,并帮助您不受现代环境中应用的最新监视和防御技术的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值