文章写的很不错,就用谷歌翻译给翻译过来
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或脚本块日志记录)
本博客文章的其余部分介绍了以下主题:
很多优秀的工具可以在Active Directory环境中执行侦察。 长期以来,用PowerShell编写的工具一直是标准工具(最著名的PowerView),但是随着PowerShell 5的引入,引入了新的检测光学系统(翻译问题)。 反恶意软件扫描接口(AMSI)和脚本块日志记录吸引了蓝团队,并且,如果正确实施,防御者现在终于可以检测恶意的PowerShell使用情况。 因此,我们不希望冒险通过简单地启动PowerShell脚本而花费大量时间来建立初始立足点-极有可能被检测到或至少记录了我们的操作。
即使绕过AMSI,我们仍然必须克服脚本块日志记录,这通常需要更改注册表,并且可以使用Sysmon之类的工具进行监视。 现在,在许多成熟的环境中,使用PowerShell进行攻击性行为并不是OPSEC安全的选择。
在PowerShell 5中为防御者引入了光学组件后,许多威胁参与者,渗透测试者和红色团队成员意识到他们需要远离PowerShell。许多PowerShell脚本已经使用了很多.Net / C#代码来完成繁重的工作,那么为什么不直接使用C#呢?
.NET反射库的另一个非常有趣的特性是对攻击者的保护,它是 Assembly.Load 方法。这种方法允许从内存中加载.NET程序集而无需接触磁盘。现在,我们可以将新的令人反感的C#工具打包到Byte数组中,并使用Load(Byte[])方法从内存中调用该工具。诸如Cobalt Strike和Metasploit之类的工具通过将.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 ++开发进攻性工具呢?您可能担心必须将已编译的工具放到磁盘上。使用PowerShell和C#,您可以将程序注入内存,而无需接触磁盘(例如,使用assembly.load方法)。也可以使用C / C ++开发的工具来实现吗?答案是肯定的:要以反射方式将已编译的C / C ++程序注入内存,您也有很多选择。我们当前最喜欢的一些是:
让我们回到用例: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界面执行搜索。”
使用此代码,我们可以搜索特定用户(或所有用户),并返回所标识用户的所有属性。因此,这段代码如何概括地说:
ADSI是基于COM构建的 ,因此我们需要使用CoInitialize()函数在客户端内初始化COM。
接下来,我们使用ADsOpenObject()绑定到 LDAP rootDSE,
因此我们可以收集有关目录的信息,并使用返回的IADs COM对象获取 defaultNamingContext。
当拥有AD defaultNamingContext时,我们可以再次使用ADsOpenObject绑定到Domain容器,并使用它返回
IDirectorySearch COM接口,该接口可用于查询/搜索Active Directory。
调用FindUsers函数时,它将 基于函数参数和以下字符串构造一个 LDAP语法过滤器: “(&(objectClass =
user)(objectCategory = person)%s)”。 如果我们为该程序提供以下搜索过滤器作为参数:
“(sAMAccountName = Administrator)”,则 我们的搜索过滤器将变为: “(&(objectClass
= user)(objectCategory = person)(sAMAccountName = Administrator))”
使用ADS_SEARCHPREF_INFO结构设置搜索首选项。
现在,将执行IDirectorySearch对象中的ExecuteSearch方法,该方法应基于我们的LDAP过滤器返回所有结果。
最后,在使用GetFirstRow,GetNextColumnName,GetColumn和GetNextRow方法遍历结果时,将打印特定的用户属性。
有了对这段代码的相对很好的了解以及有关ADSI编程接口的一些知识之后,我们现在可以继续并用C / C ++构建我们自己的自定义枚举客户端。
但是如何将这种用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进行脱钩的上一篇博客文章。
作为概念验证,我们开发了一种基于ADSI和反射DLL的Active Directory侦察工具,可在Cobalt Strike中使用。该工具称为“ Recon-AD”,目前由七个Reflective DLL和相应的侵略者脚本组成。
该工具可在我们的Github页面上找到。
包括以下功能:
以下屏幕截图显示了有关如何使用该工具的一些示例:
存在使用高级内存扫描技术和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的见解,并帮助您不受现代环境中应用的最新监视和防御技术的影响。