{"id":119,"date":"2021-02-12T16:35:02","date_gmt":"2021-02-12T15:35:02","guid":{"rendered":"http:\/\/theredwindows.net\/?p=119"},"modified":"2021-07-30T19:20:15","modified_gmt":"2021-07-30T17:20:15","slug":"persistance-avec-les-acls","status":"publish","type":"post","link":"https:\/\/theredwindows.net\/index.php\/2021\/02\/12\/persistance-avec-les-acls\/","title":{"rendered":"Persistance avec les ACLs"},"content":{"rendered":"\n<p>Cet article traitera d\u2019une m\u00e9thode exotique de persistance en Active Directory qui utilise la DACL. Si cette derni\u00e8re et son fonctionnement vous sont totalement inconnus je vous recommande de lire la partie sur l\u2019exploitation la DACL. Les exemples qui seront fait utiliseront <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/PowerShellMafia\/PowerSploit\/blob\/dev\/Recon\/PowerView.ps1\" data-type=\"URL\" data-id=\"https:\/\/github.com\/PowerShellMafia\/PowerSploit\/blob\/dev\/Recon\/PowerView.ps1\" target=\"_blank\">PowerView<\/a> et un usage relativement avanc\u00e9 de PowerShell.<\/p>\n\n\n\n<h3>Discr\u00e9tion<\/h3>\n\n\n\n<p>Avant d\u2019\u00e9tudier les diff\u00e9rentes techniques, il est n\u00e9cessaire de comprendre comment il est possible de cacher un objet dans un Active Directory. Que se passerait-il si une fois un compte \u00e0 privil\u00e8ge obtenu, on d\u00e9cide d\u2019ajouter une ACE interdisant \u00e0 tout le monde de lire les enfants de l\u2019OU parente ? On cacherait donc notre utilisateur, des autres objets qui essayeraient de lire les objets dans notre OU. Ce qui peut \u00eatre fait 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=\"\">$User = Get-DomainUser PersistenceUser\n$UserOU = $User.distinguishedname.SubString($User.distinguishedname.IndexOf(\"OU=\"))\n$RawObject = Get-DomainOU -Raw -Identity $UserOU\n$TargetObject = $RawObject.GetDirectoryEntry()\n\n$ACE = New-ADObjectAccessControlEntry -InheritanceType All -AccessControlType Deny -PrincipalIdentity \"S-1-1-0\" -Right ListChildren # SID par defaut d\u00e9signant everyone\n\n$TargetObject.PSBase.ObjectSecurity.AddAccessRule($ACE)\n$TargetObject.PSBase.CommitChanges()<\/pre>\n\n\n\n<p>Si l\u2019on souhaite retirer les droits de potentiels administrateurs, la m\u00eame m\u00e9thode peut \u00eatre utilis\u00e9e, seulement en changeant le droit de <code>ListChildren<\/code> \u00e0 <code>GenericAll<\/code>. Cependant, il reste toujours des techniques pour un administrateur de d\u00e9truire notre persistance. Pour r\u00e9duire encore plus le pouvoir de ces derniers, il est possible de changer le propri\u00e9taire de l\u2019OU et de notre objet avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainObjectOwner<\/code><\/code>.<\/p>\n\n\n\n<h3>Avec DCSync<\/h3>\n\n\n\n<p>La m\u00e9thode la plus simple consiste \u00e0 laisser des droits tr\u00e8s importants \u00e0 un utilisateur compromis. L\u2019id\u00e9al \u00e9tant le droit <code>DCSync<\/code> qui autorise la r\u00e9plication des hash du contr\u00f4leur de domaine. Cette technique \u00e0 l\u2019avantage d\u2019\u00eatre simple et tr\u00e8s efficace. Cependant, bien que l\u2019attaque <code>DCSync<\/code> ait tendance \u00e0 \u00eatre plut\u00f4t discr\u00e8te, il est tout \u00e0 fait possible de rep\u00e9rer cette derni\u00e8re. De surcro\u00eet, il est aussi tr\u00e8s ais\u00e9 de d\u00e9terminer quel utilisateur (ou groupe) poss\u00e8de ce droit, ce qui ne favorise pas la discr\u00e9tion de la persistance et il est logiquement simple de la retirer. Une fois avoir obtenu l\u2019acc\u00e8s \u00e0 un compte avec privil\u00e8ge (ou poss\u00e9dant <code>WriteDACL<\/code> sur le domaine), on utilise PowerView de la sorte:<\/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=\"\">Add-DomainObjectAcl -PrincipalIdentity PersistenceUser -Rights DCSync DC=contoso,DC=local<\/pre>\n\n\n\n<p>Puis on extrait les hash en utilisant au choix mimikatz ou secretsdump.py de impacket (si vous ne connaissez pas impacket je vous recommande activement la vid\u00e9o de ProcessusThief sur ce sujet <a href=\"https:\/\/lestutosdeprocessus.fr\/tuto-fr-les-outils-impacket-par-processus\/\">https:\/\/lestutosdeprocessus.fr\/tuto-fr-les-outils-impacket-par-processus\/<\/a> qui est pour le moins tr\u00e8s compl\u00e8te). Avec mimikatz, l&#8217;exploitation ressemble \u00e0 ceci:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>lsadump::dcsync \/user:krbtgt \/domain:contoso.local<\/code><\/pre>\n\n\n\n<h3>Avec AdminSDHolder<\/h3>\n\n\n\n<p><code>AdminSDHolder<\/code> est un objet un peu particulier puisqu\u2019il prot\u00e8ge les groupes de s\u00e9curit\u00e9 d&#8217;\u00e9ventuelles modifications non-d\u00e9sir\u00e9es. Ainsi il a la capacit\u00e9 de restaurer et de modifier ces derniers. L\u2019id\u00e9e de cette persistance est de s\u2019ajouter une ACL nous permettant dans le future de modifier, via <code>AdminSDHolder<\/code>, les membres des groupes d\u2019administration, nous permettant ainsi de retrouver un contexte \u00e9lev\u00e9. <code>AdminSDHolder <\/code>poss\u00e8de un chemin LDAP identique par d\u00e9faut dans tous les domaines: <code>CN=AdminSDHolder,CN=System,DC=contoso,DC=local<\/code>. Pour cr\u00e9er la porte d\u00e9rob\u00e9e il suffit d\u2019ajouter une ACL depuis un compte \u00e0 privil\u00e8ge sur cet objet:<\/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=\"\">Add-DomainObjectAcl -TatgetIdentity \"CN=AdminSDHolder,CN=System,DC=contoso,DC=local\" -PrincipalIdentity PersistenceUser -Rights All<\/pre>\n\n\n\n<p>Puis nous cachons notre utilisateur avec les m\u00e9thodes pr\u00e9sent\u00e9es. Pour exploiter notre persistance, il faut retrouver un acc\u00e8s en tant que PersistenceUser, puis choisir un compte administrateur faisant partie du groupe &#8220;Domain Admins&#8221; et d\u2019arbitrairement changer son mot de passe avec <code><code data-enlighter-language=\"powershell\" class=\"EnlighterJSRAW\">Set-DomainUserPassword<\/code><\/code> par exemple.<\/p>\n\n\n\n<h3>Conclusion<\/h3>\n\n\n\n<p>Dans cet article nous avons donc vu comment utiliser les ACLs comme moyen de persistance qui a l\u2019avantage d\u2019\u00eatre plut\u00f4t discret. D\u2019autres m\u00e9thodes existent mais n\u00e9cessitent la pr\u00e9sence de technologie particuli\u00e8re install\u00e9e dans l\u2019environnement. Pour aller plus loin je vous conseille le papier de SpecterOps sur le sujet intitul\u00e9 <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>. J\u2019esp\u00e8re que cet article vous aura plu.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cet article traitera d\u2019une m\u00e9thode exotique de persistance en Active Directory qui utilise la DACL. Si cette derni\u00e8re et son fonctionnement vous sont totalement inconnus je vous recommande de lire la partie sur l\u2019exploitation la DACL. Les exemples qui seront fait utiliseront PowerView et un usage relativement avanc\u00e9 de PowerShell. Discr\u00e9tion Avant d\u2019\u00e9tudier les diff\u00e9rentes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/119"}],"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=119"}],"version-history":[{"count":4,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"predecessor-version":[{"id":269,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/posts\/119\/revisions\/269"}],"wp:attachment":[{"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theredwindows.net\/index.php\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}