o
    Žõ±j©g  ã                   @   sZ  d dl Z d dlZd dlmZ d dlT d dlmZ d dlmZm	Z	 dd„ Z
dd	„ Zed
ƒedƒedƒedƒedƒedƒedƒdœZdd„ Zdd„ Zdd„ Zdd„ Zd3dd„Z	 dZeƒ Zejedd � G d!d"„ d"eƒZG d#d$„ d$eƒZG d%d&„ d&eƒZG d'd(„ d(eƒZG d)d*„ d*eƒZG d+d,„ d,eƒZG d-d.„ d.eƒZ	 G d/d0„ d0eƒZG d1d2„ d2eƒZdS )4é    N)Úlogger)Ú*)ÚBytesIO)ÚunpackÚpackc                 C   sD   t d| d d… ƒ\}}}t d| dd… ƒ\}}}d||||||f S )Nú<LHHé   ú>HHLé   z%08X-%04X-%04X-%04X-%04X%08X)r   )ÚuuidÚuuid1Úuuid2Úuuid3Úuuid4Úuuid5Úuuid6© r   ú”/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/msldap/external/bloodhoundpy/acls.pyÚbin_to_string"   s   r   c                 C   s`   d| vr	t  | ¡S t d| ¡}dd„ | ¡ D ƒ\}}}}}}td|||ƒ} | td|||ƒ7 } | S )Nú-z^([\dA-Fa-f]{8})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})-([\dA-Fa-f]{4})([\dA-Fa-f]{8})c                 S   s   g | ]}t |d ƒ‘qS )r
   )Úint)Ú.0Úxr   r   r   Ú
<listcomp>1   ó    z!string_to_bin.<locals>.<listcomp>r   r	   )ÚbinasciiÚ	unhexlifyÚreÚmatchÚgroupsr   )r   Úmatchesr   r   r   r   r   r   r   r   r   Ústring_to_bin(   s   
ÿr!   z$1131f6aa-9c07-11d1-f79f-00c04fc2dcd2z$1131f6ad-9c07-11d1-f79f-00c04fc2dcd2z$89e95b76-444d-4c62-991a-0facbeda640cz$bf9679c0-0de6-11d0-a285-00aa003049e2z$00299570-246d-11d0-a768-00aa006e0529z$3f78c3e5-f79a-46bd-a0b8-9d18116ddc79z$4c164200-20c0-11d0-a768-00aa006e0529)Ú
GetChangesÚGetChangesAllÚGetChangesInFilteredSetÚWriteMemberÚUserForceChangePasswordÚAllowedToActÚUserAccountRestrictionsSetc              	   C   s  |s| |g fS t t|ƒƒ}| |j¡|d< g }t|jƒ}g d¢}||vr.| t|ddd�¡ |jj	D �]K}	|	j
jdkrJ|	j
jdkrJt d|	j
j¡ q2t|	jjƒ}
|
|v rUq2|	j
jdk�rÛ|	 tj¡}|	 tj¡so|	 tj¡roq2|	 tj¡rˆ|	j tj¡rˆt|	j ¡  ¡ ||ƒsˆq2|	jj}| tj¡s¥| tj¡s¥| tj¡s¥| tj¡�r.|	j tj ¡r¸t|	j !¡  ¡ ||ƒs¸q2| tj¡rð|d	krå|	j tj ¡rå|d
 d rå|	j !¡  ¡ |d krä| t|
d|d�¡ n
| t|
d|d�¡ q2| tj¡�r| t|
d|d�¡ |dk�r|d	k�rq2| tj¡�r| t|
d|d�¡ | tj¡�r.| t|
d|d�¡ |	jj tj"¡}|�rê|dv �rP|	j tj ¡�sP| t|
d|d�¡ |dk�rht#|	t$d ƒ�rh| t|
dd|d�¡ |d	k�r€t#|	t$d ƒ�r€| t|
dd|d�¡ |d	k�ržt#|	t$d ƒ�rž|
 %d¡�sž| t|
dd|d�¡ |dv �rÆ|	j tj ¡�rÆd|v �rÆ|	j !¡  ¡ |d k�rÆ| t|
d|d�¡ |d k�ré|	j tj ¡�ré|	j !¡  ¡ |d! k�ré| t|
d"|d�¡ n#|	jj tj&¡�r|dk�r|	jj'j(t$d k�r| t|
d#d|d�¡ |	jj tj)¡�r@|d	k�r@|	j tj ¡�r@|d
 d �r@|	j !¡  ¡ |d k�r@| t|
d|d�¡ |	jj tj*¡}|�rÛ|d$v �rc|	j tj ¡�sc| t|
d%d|d�¡ |d	k�r{|	j tj ¡�s{| t|
d%d|d�¡ |dk�r“t+|	t$d& ƒ�r“| t|
d&d|d�¡ |dk�r«t+|	t$d' ƒ�r«| t|
d'd|d�¡ |dk�rÃt+|	t$d( ƒ�rÃ| t|
d(d|d�¡ |d k�rÛt+|	t$d) ƒ�rÛ| t|
d*d|d�¡ |	j
jdk�r~|	 tj¡}|	jj}|	 tj¡�sû|	 tj¡�rûq2| tj¡�r| t|
d|d�¡ q2| tj"¡�r#|dv �r#| t|
d|d�¡ | tj¡�r4| t|
d|d�¡ |d$v �rK| tj*¡�rK| t|
d%d|d�¡ |d	k�rm| tj*¡�rm|
d+k�rm|
 %d¡�sm| t|
d%d|d�¡ | tj¡�r~| t|
d|d�¡ q2| ||fS ),zÍ
    Main ACL structure parse function.
    This is offloaded to subprocesses and takes the current entry and the
    acl data as argument. This is then returned and processed back in the main process
    ÚIsACLProtected)zS-1-3-0zS-1-5-18zS-1-5-10ÚOwnsF)Ú	inheritedé   r   zDon't care about acetype %dÚcomputerÚ
PropertiesÚhaslapszms-mcs-admpwdÚReadLAPSPasswordÚ
GenericAllÚGenericWriteÚdomainÚ	WriteDaclÚ
WriteOwner)ÚuserÚgroupr-   Úgpor7   r%   Ú	AddMemberÚ r'   ÚAddAllowedToActr(   z-512ÚWriteAccountRestrictions)r6   r-   zms-ds-key-credential-linkÚAddKeyCredentialLinkr6   zservice-principal-nameÚWriteSPNÚAddSelf)r6   r3   ÚAllExtendedRightsr"   r#   r$   r&   ÚForceChangePasswordzS-1-5-32-544),ÚSecurityDescriptorr   Úhas_controlÚPDÚstrÚ	owner_sidÚappendÚbuild_relationÚdaclÚacesÚaceÚAceTyper   ÚdebugÚacedataÚsidÚhas_flagÚACEÚINHERITED_ACEÚINHERIT_ONLY_ACEÚACCESS_ALLOWED_OBJECT_ACEÚ!ACE_INHERITED_OBJECT_TYPE_PRESENTÚace_appliesÚget_inherited_object_typeÚlowerÚmaskÚhas_privÚACCESS_MASKÚGENERIC_ALLÚ
WRITE_DACLÚWRITE_OWNERÚGENERIC_WRITEÚACE_OBJECT_TYPE_PRESENTÚget_object_typeÚADS_RIGHT_DS_WRITE_PROPÚcan_write_propertyÚEXTRIGHTS_GUID_MAPPINGÚendswithÚADS_RIGHT_DS_SELFÚdataÚ
ObjectTypeÚADS_RIGHT_DS_READ_PROPÚADS_RIGHT_DS_CONTROL_ACCESSÚhas_extended_right)ÚdnÚentryÚ	entrytypeÚaclÚobjecttype_guid_mapÚsdÚ	relationsÚosidÚ
ignoresidsÚ
ace_objectrO   Úis_inheritedrY   Ú
writeprivsÚcontrol_accessr   r   r   Úparse_binary_aclD   sì   

ÿ
ÿ
ÿÿÿ
þ€&"€
ÿ
þ
€
ry   c                 C   ó<   | j j tj¡s
dS | j  tj¡sdS | j jj	|krdS dS )a®  
    Checks if the access is sufficient to write to a specific property.
    This can either be because we have the right ADS_RIGHT_DS_WRITE_PROP and the correct GUID
    is set in ObjectType, or if we have the ADS_RIGHT_DS_WRITE_PROP right and the ObjectType
    is empty, in which case we can write to any property. This is documented in
    [MS-ADTS] section 5.1.3.2: https://msdn.microsoft.com/en-us/library/cc223511.aspx
    FT)
rN   rY   rZ   r[   rb   rP   rT   r`   rg   rh   )ru   Úbinpropertyr   r   r   rc   ø   ó   rc   c                 C   rz   )a¾  
    Checks if the access is sufficient to control the right with the given GUID.
    This can either be because we have the right ADS_RIGHT_DS_CONTROL_ACCESS and the correct GUID
    is set in ObjectType, or if we have the ADS_RIGHT_DS_CONTROL_ACCESS right and the ObjectType
    is empty, in which case we have all extended rights. This is documented in
    [MS-ADTS] section 5.1.3.2: https://msdn.microsoft.com/en-us/library/cc223511.aspx
    FT)
rN   rY   rZ   r[   rj   rP   rT   r`   rg   rh   )ru   Úbinrightguidr   r   r   rk   
  r|   rk   c                 C   s   | || krdS dS )zò
    Checks if an ACE applies to this object (based on object classes).
    Note that this function assumes you already verified that InheritedObjectType is set (via the flag).
    If this is not set, the ACE applies to all object types.
    TFr   )Úace_guidÚobject_classrp   r   r   r   rV     s   rV   r:   Fc                 C   s   |dkrt dƒ‚|| |dœS )Nr:   z!BH 4.0 incompatible output called)Ú	rightnamerO   r+   )Ú
ValueError)rO   ÚrelationÚacetyper+   r   r   r   rH   '  s   rH   a´  
struct SECURITY_DESCRIPTOR {
    uint8   Revision;
    uint8   Sbz1;
    uint16  Control;
    uint32  OffsetOwner;
    uint32  OffsetGroup;
    uint32  OffsetSacl;
    uint32  OffsetDacl;
};

struct LDAP_SID_IDENTIFIER_AUTHORITY {
    char    Value[6];
};

struct LDAP_SID {
    uint8   Revision;
    uint8   SubAuthorityCount;
    LDAP_SID_IDENTIFIER_AUTHORITY   IdentifierAuthority;
    uint32  SubAuthority[SubAuthorityCount];
};

struct ACL {
    uint8   AclRevision;
    uint8   Sbz1;
    uint16  AclSize;
    uint16  AceCount;
    uint16  Sbz2;
    char    Data[AclSize - 8];
};

struct ACE {
    uint8   AceType;
    uint8   AceFlags;
    uint16  AceSize;
    char    Data[AceSize - 4];
};

struct ACCESS_ALLOWED_ACE {
    uint32  Mask;
    LDAP_SID Sid;
};

struct ACCESS_ALLOWED_OBJECT_ACE {
    uint32  Mask;
    uint32  Flags;
    char    ObjectType[Flags & 1 * 16];
    char    InheritedObjectType[Flags & 2 * 8];
    LDAP_SID Sid;
};
T)Úcompiledc                   @   s\   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdd„ Zdd„ ZdS )rB   r   é   é   é   é   r,   é   é   r   é	   é
   é   é   é   é   é   c                 C   s   t | jƒdd … | dkS )Nr†   Ú1)ÚbinÚcontrol)Úselfr”   r   r   r   rC   ‹  s   zSecurityDescriptor.has_controlc                 C   sÐ   || _ t |¡| _| jj| _d| _d| _d| _d| _	| jj
dkr-| | jj
¡ t|d�| _| jjdkr@| | jj¡ t|d�| _| jjdkrR| | jj¡ t|ƒ| _| jjdkrf| | jj¡ t|ƒ| _	d S d S )Nó    r   )Úfh)r—   Úc_secdÚSECURITY_DESCRIPTORÚ
descriptorÚControlr”   rF   Ú	group_sidÚsaclrI   ÚOffsetOwnerÚseekÚLdapSidÚOffsetGroupÚ
OffsetSaclÚACLÚ
OffsetDacl©r•   r—   r   r   r   Ú__init__�  s(   

þzSecurityDescriptor.__init__N)Ú__name__Ú
__module__Ú__qualname__ÚSRÚRMÚPSrD   ÚSIÚDIÚSCÚDCÚSSÚDTÚSDÚSPÚDDÚDPÚGDÚODrC   r¦   r   r   r   r   rB   x  s&    rB   c                   @   s   e Zd Zddd„Zdd„ ZdS )r    Nc                 C   s$   |r|| _ t |¡| _d S || _d S ©N)r—   r˜   ÚLDAP_SIDÚldap_sid)r•   r—   Úin_objr   r   r   r¦   ¬  s   
zLdapSid.__init__c                 C   s4   d  | jjt| jjjƒd d dd„ | jjD ƒ¡¡S )Nz
S-{}-{}-{}r,   r   c                 S   s   g | ]}d   |¡‘qS )z{:d})Úformat)r   Úvr   r   r   r   ´  r   z$LdapSid.__repr__.<locals>.<listcomp>)r½   r»   ÚRevisionÚ	bytearrayÚIdentifierAuthorityÚValueÚjoinÚSubAuthority©r•   r   r   r   Ú__repr__³  s   4zLdapSid.__repr__)NN©r§   r¨   r©   r¦   rÆ   r   r   r   r   r    «  s    
r    c                   @   s   e Zd Zdd„ ZdS )r£   c                 C   sJ   || _ t |¡| _g | _t| jjƒ}t| jjƒD ]
}| j 	t
|ƒ¡ qd S r¹   )r—   r˜   r£   ro   rJ   r   ÚDataÚrangeÚAceCountrG   rQ   )r•   r—   ÚbufÚir   r   r   r¦   ¸  s   ÿzACL.__init__N)r§   r¨   r©   r¦   r   r   r   r   r£   ·  s    r£   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚACCESS_ALLOWED_ACEc                 C   ó4   || _ t |¡| _t| jjd�| _t| jjƒ| _	d S ©N)r¼   )
r—   r˜   rÍ   rg   r    ÚSidrO   r[   ÚMaskrY   r¥   r   r   r   r¦   Ã  ó   zACCESS_ALLOWED_ACE.__init__c                 C   s   dt | jƒt | jƒf S )Nz*<ACCESS_ALLOWED_OBJECT_ACE Sid=%s Mask=%s>)rE   rO   rY   rÅ   r   r   r   rÆ   É  s   zACCESS_ALLOWED_ACE.__repr__NrÇ   r   r   r   r   rÍ   Â  s    rÍ   c                   @   ó   e Zd ZdS )ÚACCESS_DENIED_ACEN©r§   r¨   r©   r   r   r   r   rÔ   Ì  ó    rÔ   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )rT   r…   r†   c                 C   rÎ   rÏ   )
r—   r˜   rT   rg   r    rÐ   rO   r[   rÑ   rY   r¥   r   r   r   r¦   Õ  rÒ   z"ACCESS_ALLOWED_OBJECT_ACE.__init__c                 C   ó   | j j|@ |kS r¹   )rg   ÚFlags©r•   Úflagr   r   r   rP   Û  ó   z"ACCESS_ALLOWED_OBJECT_ACE.has_flagc                 C   ó   |   | j¡rt| jjƒS d S r¹   )rP   r`   r   rg   rh   rÅ   r   r   r   ra   Þ  ó   z)ACCESS_ALLOWED_OBJECT_ACE.get_object_typec                 C   rÜ   r¹   )rP   rU   r   rg   ÚInheritedObjectTyperÅ   r   r   r   rW   ã  rÝ   z3ACCESS_ALLOWED_OBJECT_ACE.get_inherited_object_typec                 C   sp   g }t tƒD ]\}}| d¡st|ƒtu r|  |¡r| |¡ qd |¡t| j	ƒt| j
ƒ|  ¡ |  ¡ f}d| S )NÚ_ú | z^<ACCESS_ALLOWED_OBJECT_ACE Flags=%s Sid=%s 
		Mask=%s 
		ObjectType=%s InheritedObjectType=%s>)ÚvarsrT   Ú
startswithÚtyper   rP   rG   rÃ   rE   rO   rY   ra   rW   )r•   ÚoutÚnameÚvaluerg   r   r   r   rÆ   è  s    
€üz"ACCESS_ALLOWED_OBJECT_ACE.__repr__N)
r§   r¨   r©   r`   rU   r¦   rP   ra   rW   rÆ   r   r   r   r   rT   Ð  s    rT   c                   @   rÓ   )ÚACCESS_DENIED_OBJECT_ACENrÕ   r   r   r   r   rç   õ  rÖ   rç   c                   @   sˆ   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd S )!r[   l        i   i    i   i”  i(  i  iÿ i   i   i   i   i   i   i   é   r…   r†   r
   é    r   c                 C   s
   || _ d S r¹   ©rY   )r•   rY   r   r   r   r¦   !  s   
zACCESS_MASK.__init__c                 C   s   | j |@ |kS r¹   rê   ©r•   Úprivr   r   r   rZ   $  s   zACCESS_MASK.has_privc                 C   s   |  j |O  _ d S r¹   rê   rë   r   r   r   Úset_priv'  ó   zACCESS_MASK.set_privc                 C   s   |  j |N  _ d S r¹   rê   rë   r   r   r   Úremove_priv*  rî   zACCESS_MASK.remove_privc                 C   sT   g }t tƒD ]\}}| d¡st|ƒtu r|  |¡r| |¡ qd| jd |¡f S )Nrß   z!<ACCESS_MASK RawMask=%d Flags=%s>rà   )	rá   r[   râ   rã   r   rZ   rG   rY   rÃ   ©r•   rä   rå   ræ   r   r   r   rÆ   -  s    
€zACCESS_MASK.__repr__N)r§   r¨   r©   ÚSET_GENERIC_READÚSET_GENERIC_WRITEÚSET_GENERIC_EXECUTEÚSET_GENERIC_ALLÚGENERIC_READr_   ÚGENERIC_EXECUTEr\   ÚMAXIMUM_ALLOWEDÚACCESS_SYSTEM_SECURITYÚSYNCHRONIZEr^   r]   ÚREAD_CONTROLÚDELETErj   ÚADS_RIGHT_DS_CREATE_CHILDÚADS_RIGHT_DS_DELETE_CHILDri   rb   rf   r¦   rZ   rí   rï   rÆ   r   r   r   r   r[   ý  s6    r[   c                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dd„ Z
d	d
„ Zdd„ ZdS )rQ   r†   é€   r   r
   rˆ   r…   c                 C   s    || _ t |¡| _d | _t| jjƒ}| jjdkrt|ƒ| _n#| jjdkr*t	|ƒ| _n| jjdkr6t
|ƒ| _n| jjdkrAt|ƒ| _| jrNt| jjjƒ| _d S d S )Nr   r,   r…   r‰   )r—   r˜   rQ   rK   rN   r   rÈ   rL   rÍ   rT   rÔ   rç   r[   rg   rÑ   rY   )r•   r—   rË   r   r   r   r¦   @  s   
ÿzACE.__init__c                 C   sd   g }t tƒD ]\}}| d¡st|ƒtu r|  |¡r| |¡ qd| jjd 	|¡| jj
t| jƒf S )Nrß   z+<ACE Type=%s Flags=%s RawFlags=%d 
	Ace=%s>rà   )rá   rQ   râ   rã   r   rP   rG   rK   rL   rÃ   ÚAceFlagsrE   rN   rð   r   r   r   rÆ   W  s    
€$zACE.__repr__c                 C   r×   r¹   )rK   rÿ   rÙ   r   r   r   rP   _  rÛ   zACE.has_flagN)r§   r¨   r©   ÚCONTAINER_INHERIT_ACEÚFAILED_ACCESS_ACE_FLAGrS   rR   ÚNO_PROPAGATE_INHERIT_ACEÚOBJECT_INHERIT_ACEÚSUCCESSFUL_ACCESS_ACE_FLAGr¦   rÆ   rP   r   r   r   r   rQ   7  s    rQ   )r:   F) r   r   Úmsldapr   Ú(msldap.external.bloodhoundpy.lib.cstructÚior   Ústructr   r   r   r!   rd   ry   rc   rk   rV   rH   ÚcdefÚcstructr˜   ÚloadÚobjectrB   r    r£   rÍ   rÔ   rT   rç   r[   rQ   r   r   r   r   Ú<module>   sH   ù
 5
43
%: