渗透基础 —— 活动目录信息的获取

发布于 2024-08-17 08:51:12 字数 9460 浏览 39 评论 0

0x00 前言

在域渗透中,活动目录信息的获取必不可少

本文将要以获取活动目录中所有用户、所有计算机和所有组为例,介绍常用的信息获取方法

0x01 简介

本文将要介绍以下内容:

  • 域外获取活动目录信息的方法
  • 域内获取活动目录信息的方法
  • 使用 C++调用 ADSI 接口获取信息的方法

0x02 基础知识

域环境使用 directory database(目录数据库)来存储用户、计算机账户和组等对象

使用 LDAP(Lightweight Directory Access Protocol)(轻量目录访问协议)来查询和更新目录数据库

常用缩写词

  • DN:Distinguished Name
  • CN:Common Name
  • OU:Organizational Unit
  • DC:Domain Controller

其中 DN 有三个属性,分别是 CN、OU 和 DC

简单理解:

域控制器默认会开启端口 389,用作 LDAP 服务

0x03 域外获取活动目录信息的方法

1.Kali 系统通过 ldapsearch 进行数据查询

测试环境如下图

Alt text

前提:我们能够访问到域控制器(DC) 的 389 端口,并且我们至少已经获得了域内一个普通用户的口令

这个测试环境中,我们获得了域内普通用户 testa 的口令为 DomainUser123!

连接命令如下:

ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com"

参数说明:

  • -x 进行简单认证
  • -H 服务器地址
  • -D 用来绑定服务器的 DN
  • -w 绑定 DN 的密码
  • -b 指定要查询的根节点

这条命令会显示所能查询到的所有信息,如下图

Alt text

接下来加入搜索条件,对结果进行分类

(1) 查询所有域用户

加入搜索条件: "(&(objectClass=user)(objectCategory=person))"

完整命令如下:

ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" -b "DC=test,DC=com" "(&(objectClass=user)(objectCategory=person))"

这条命令会输出所有域用户的所有属性,如下图

Alt text

为了便于统计名称,可以选择只列出 CN(Common Name),并且使用 grep 命令对输出进行过滤

命令如下:

ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" -b "DC=test,DC=com" "(&(objectClass=user)(objectCategory=person))" CN | grep cn

结果输出如下图

Alt text

(2) 查询所有计算机

加入搜索条件: "(&(objectCategory=computer)(objectClass=computer))"

命令如下:

ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" -b "DC=test,DC=com" "(&(objectCategory=computer)(objectClass=computer))" CN | grep cn

结果输出如下图

Alt text

(3) 查询所有组

加入搜索条件: "(&(objectCategory=group))"

命令如下:

ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" -b "DC=test,DC=com" "(&(objectCategory=group))" CN | grep cn

结果输出如下图

Alt text

2.Windows 系统通过 PowerView 进行数据查询

测试环境如下图

Alt text

前提:我们能够访问到域控制器(DC) 的 389 端口,并且我们至少已经获得了域内一个普通用户的口令

这个测试环境中,我们获得了域内普通用户 testa 的口令为 DomainUser123!

PowerView 的地址:

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

(1) 查询所有域用户

这里需要使用凭据信息,所以完整的命令如下:

$uname="testa"                                                      
$pwd=ConvertTo-SecureString "DomainUser123!" -AsPlainText –Force                   
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)        
Get-NetUser -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred

为了便于统计名称,可以选择只列出 name 项,完整命令如下:

$uname="testa"                                                      
$pwd=ConvertTo-SecureString "DomainUser123!" -AsPlainText –Force                   
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)        
Get-NetUser -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred | fl name

结果输出如下图

Alt text

(2) 查询所有计算机

$uname="testa"                                                      
$pwd=ConvertTo-SecureString "DomainUser123!" -AsPlainText –Force                   
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)        
Get-NetComputer -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred | fl name

结果输出如下图

Alt text

(3) 查询所有组

$uname="testa"                                                      
$pwd=ConvertTo-SecureString "DomainUser123!" -AsPlainText –Force                   
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)        
Get-NetGroup -Domain test.com -DomainController 192.168.1.1 -ADSpath "LDAP://DC=test,DC=com" -Credential $cred | fl name

结果输出如下图

Alt text

0x04 域内获取活动目录信息的方法

前提是已经获得了域内一台主机的权限

测试环境如下图

Alt text

原理:通过 ADSI(ActiveDirectoryServicesInterface)(活动目录服务接口)进行 LDAP 查询,获得结果

1.使用 Powershell 实现

参照 PowerView,地址:

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

2.使用 C#实现

参照 SharpView,地址:

https://github.com/tevora-threat/SharpView

3.使用 C++实现

参考地址:

https://github.com/microsoft/Windows-classic-samples/tree/master/Samples/Win7Samples/netds/adsi/activedir/QueryUsers/vc

https://github.com/outflanknl/Recon-AD

微软的代码是 exe 的格式,只介绍了 QueryUser 的方法,但支持查询条件(筛选指定用户)和显示简要信息(只输出名称,便于统计)

Recon-AD 的代码是 dll 的格式,包含多个功能,但默认只显示详细信息

于是我将两者的代码融合,代码支持以下功能:

  • exe 的格式
  • 包含多个功能,支持查询用户、计算机和组等
  • 支持查询条件和显示简要信息

代码已上传至 github,地址如下:

https://github.com/3gstudent/Homework-of-C-Language/blob/master/QueryADObject.cpp

代码可指定 ADS path 和搜索条件,用法如下:

(1) 查询域用户

列出所有域用户,只显示简要的名称信息,命令如下:

QueryADObject.exe Current "(&(objectClass=user)(objectCategory=person))" ShortData

结果输出如下图

Alt text

查询指定用户的所有信息,命令如下:

QueryADObject.exe Current "(&(objectClass=user)(objectCategory=person)(name=testa))" AllData

结果输出如下图

Alt text

(2) 查询计算机

列出所有计算机账户,只显示简要的名称信息,命令如下:

QueryADObject.exe Current "(&(objectCategory=computer)(objectClass=computer))" ShortData

结果输出如下图

Alt text

查询域控制器的详细信息,需要知道 ADS path 为 "OU=Domain Controllers,DC=test,DC=com" ,命令如下:

QueryADObject.exe "OU=Domain Controllers,DC=test,DC=com" "(&(objectCategory=computer)(objectClass=computer))" AllData

结果输出如下图

Alt text

(3) 查询组

列出所有组,只显示简要的名称信息,命令如下:

QueryADObject.exe Current "(&(objectCategory=group))" ShortData

列出管理员组的详细信息,命令如下:

QueryADObject.exe Current "(&(objectCategory=group)(name=Domain Admins))" Alldata

结果输出如下图

Alt text

(4) 查询 OU

列出所有 OU,只显示简要的名称信息,命令如下:

QueryADObject.exe Current "(&(objectCategory=organizationalUnit))" ShortData

结果输出如下图

Alt text

0x05 小结

本文以获取活动目录中所有用户、所有计算机和所有组为例,分别介绍了从域外和域内获取信息的方法。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

嘿哥们儿

暂无简介

文章
评论
27 人气
更多

推荐作者

Mr.HU

文章 0 评论 0

疯到世界奔溃

文章 0 评论 0

隔纱相望

文章 0 评论 0

萌无敌

文章 0 评论 0

梦幻的味道

文章 0 评论 0

自在安然

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文