9

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

 3 years ago
source link: https://3gstudent.github.io/3gstudent.github.io/%E6%B8%97%E9%80%8F%E5%9F%BA%E7%A1%80-%E6%B4%BB%E5%8A%A8%E7%9B%AE%E5%BD%95%E4%BF%A1%E6%81%AF%E7%9A%84%E8%8E%B7%E5%8F%96/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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


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


LEAVE A REPLY


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK