渗透基础——活动目录信息的获取
2019-12-17 11:32:33 Author: www.4hou.com(查看原文) 阅读量:228 收藏

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 小结

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


文章来源: https://www.4hou.com/technology/22095.html
如有侵权请联系:admin#unsafe.sh