红队笔记 - PowerView进行AD列举

2021-10-12 11:38:42 浏览数 (1)

虽然下面给出了对我来说最有用的命令,但这仅仅是PowerView能做的事情的一个表面。

PowerView可以在这里使用

代码语言:javascript复制
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
代码语言:javascript复制
# Get all users in the current domain
Get-DomainUser | select -ExpandProperty cn

# Get all computers in the current domain
Get-DomainComputer

# Get all domains in current forest
Get-ForestDomain

# Get domain/forest trusts
Get-DomainTrust
Get-ForestTrust

# Get information for the DA group
Get-DomainGroup "Domain Admins"

# Find members of the DA group
Get-DomainGroupMember "Domain Admins" | select -ExpandProperty membername

# Find interesting shares in the domain, ignore default shares
Find-DomainShare -ExcludeStandard -ExcludePrint -ExcludeIPC

# Get OUs for current domain
Get-DomainOU -FullData

# Get computers in an OU
# %{} is a looping statement
Get-DomainOU -name Servers | %{ Get-DomainComputer -SearchBase $_.distinguishedname } | select dnshostname

# Get GPOs applied to a specific OU
Get-DomainOU *WS* | select gplink
Get-DomainGPO -Name "{3E04167E-C2B6-4A9A-8FB7-C811158DC97C}"

# Get Restricted Groups set via GPOs, look for interesting group memberships forced via domain
Get-DomainGPOLocalGroup -ResolveMembersToSIDs | select GPODisplayName, GroupName, GroupMemberOf, GroupMembers

# Find principals that can create new GPOs in the domain
Get-DomainObjectAcl -SearchBase "CN=Policies,CN=System,DC=targetdomain,DC=com" -ResolveGUIDs | ?{ $_.ObjectAceType -eq "Group-Policy-Container" } | select ObjectDN, ActiveDirectoryRights, SecurityIdentifier

# Find principals that can link GPOs to OUs
Get-DomainOU | Get-DomainObjectAcl -ResolveGUIDs | ? { $_.ObjectAceType -eq "GP-Link" -and $_.ActiveDirectoryRights -match "WriteProperty" } | select ObjectDN, SecurityIdentifier

# Get incoming ACL for a specific object
Get-DomainObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | Select IdentityReference,ActiveDirectoryRights

# Find interesting ACLs for the entire domain, show in a readable (left-to-right) format
Find-InterestingDomainAcl | select identityreferencename,activedirectoryrights,acetype,objectdn | ?{$_.IdentityReferenceName -NotContains "DnsAdmins"} | ft

# Get interesting outgoing ACLs for a specific user or group
# ?{} is a filter statement
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReference -match "Domain Admins"} | select ObjectDN,ActiveDirectoryRights

应用锁定器

识别本地AppLocker策略。寻找豁免的二进制文件或绕过的路径。

代码语言:javascript复制
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

根据相应组策略的区分名称,获取远程AppLocker策略(例如,你可以在BloodHound中识别这一点)

代码语言:javascript复制
Get-AppLockerPolicy -Domain -LDAP "LDAP://targetdomain.com/CN={16641EA1-8DD3-4B33-A17F-9F259805B8FF},CN=Policies,CN=System,DC=targetdomain,DC=com"  | select -expandproperty RuleCollections

其他绕过技术:

  • 如果只允许 (Microsoft-) 签名的二进制文件,请使用LOLBAS。
  • 如果C:Windows允许二进制文件(默认行为),请尝试将二进制文件放到C:WindowsTemp或C:WindowsTasks。如果此目录树中没有可写的子目录但存在可写的文件,请将文件写入备用数据流(例如 JScript 脚本)并从那里执行。
  • 将您的二进制文件包装在一个 DLL 文件中,并在rundll32未强制执行 DLL 时执行它们以绕过可执行规则(默认行为)。
  • 如果允许像 Python 这样的二进制文件,请使用它们。如果这不起作用,请尝试其他技术,例如将 JScript 包装在 HTA 文件中或运行带有wmic.
  • 否则提升你的特权。AppLocker 规则通常不会对(本地)管理用户强制执行。

PowerShell受限语言模式

有时你可能会发现自己处于一个强制执行受限语言模式(CLM)的PowerShell会话中。当你在一个执行AppLocker的环境中操作时,通常会出现这种情况(见上文)。

你可以通过轮询以下变量来确定你处于受限语言模式,以获得当前的语言模式。对于不受限制的会话,它将显示FullLanguage,而对于CLM,则显示ConstrainedLanguage。

代码语言:javascript复制
$ExecutionContext.SessionState.LanguageMode

由于PowerShell的关键功能被封锁,CLM的限制将阻止你的许多利用尝试。绕过CLM与绕过上面讨论的AppLocker基本相同。另一种绕过CLM的方法是绕过AppLocker来执行执行自定义PowerShell运行空间的二进制文件(例如Stracciatella),这将是不受约束的。

另一个快速和肮脏的绕过方法是使用内联函数,这有时是有效的。例如,如果whoami被封锁了,可以尝试以下方法。

代码语言:javascript复制
&{whoami}

LAPS

本地管理密码解决方案(LAPS)是微软在活动目录域范围内管理本地管理密码的产品。它经常为注册的机器的本地管理用户生成强大而独特的密码。这个密码属性和它的过期时间然后被写入活动目录中的计算机对象。默认情况下,对LAPS密码的读取权限只授予域管理员,但经常被委托给特殊组。

读取LAPSPassword的权限授予用户或组读取ms-Mcs-AdmPwd属性的能力,从而获得本地管理员密码。你可以使用例如BloodHound或PowerView来寻找这个属性。如果我们知道我们对一台机器有正确的ReadLAPSPassword权限,我们也可以使用PowerView来读取密码。

代码语言:javascript复制
Get-DomainComputer -identity LAPS-COMPUTER -properties ms-Mcs-AdmPwd

我们还可以使用LAPSToolkit.ps1来识别域中哪些机器使用LAPS,以及哪些负责人被允许读取LAPS密码。如果我们在这个组中,我们也可以用这个工具获得当前的LAPS密码。

代码语言:javascript复制
# Get computers running LAPS, along with their passwords if we're allowed to read those
Get-LAPSComputers

# Get groups allowed to read LAPS passwords
Find-LAPSDelegatedGroups

续集

红队笔记 - PowerShell AMSI Bypass

0 人点赞