前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用ADSI接口和反射型DLL枚举活动目录

如何使用ADSI接口和反射型DLL枚举活动目录

作者头像
FB客服
发布2019-12-11 15:30:57
1.4K0
发布2019-12-11 15:30:57
举报
文章被收录于专栏:FreeBuf

写在前面的话

在这篇文章中,我们将告诉大家如何使用活动目录服务接口(ADSI)并结合C/C++来实现Cobalt Strike的活动目录枚举。现在很多环境下都会对PowerShell和.NET程序进行非常严格的监视,而本文所介绍的技术也许可以帮你们躲避这些机制的检测。

想象一下,你现在正在使用TIBER-EU、CBEST其他红队安全评估框架,最终成功渗透进了目标网络,并且使用Payload和C2信道成功绕过了目标网络的安全防护措施,那么接下来该怎么办呢?比如说,怎么确保我们的活动目录枚举工具不触发安全警报呢?

别着急,我们一起往下看!

C/C++

如果使用传统的PowerShell/C#的话,就可能需要将写好的脚本放置到目标设备的磁盘中,而这样就有可能被安全产品检测到。这里,我们可以选择使用assembly.load等方法直接将工具加载到内存中,而C/C++正好可以帮我们实现类似的功能。这里,我们可以使用反射方法来将已编译好的C/C++恶意程序注入到目标设备的内存之中,下面给出的是目前几种比较热门的方法:

1、DonutPE加载器 2、反射型DLL注入 3、Shellcode反射型DLL注入 (点击底部阅读原文查看)

活动目录服务接口(ADSI)

好了,我们回到正题上,也就是如何实现活动目录的枚举。我们希望在枚举AD信息的时候不会触发AMSI或者是不留下明显的事件日志(可以通过伪造事件日志的内容来实现),要与活动目录进行对接并枚举其对象属性,我们需要使用到活动目录服务接口(ADSI)。

活动目录接口(ADSI)介绍

ADSI,即活动目录服务接口(ActiveDirectoryServicesInterface),是Microsoft新推出的一项技术,它统一了许多底层服务的编程接口,程序员可以使用一致的对象技术来访问这些底层服务。ADSI把这些服务的公共部分提取出来,同时隔离出相异的部分,程序员可以用统一的接口访问底层服务的公共部分,并延伸到底层服务的专有部分。ADSI提供了一组COM接口,可以用来访问来自不同网络提供商的目录服务功能,独立软件供应商和开发人员可以使用ADSI对其产品和应用程序进行目录启用。

非常好,那么我们的重点就要放在如何通过C/C++来构建自己的活动目录枚举工具了。在这里,我们其实不需要自己去重复造轮子了,因为微软的GitHub库已经给我们提供了一份非常优秀的参考样例-QueryUsers,我们可以使用这个样例来开发我们自己的客户端了。

QueryUsers

QueryUsers:【点击底部阅读原文查看】

QueryUsers可以在活动目录域这个实现分区查询,并且可以指定过滤器匹配的用户对象,该工具使用了IDirectorySearch来实现搜索功能的执行。

在QueryUsers的帮助下,我们可以搜索特定用户或所有用户,并返回所有标识用户的所有属性。QueryUsers的工作机制如下:

1、ADSI是基于COM构建的,因此我们需要使用CoInitialize()函数在程序内初始化COM; 2、我们需要使用ADsOpenObject()对LDAProotDSE进行绑定,因此我们可以收集有关活动目录的信息,并使用返回的IADsCOM对象来获取defaultNamingContext信息; 3、获取到defaultNamingContext之后,我们可以再次使用ADsOpenObject()来对Domain容器进行绑定,它将返回IDirectorySearchCOM接口,而该接口可以用来对活动目录进行查询和搜索; 4、在调用FindUsers()函数时,它将基于函数参数和以下字符串构造一个LDAP过滤器-“(&(objectClass=user)(objectCategory=person)%s)”。如果我们为改程序提供以下搜索过滤器参数“(sAMAccountName=Administrator)”,那么我们的LDAP过滤器实则为(&(objectClass=user)(objectCategory=person) (sAMAccountName=Administrator))”; 5、使用ADS_SEARCHPREF_INFO结构体作为搜索参数的首选项; 6、执行IDirectorySearch对象中的ExecuteSearch()方法,该方法将根据我们的 LDAP 过滤器返回所有结果; 7、最后,使用GetFirstRow()、GetNextColumnName()、GetColumn()和 GetNextRow()方法遍历结果,并输出特定的用户属性;

集成到常用的C2框架&PoC

Cobalt Strike具有用于代码/DLL注入的多种功能选项,并且嵌入有功能非常强大的脚本语言支持,因此开发人员可以根据自己的需要来扩展Cobalt Strike的功能。

为了验证该技术的可行性,我们开发了一种基于ADSI和反射型DLL的活动目录枚举工具,该工具可以直接在Cobalt Strike中使用。我们的PoC工具名叫Recon-AD,该工具目前由其中反射型DLL以及对应的AggressorScript脚本构成。

其主要功能如下:

1、Recon-AD-Domain: 查询域信息(包括域名、GUID、站点名称、密码策略、域控列表等); 2、Recon-AD-Users: 查询用户对象和相应的属性; 3、Recon-AD-Groups: 查询组对象和相应的属性; 4、Recon-AD-Computers: 查询计算机对象和相应的属性; 5、Recon-AD-SPNs: 查询配置了服务主体名称(SPN)的用户对象并显示有用的属性; 6、Recon-AD-AllLocalGroups: 在计算机是上查询所有本地组和组成员; 7、Recon-AD-LocalGroups: 在计算机上查询特定的本地组和组成员(默认 Administrators 组);

广大研究人员可以自行从本项目的GitHub库中下载Recon-AD,并在Cobalt Strike中加载相应的脚本来完成自己的任务。

工具运行截图

使用Recon-AD-Domain显示本地机器的域信息:

使用Recon-AD-Groups Domain Admins命令枚举域管理员组的属性信息:

使用Recon-AD-User username命令输出指定用户的属性信息:

总结

在这篇文章中,我们较少了关于活动目录服务接口(ADSI)的相关内容,并描述了如何将其与C/C++以及Cobalt Strike结合来实现活动目录的枚举。

* 参考来源:outflank,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面的话
  • C/C++
  • 活动目录服务接口(ADSI)
    • 活动目录接口(ADSI)介绍
    • QueryUsers
    • 集成到常用的C2框架&PoC
    • 工具运行截图
    • 总结
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档