<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>dsm&#x27;s blog - windows</title>
    <subtitle>Writing on security and technology.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://larper.me/tags/windows/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://larper.me"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-10-24T00:00:00+00:00</updated>
    <id>https://larper.me/tags/windows/atom.xml</id>
    <entry xml:lang="en">
        <title>(PT-BR) 101 Security Descriptor</title>
        <published>2024-10-24T00:00:00+00:00</published>
        <updated>2024-10-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              dsm
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://larper.me/blog/101-security-descriptor/"/>
        <id>https://larper.me/blog/101-security-descriptor/</id>
        
        <content type="html" xml:base="https://larper.me/blog/101-security-descriptor/">&lt;p&gt;O Security Descriptor ou ntSecurityDescriptor, é um atributo de segurança do Windows que contém uma estrutura de dados representativa das permissões e propriedades daquele objeto em questão. Podemos interpretar o mesmo como uma ideia do escopo de permissões do X sobre Y. O ntSecurityDescriptor está presente desde as versões superiores do Windows Server 2000 e se manteve o mesmo desde então.&lt;&#x2F;p&gt;
&lt;p&gt;O Security Descriptor é um representação compactada binária da segurança associada a objeto pertecente ao ambiente. Para comprovação disso, podemos tentar extrair o Security Descriptor de um usuário ou grupo por meio de uma query LDAP e vermos seu formato puro.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;security-descriptor&#x2F;image1.jpg&quot; alt=&quot;Security Descriptor em formato binário extraído via LDAP&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;É importante salientar que o ntSecurityDescriptor é utilizado por DACLs, SACLs, e ACL. Esses três atributos são responsáveis por representar as permissões desse objeto consumindo os dados do ntSecurityDescriptor. Essas permissões são de quem representa aquele objeto, quem pode acessar esse objeto e o que pode fazer com o mesmo, informações de auditoria do objeto e restrições sobre tal.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ACL&lt;&#x2F;strong&gt;: &lt;em&gt;Access Control List&lt;&#x2F;em&gt; é uma lista de proteções de seguranças que são aplicadas sobre um objeto. Deve-se entender que objetos podem ser um arquivo, processo, evento, ou tudo aquilo que também tiver um &quot;Security Descriptor&quot;;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;ACE&lt;&#x2F;strong&gt;: &lt;em&gt;Access Control Entries&lt;&#x2F;em&gt; são entrada de dados de ACLs (Access Control List). Uma ACE contém uma lista de permissões sobre um SID que irá identificar se tais permissões participam dos escopos: Allowed, Denied ou Audited;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;DACL&lt;&#x2F;strong&gt;: &lt;em&gt;Discretionary Access Control List&lt;&#x2F;em&gt; é o responsável por identificar os administradores ou objetos que tem permissões ou não sobre objetos protegidos. Caso um processo tente interagir com um objeto protegido, o sistema irá requisitar ao que ACE busque na DACL se aquele autor em questão tem as permissões necessárias;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;SACL&lt;&#x2F;strong&gt;: &lt;em&gt;System Access Control List&lt;&#x2F;em&gt; é uma lista que permite que adminstradores registrem tentativas de interação ou acesso a um objeto protegido. Cada ACE irá especificar as tentativas de acesso sobre aquele item e fará com que o sistema armazene essa tentativa no Security Event Log;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;security-descriptor&#x2F;image2.jpg&quot; alt=&quot;Diagrama de ACL, ACE, DACL e SACL&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;De acordo com a Microsoft, o ntSecurityDescriptor utiliza de um sistema chamado &lt;em&gt;Security Descriptor String Format&lt;&#x2F;em&gt;. O &lt;em&gt;Security Descriptor String Format&lt;&#x2F;em&gt; é um formato ou sistema de texto responsável por armazenar ou transportar a informação do ntSecurityDescriptor. Isso é feito por duas funções chamadas &lt;strong&gt;ConvertSecurityDescriptorToStringSecurityDescriptorA&lt;&#x2F;strong&gt; e &lt;strong&gt;ConvertStringSecurityDescriptorToSecurityDescriptorA&lt;&#x2F;strong&gt;. Essas duas funções são utilizadas para o trabalho de conversão dos Security Descriptor.&lt;&#x2F;p&gt;
&lt;p&gt;É possível transformar um &lt;em&gt;&quot;String Security Descriptor&quot;&lt;&#x2F;em&gt; para um &lt;em&gt;Security Descriptor Absoluto&lt;&#x2F;em&gt; através de outra função que é chamada de &lt;strong&gt;MakeAbsoluteSD&lt;&#x2F;strong&gt;. Essas três funções iram retornar valores não nulos, caso todos os argumentos necessários forem repassados e serem válidos. Com o seu retorno, é possível extrair o formato do Security Descriptor.&lt;&#x2F;p&gt;
&lt;p&gt;Para que as funções citadas acima possam descrever o formato do Security Descriptor, é utilizado a tecnologia SDDL (Security Descriptor Definition Language) que irá fazer essa tradução e permitir que as funções possam representar elas em texto. Aqui estão alguns exemplos de SDDL retirados do artigo da Microsoft:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;exemplos&quot;&gt;Exemplos&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Regra&lt;&#x2F;strong&gt;: Qualquer usuário poderá executar esse objeto se ele seguir as seguintes condições:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;O título dele ser PM&lt;&#x2F;li&gt;
&lt;li&gt;A divisão ou setor dele for Financeiro ou Vendas&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;d:(XA; ;FX;;;S-1-1-0; (@User.Title==&amp;quot;PM&amp;quot; &amp;amp;&amp;amp; (@User.Division==&amp;quot;Financeiro&amp;quot; || @User.Division ==&amp;quot;Vendas&amp;quot;)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Regra 2&lt;&#x2F;strong&gt;: Permite leitura do objeto se o usuário seguir as seguintes condições:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Seu login ter sido feito a partir de um Smart Card&lt;&#x2F;li&gt;
&lt;li&gt;É pertencente do grupo Backup Operator&lt;&#x2F;li&gt;
&lt;li&gt;Está conectado em uma máquina com o BitLocker ativo&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;D:(XA; ;FR;;;S-1-1-0; (Member_of {SID(Smartcard_SID), SID(BO)} &amp;amp;&amp;amp;@Device.Bitlocker))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;qual-a-sua-importancia&quot;&gt;Qual a sua importância?&lt;&#x2F;h2&gt;
&lt;p&gt;Através do Security Descriptor, pode-se compreender qual o escopo de privilégios que aquele ativo terá sobre um item de seu interesse ou que haverá uma possível interação. Com isso em mente, a Microsoft desenvolveu esse atributo expressivo para que fosse alocado sobre os objetos do ambiente Active Directory e pudesse trabalhar as questões de controle de acesso. Atualmente, ele é utilizado por outras classes do ambiente Active Directory como:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;samDomainBase&lt;&#x2F;strong&gt;: A classe base para a definição de domínios;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;securityPrincipal&lt;&#x2F;strong&gt;: Armazena informações de segura sobre um objeto;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;top&lt;&#x2F;strong&gt;: A classe de mais alto nível que é de onde todas as classes derivam;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Hoje em dia, ferramentas como o &lt;strong&gt;BloodHound&lt;&#x2F;strong&gt; usufruem de ACEs e DACLs para identificar as permissões que um objeto tem sobre o outro, e assim, poder construir caminhos de exploração por meio de fragilidades do objeto X sobre o objeto Y.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trabalhando-com-o-ntsecuritydescriptor&quot;&gt;Trabalhando com o ntSecurityDescriptor&lt;&#x2F;h2&gt;
&lt;p&gt;O ntSecurityDescriptor segue o seguinte formato &lt;code&gt;O:BAG:BAD:S:&lt;&#x2F;code&gt;, onde:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;O&lt;&#x2F;strong&gt;: Owner&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;BAG&lt;&#x2F;strong&gt; e &lt;strong&gt;BAD&lt;&#x2F;strong&gt; serão utilizados para representar quem tem permissão de interação e quem não tem sobre aquele objeto. G é Granted e D é Deny.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;S&lt;&#x2F;strong&gt; representará o SACL.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;O atributo Owner irá indicar o proprietário por meio do SID do objeto, o BAG e o BAD são especificadores de controle de acesso e o SACL para poder armazenar as tentativas de interação com o objeto alvo. De uma maneira simples, se expandíssemos um Security Descriptor, esse seria o formato dele:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;security-descriptor&#x2F;image3.jpg&quot; alt=&quot;Estrutura expandida de um Security Descriptor&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Como podemos ver, o Owner e PrimaryGroup são as representações do proprietário daquele Security Descriptor. Com isso, podemos partir para a leitura da DACL que trará informações sobre a ACE do objeto protegido. Em um contexto de segurança ofensiva, o que diretamente nos importa seria o Access Mask dessa ACE.&lt;&#x2F;p&gt;
&lt;p&gt;Com isso em mente, podemos capturar o Security Descriptor de objetos (usuários, grupos, etc) e lermos suas permissões e identificar possíveis fragilidades que atacantes podem utilizar para escalonar privilégios dentro de um ambiente Active Directory. Para isso, incrementei um módulo na minha ferramenta &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;oppsec&#x2F;breads&quot;&gt;breads&lt;&#x2F;a&gt; que irá buscar pelo valor do ntSecurityDescriptor de todos os objetos do ambiente através da query &lt;code&gt;objectClass=(*)&lt;&#x2F;code&gt; e checar as permissões se baseando no valor de ACE_MASK. Esses valores são hexadecimais que quando calculados, podem ser lidos como bits representantes de permissão. Essa é a tabela de permissões:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;security-descriptor&#x2F;image4.jpg&quot; alt=&quot;Tabela de permissões ACE_MASK&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Esse é o pedaço do código da minha ferramenta que irá realizar essa busca. O &lt;code&gt;object_ntsd&lt;&#x2F;code&gt; representa o acesso ao atributo ntSecurityDescriptor daquele objeto; já a variável &lt;code&gt;sd&lt;&#x2F;code&gt; está utilizando de uma classe do projeto &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fortra&#x2F;impacket&quot;&gt;Impacket&lt;&#x2F;a&gt; para realizar a leitura dos bytes do Security Descriptor. Por fim, percorremos pelas chaves retornada da variável &lt;code&gt;sd&lt;&#x2F;code&gt; e acessamos seus valores respectivamente.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F8F8F2; background-color: #272822;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;# ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;object_ntsd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; attribute[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;attributes&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;nTSecurityDescriptor&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sd&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; SR_SECURITY_DESCRIPTOR(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FD971F;font-style: italic;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;object_ntsd)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; sd[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;Dacl&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F92672;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; ace&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span&gt; sd[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;Dacl&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;].aces:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ace_object&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ace[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;Ace&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #88846F;&quot;&gt;  # Ace_Object Vars: Mask, Sid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ace_mask&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F92672;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ace_object[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;Mask&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;][&lt;&#x2F;span&gt;&lt;span style=&quot;color: #E6DB74;&quot;&gt;&amp;quot;Mask&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Após um tratamento sobre os hexadecimais retornados e quais são suas representações com base na documentação da Microsoft, podemos esperar um resultado como esse abaixo. Ressalto que foi utilizado uma conta participante do grupo de Domain Admins.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;assets&#x2F;security-descriptor&#x2F;image5.jpg&quot; alt=&quot;Resultado da ferramenta breads listando permissões&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusao&quot;&gt;Conclusão&lt;&#x2F;h2&gt;
&lt;p&gt;Assim, podemos compreender a relevância do ntSecurityDescriptor no Active Directory e como podemos utilizar dele para encontrar meios para realizar uma escalação de privilégios por meio de objetos presentes no ambiente. Como citado anteriormente, a ferramenta BloodHound faz um ótimo trabalhando usufruindo desse atributo para construir caminhos e gráficos com base nas informações coletadas do ambiente. Entende-se que tudo isso é principalmente útil para atacantes, todavia, esse tipo de processo também é de grande utilidade também para os times de operações defensivas, visto que poderão encontrar fragilidades na arquitetura monitorada.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;referencias&quot;&gt;Referências&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;fortra&#x2F;impacket&#x2F;blob&#x2F;f8899e65f16c50b871863528d419cfb701a5a3e3&#x2F;impacket&#x2F;ldap&#x2F;ldaptypes.py&quot;&gt;github.com&#x2F;fortra&#x2F;impacket — ldaptypes.py&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;win32&#x2F;adschema&#x2F;&quot;&gt;learn.microsoft.com — AD Schema&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.installsetupconfig.com&#x2F;win32programming&#x2F;accesscontrollistacl2_1.html&quot;&gt;installsetupconfig.com — Access Control List ACL&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;win32&#x2F;secauthz&#x2F;access-control-lists&quot;&gt;learn.microsoft.com — Access Control Lists&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;win32&#x2F;secauthz&#x2F;security-descriptor-string-format&quot;&gt;learn.microsoft.com — Security Descriptor String Format&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;win32&#x2F;secgloss&#x2F;a-gly&quot;&gt;learn.microsoft.com — Security Glossary A&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;win32&#x2F;secgloss&#x2F;d-gly&quot;&gt;learn.microsoft.com — Security Glossary D&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;openspecs&#x2F;windows_protocols&#x2F;ms-dtyp&#x2F;4f4251cc-23b6-44b6-93ba-69688422cb06&quot;&gt;learn.microsoft.com — MS-DTYP: SECURITY_DESCRIPTOR&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;openspecs&#x2F;windows_protocols&#x2F;ms-dtyp&#x2F;7d4dac05-9cef-4563-a058-f108abecce1d&quot;&gt;learn.microsoft.com — MS-DTYP: ACE&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;windows&#x2F;win32&#x2F;api&#x2F;iads&#x2F;ne-iads-ads_rights_enum&quot;&gt;learn.microsoft.com — ADS_RIGHTS_ENUM&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
</feed>
