渗透基础 —— 活动目录信息的获取
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 进行数据查询
测试环境如下图
前提:我们能够访问到域控制器(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 指定要查询的根节点
这条命令会显示所能查询到的所有信息,如下图
接下来加入搜索条件,对结果进行分类
(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))"
这条命令会输出所有域用户的所有属性,如下图
为了便于统计名称,可以选择只列出 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
结果输出如下图
(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
结果输出如下图
(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
结果输出如下图
2.Windows 系统通过 PowerView 进行数据查询
测试环境如下图
前提:我们能够访问到域控制器(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
结果输出如下图
(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
结果输出如下图
(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
结果输出如下图
0x04 域内获取活动目录信息的方法
前提是已经获得了域内一台主机的权限
测试环境如下图
原理:通过 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/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
结果输出如下图
查询指定用户的所有信息,命令如下:
QueryADObject.exe Current "(&(objectClass=user)(objectCategory=person)(name=testa))" AllData
结果输出如下图
(2) 查询计算机
列出所有计算机账户,只显示简要的名称信息,命令如下:
QueryADObject.exe Current "(&(objectCategory=computer)(objectClass=computer))" ShortData
结果输出如下图
查询域控制器的详细信息,需要知道 ADS path 为 "OU=Domain Controllers,DC=test,DC=com"
,命令如下:
QueryADObject.exe "OU=Domain Controllers,DC=test,DC=com" "(&(objectCategory=computer)(objectClass=computer))" AllData
结果输出如下图
(3) 查询组
列出所有组,只显示简要的名称信息,命令如下:
QueryADObject.exe Current "(&(objectCategory=group))" ShortData
列出管理员组的详细信息,命令如下:
QueryADObject.exe Current "(&(objectCategory=group)(name=Domain Admins))" Alldata
结果输出如下图
(4) 查询 OU
列出所有 OU,只显示简要的名称信息,命令如下:
QueryADObject.exe Current "(&(objectCategory=organizationalUnit))" ShortData
结果输出如下图
0x05 小结
本文以获取活动目录中所有用户、所有计算机和所有组为例,分别介绍了从域外和域内获取信息的方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论