o
    jg                     @   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rt|	j  ||sq2|	jj}|tjs|tjs|tjs|tjr.|	jtj rt|	j!  ||sq2|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rt#|	t$d r|t|
dd|d |d	krt#|	t$d r|
%ds|t|
dd|d |dv r|	jtj rd|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rt+|	t$d& r|t|
d&d|d |dkrt+|	t$d' r|t|
d'd|d |dkrt+|	t$d( r|t|
d(d|d |d krt+|	t$d) r|t|
d*d|d |	j
jdkr~|	tj}|	jj}|	tjs|	tjrq2|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
%: