o
    Žõ±jîi  ã                   @   sÊ   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ dd„ ZG dd„ dƒZdS )é    N)Útqdm)Úparse_binary_acl)Úresolve_acesÚWELLKNOWN_SIDS)Úparse_gplink_stringÚis_filtered_containerÚis_filtered_container_childÚreverse_dn_componentsÚ
explode_dn)ÚLDAPConnectionFactory)ÚMSLDAPClientConnection)ÚMSLDAPClient)ÚSnapshot)Úloggerc                 Ã   s   �t | ƒ d S ©N)Úprint)Úmsg© r   ú„/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/msldap/bloodhound.pyÚdummy_print   s   €r   c                   @   sú   e Zd Zd;depepepedefdd„Zdefdd	„Z	d<d
d„Z
d=dd„Zdd„ Zdd„ Zdd„ Zd>dd„Zdd„ Zdd„ Zd?dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Z dS )@ÚMSLDAPDump2BloodhoundTNÚurlÚuse_mpc              	   C   sÖ   d| _ || _d | _d | _d | _d | _|| _d| _|| _|| _	| jd u r&t
| _i | _i | _i | _i | _i | _i | _i | _tj ¡  d¡| _d| j | _|d urWtj || j¡| _d | _d| _dddddddddœ| _d S )NFiˆ  z%Y%m%dT%H%M%Sz%s_Bloodhound.zipi@œ  r   )ÚuserÚcomputerÚgroupÚouÚgpoÚ	containerÚdomainÚtrust)ÚdebugÚldap_urlÚ
connectionÚldapinfoÚ
domainnameÚ	domainsidr   Úmp_sdbatch_lengthÚprint_cbÚwith_progressr   ÚDNsÚ
DNs_sortedÚocacheÚschemaÚacesÚcomputer_sidcacheÚ	token_mapÚdatetimeÚutcnowÚstrftimeÚcurdateÚzipfilepathÚosÚpathÚjoinÚzipfileÚMAX_ENTRIES_PER_FILEÚtotals)Úselfr   ÚprogressÚoutput_pathr   r(   r   r   r   Ú__init__   sD   
øzMSLDAPDump2Bloodhound.__init__r   c                 Ã   s   �|   |¡I d H  d S r   )r(   )r<   r   r   r   r   r   ?   s   €zMSLDAPDump2Bloodhound.printc                 Ã   s0   �| j du rt||d�S |  d| ¡I d H  d S )NT)ÚdescÚtotalz[+] %s)r)   r   r   )r<   ÚlabelrA   r   r   r   Úcreate_progressC   s
   €
z%MSLDAPDump2Bloodhound.create_progressé   c                 Ã   s*   �|d u rd S | j du r| |¡ d S d S ©NT)r)   Úupdate)r<   ÚpbarÚvaluer   r   r   Úupdate_progressJ   s   €
ÿz%MSLDAPDump2Bloodhound.update_progressc                 Ã   s(   �|d u rd S | j du r| ¡  d S d S rE   )r)   Úclose)r<   rG   r   r   r   Úclose_progressP   s   €
ÿz$MSLDAPDump2Bloodhound.close_progressc                 C   s   g d|dddœdœS )Nr   é   ©ÚmethodsÚtypeÚversionÚcount©ÚdataÚmetar   )r<   Úenumtyper   r   r   Úget_json_wrapperV   s   üþz&MSLDAPDump2Bloodhound.get_json_wrapperc                 c   s–   � |d d | j kr|V  d S td|d d | j ƒD ].}g d|dddœdœ}|d ||| j  … D ]}|d  |¡ |d d  d7  < q1|V  qd S )	NrT   rQ   r   rL   rM   rR   rS   rD   )r:   ÚrangeÚappend)r<   rU   rS   ÚiÚ
jsonstructÚentryr   r   r   Ú
split_jsonb   s"   €üþ	óz MSLDAPDump2Bloodhound.split_jsonr   c                 Ã   sB   �|dkrd| j |f }nd| j ||f }| j |t |¡¡ d S )Nr   z
%s_%s.jsonz%s_%s_%02d.json)r4   r9   ÚwritestrÚjsonÚdumps)r<   rU   rS   ÚfilepartÚfilenamer   r   r   Úwrite_json_to_zipx   s
   €z'MSLDAPDump2Bloodhound.write_json_to_zipc              
   Ã   sˆ  �|  ¡ }t|ƒ}|| jvrt d| ¡ g S | j}d}t|ƒD ]"}|d7 }||vr>t d||| ¡ |t|ƒf ¡ g   S || }q g }|D ]}| |d | ¡ qGg }|D ]j}	t	|	ƒr^qW|	| jvrŸ| j
 |	g d¢¡I d H \}
}|d urw|‚|
d u s�t|
ƒdkr‰t d|	 ¡ qW|  |
¡}| |d   ¡ |d	  ¡ d
œ¡ qW| j| j|	  }| |d   ¡ |d  ¡ dkr¼|d  ¡ ndd
œ¡ qW|S )Nz[BH] DN not found: %sr   rD   z?[BH] Part not found: %s Full: %s Branch: %s Level: %s Parts: %sú,)ÚdistinguishedNameÚ
objectGUIDÚobjectClassÚsAMAaccountTypeÚsAMAccountNameÚ	objectSidÚnameú[BH] Missing DN: %sÚobjectidrO   ©ÚObjectIdentifierÚ
ObjectTypern   ro   r   ÚOU)Úupperr	   r*   r   r!   r+   r
   ÚkeysrX   r   r#   ÚdnattrsÚlenÚresolve_entryÚ
capitalizer,   Úlower)r<   Ú	parent_dnÚparent_dn_reversedÚbranchÚlevelÚpartÚres_dnsÚdnpartÚresultsÚtdnÚattrsÚerrÚresr[   r   r   r   Úlookup_dn_children€   sP   €
 




þ

þz(MSLDAPDump2Bloodhound.lookup_dn_childrenc                 Ã   s†   �|   d¡I d H }d| jd< | j ddg¡2 z!3 d H W \}}|d ur$|‚|  |¡I d H  t|jƒ| j|j ¡ < q6 |  	|¡I d H  d S )NzDumping schemaz$89e31c12-8530-11d0-afda-00c04fd930c9Úforeignsecurityprincipalrj   ÚschemaIDGUID)
rC   r-   r#   Úget_all_schemaentryrI   Ústrr†   rj   rw   rK   )r<   rG   r[   r‚   r   r   r   Údump_schema­   s   €
 üz!MSLDAPDump2Bloodhound.dump_schemaÚ c           
      C   sÊ   | j |  d7  < |tv rd| j ¡ | ¡ f }| ¡ |||dœ| j|< || j| ¡ < |dkr_||dœ}|d u r:d}|| j| ¡ < |d ura|D ]}| d¡d }	|	 d¡d	 }	|| j|	 ¡ < qGd S d S d S )
NrD   ú%s-%s©Údnrn   Ú	principalro   r   rm   rŠ   ú/ú:r   )	r;   r   r%   rq   r,   r*   r/   rw   Úsplit)
r<   r�   rl   rŽ   ÚotypeÚdnsÚspnsr[   ÚspnÚtargetr   r   r   Ú
add_ocacheº   s0   üþôz MSLDAPDump2Bloodhound.add_ocachec                 C   s\  i }|  dd¡}|  dd¡}|  dd¡|d< d|| jf  ¡ |d< d|v rs|d	 }|d
 }|dv r7d|d< |S |dv sCd|v sCd|v rId|d< |S |dv rcd|d< | d¡}d|| jf  ¡ |d< |S |dv rmd|d< |S d|d< |S d|v r¬|d |d< d|  dd¡| jf  ¡ |d< |  d
g ¡}d|v rœd|d< |S d|v r¦d|d< |S d|d< |S d S ) Nrh   rŠ   rd   ri   rl   ú%s@%srŽ   ÚsAMAaccountNameÚsAMAccountTyperf   )i   i  i    i   ÚGrouprO   )i   0zmsDS-GroupManagedServiceAccountzmsDS-ManagedServiceAccountÚUser)i  0ÚComputerú$z%s.%s)i  0ÚtrustaccountÚDomainre   rj   ÚorganizationalUnitrp   r   Ú	ContainerÚBase)Úgetr%   rq   Úrstrip)r<   r[   ÚresolvedÚaccountr�   ÚaccountTypeÚobject_classÚ
short_namer   r   r   ru   Ó   sN   ô	ø
üÿüÿöz#MSLDAPDump2Bloodhound.resolve_entryc              	   Ã   sN  �|   d¡I d H }| j ¡ I d H \}}|d ur|‚|j| _|  |j|jdd¡ |  |¡I d H  | j g d¢¡2 z 3 d H W \}}|d urE|‚|  |j|j	dd¡ |  |¡I d H  q76 | j 
g d¢¡2 z*3 d H W \}}|d uro|‚|j}|  |j|jd|| jf  ¡ d¡ |  |¡I d H  qa6 | j g d	¢¡2 z63 d H W \}}|d ur£|‚|j}|j}|d u r¯d}|  |j|jd|| jf  ¡ d
||j¡ |  |¡I d H  q•6 | j g d¢¡2 z 3 d H W \}}|d urã|‚|  |j|jdd¡ |  |¡I d H  qÕ6 | j g d¢¡2 z!3 d H W \}}|d u�r|‚|  |j|j	dd¡ |  |¡I d H  qÿ6 | j g d¢¡2 z*3 d H W \}}|d u�r9|‚t|jƒ�rA�q*|  |j|j	dd¡ |  |¡I d H  �q*6 | j g d¢¡2 z"3 d H W \}}|d u�rm|‚|  |j|j	dd¡ |  |¡I d H  �q^6 | j g d¢¡2 z¢3 d H W \}}i }|d }d| dg ¡  v �r¨du �r¬n n�qŠ|d tv �rÂd| j ¡ |d  ¡ f |d< | j ¡ |d< d|d< d|v �r
|d tv �rt|d  \}}	|	 ¡ |d< d| ¡ | j ¡ f |d< d| j ¡ |d  ¡ f |d< n|d |d< |d  ¡ |d |d |d dœ| j|d < |d | j|d  ¡ < �qŠ6 |  |¡I d H  dd„ | jD ƒD ]}
| j}t|
ƒD ]}||v�rTi || ¡ < || ¡  }�qG�q>| jdu �r¥t ddƒ�}t!j"| j|d d!� W d   ƒ n	1 �s~w   Y  t d"dƒ�}t!j"| j|d d!� W d   ƒ d S 1 �sžw   Y  d S d S )#NzGenerating lookuptablerŠ   r   )rd   ri   re   r    )rd   ri   re   rh   r˜   r   )rd   ri   re   rh   ÚdNSHostNameÚservicePrincipalNamer   r   r   r   r   )rj   rh   ri   re   rd   rf   Ú
attributesrf   Tri   r‹   rl   rŽ   r…   rO   rj   rd   rŒ   c                 S   s   g | ]}t |ƒ‘qS r   )r	   )Ú.0r�   r   r   r   Ú
<listcomp>Z  s    z:MSLDAPDump2Bloodhound.dump_lookuptable.<locals>.<listcomp>zdn.jsonÚwé   )Úindentzdntree.json)#rC   r#   Úget_ad_infori   r&   r—   rd   rI   Úget_all_trustsre   Úget_all_usersrh   r%   rq   Úget_all_machinesr«   r¬   Úget_all_groupsÚget_all_ousÚget_all_containersr   Úget_all_gposÚ!get_all_foreignsecurityprincipalsr¤   r   rv   r,   r*   rK   r+   r
   r!   Úopenr^   Údump)r<   rG   Úadinfor‚   r[   rª   r“   ÚbhentryÚgnameÚsidtyper�   rz   r|   Úfr   r   r   Údump_lookuptableù   sÀ   € ü "û (÷ ü 
ü 
ú 	
ü $
 
üç
ýÿ$ÿüz&MSLDAPDump2Bloodhound.dump_lookuptablec              	   Ã   sj  �g }g }| j dt| jƒd�I d H }| jD ]Æ}| j| d }| j |¡I d H \}}|d ur/|‚| ¡ }d dd| jv idœ}| j| d }	|	dkrIq|	d	krOd
}	| ¡ | jvrÓ| jdu r¼ddl	m
}
 | |||	 ¡ || jf¡ t|ƒ| jkr»t ¡ }|
ƒ �}|D ]}| |j|tg|¢R Ž ¡ qW d   ƒ n1 s™w   Y  tj|Ž I d H }|D ]\}}}||f| j| ¡ < q¨g }g }nt|||	 ¡ || jƒ\}}}||f| j| ¡ < |  |¡I d H  qt|ƒdk�r+t ¡ }|
ƒ �8}|D ]}| |j|tg|¢R Ž ¡ qítj|Ž I d H }|D ]\}}}||f| j| ¡ < �qg }g }W d   ƒ n	1 �s&w   Y  |  |¡I d H  d S )NzDumping SDs)rA   r�   Úhaslapszms-mcs-admpwd)ÚIsACLProtectedÚ
Propertiesro   r    r   zorganizational-unitTr   )ÚProcessPoolExecutor)rC   rt   r,   r#   Úget_objectacl_by_dnrq   r-   r.   r   Úconcurrent.futuresrÇ   rX   rw   r'   ÚasyncioÚget_running_loopÚrun_in_executorr   ÚgatherrI   rK   )r<   ÚsdbatchÚtasksrG   Úsidr�   Úsecdescr‚   Úoentryr’   rÇ   ÚloopÚexecutorÚsder   r.   Ú	relationsr   r   r   Ú	dump_aclsh  sf   €

ÿþ
ÿÿ€ùzMSLDAPDump2Bloodhound.dump_aclsc           	      Ã   sì   �|d u rg S g }t |ƒD ]f\}}i }|dk|d< | ¡ }|| jv r-| j| j|  d }n;| j | ¡ ddg¡I d H \}}|d urC|‚|d u sMt|ƒdkrUt d| ¡ qz|d }W n   t d| ¡ Y q| ¡ |d	< | 	|¡ q|S )
Né   Ú
IsEnforcedrn   re   ri   r   rk   z[BH] Missing GUID for %sÚGUID)
r   rq   r*   r,   r#   rs   rt   r   r!   rX   )	r<   ÚgplinksÚlinksÚ	gplink_dnÚoptionsÚlinkÚlguidr�   r‚   r   r   r   Úresolve_gplinkœ  s0   €
 z$MSLDAPDump2Bloodhound.resolve_gplinkc                 C   s6   g }|D ]}|  d¡r| |¡ q|D ]}||= q|S )NÚ_)Ú
startswithrX   )r<   r[   Úto_delÚkr   r   r   Úremove_hidden·  s   

€z#MSLDAPDump2Bloodhound.remove_hiddenc                 Ã   sô  �|   d| jd ¡I d H }| j ¡ I d H \}}|d ur|‚| | j¡}| j|d d  ¡  \}}|d |d< t|| j| j	| j
ƒ|d< |  |d d ¡I d H |d< |  |d ¡I d H |d	< |  d
¡}d}| j ¡ 2 z3 d H W \}	}|d urv|‚|d  |	 ¡ ¡ qh6 |  |¡}|d  |¡ |d d  d7  < |d d | jkr³|  d
||¡I d H  |  d
¡}|d7 }|  |¡I d H  |d d dkrÍ|  d
||¡I d H  |  |¡I d H  | jdu røtddƒ�}
t ||
¡ W d   ƒ d S 1 sñw   Y  d S d S )NzDumping domainsr   rÆ   ÚdistinguishednamerÅ   ÚAcesÚChildObjectsÚ_gPLinkÚLinksÚdomainsr   ÚTrustsrS   rT   rQ   rD   Tzdomains.jsonr°   )rC   r;   r#   r³   Úto_bhr%   r.   rq   r   r&   r,   r„   rá   rV   r´   rX   ræ   r:   rb   rI   rK   r!   r¼   r^   r½   )r<   rG   r¾   r‚   ÚdomainentryrT   rÖ   rZ   Úfilectrr[   rÂ   r   r   r   Údump_domainsÀ  sD   €
ý


"ÿÿz"MSLDAPDump2Bloodhound.dump_domainsc              
   Ã   sX  �|   d| jd ¡I d H }|  d¡}d}| j ¡ 2 zÐ3 d H W \}}|d ur'|‚| | j¡}| j|d d  ¡  \}}|d |d< t	|| j| j
| jƒ|d< |d	 d ur¯i }	|d	 D ]V}
z|
 d
¡d }| d¡d }W n tyy   t d|
¡ Y qXw z| j| ¡  }|d |	v rŠW qXd|	|d < |d  |¡ W qX ty®   d|v r¬|d  | ¡ ¡ Y qXw |  |¡}|d  |¡ |d d  d7  < |d d | jkrá|  d||¡I d H  |  d¡}|d7 }|  |¡I d H  q6 |d d dkrý|  d||¡I d H  |  |¡I d H  | jdu �r*tddƒ�}t ||¡ W d   ƒ d S 1 �s#w   Y  d S d S )NzDumping usersr   Úusersr   rÆ   rç   rÅ   rè   Ú_allowerdtodelegatetor�   rD   r�   ú"[BH] Invalid delegation target: %srn   ÚAllowedToDelegateÚ.rS   rT   rQ   Tz
users.jsonr°   )rC   r;   rV   r#   rµ   rî   r%   r.   rq   r   r&   r,   r‘   Ú
IndexErrorr   r!   r/   rw   rX   ÚKeyErrorræ   r:   rb   rI   rK   r¼   r^   r½   )r<   rG   rZ   rð   Ú	ldapentryr‚   r[   rT   rÖ   ÚseenÚhostr–   rÐ   rÂ   r   r   r   Ú
dump_userså  sb   €
þ€þ

Ý%$ÿÿz MSLDAPDump2Bloodhound.dump_usersc              
   Ã   sø  �|   d| jd ¡I d H }|  d¡}d}| j ¡ 2 �z3 d H W \}}| | j¡}| j|d d  ¡  \}}|d |d< t	|| j| j
| jƒ|d< |d	 d ur�t |d	 ¡}	t|d d  ¡ |d|	| jƒ\}
}}t	|| j| j
| jƒD ]}|d
 dkryqp|d
 dkr�|d  |d |d  ¡ dœ¡ qp|d	= |d d d urýi }|d d D ]Y}z| d¡d }| d¡d }W n tyÄ   t d|¡ Y q£w z| j| ¡  }|d |v rÕW q£d||d < |d  |¡ W q£ tyü   d|v rú|d  | ¡ ddœ¡ Y q£w |  |¡}|d  |¡ |d d  d7  < |d d | jk�r0|  d||¡I d H  |  d¡}|d7 }|  |¡I d H  q6 |d d dk�rM|  d||¡I d H  |  |¡I d H  | jdu �rztddƒ�}t  ||¡ W d   ƒ d S 1 �ssw   Y  d S d S ) NzDumping computersr   Ú	computersr   rÆ   rç   rÅ   rè   Ú$_allowedtoactonbehalfofotheridentityÚ	RightNameÚOwnerÚ
GenericAllÚAllowedToActÚPrincipalSIDÚPrincipalTyperm   Úallowedtodelegater�   rD   r�   rô   rn   rõ   rö   r�   rS   rT   rQ   Tzcomputers.jsonr°   )!rC   r;   rV   r#   r¶   rî   r%   r.   rq   r   r&   r,   Úbase64Ú	b64decoder   r-   rX   rv   r‘   r÷   r   r!   r/   rw   rø   ræ   r:   rb   rI   rK   r¼   r^   r½   )r<   rG   rZ   rð   rù   r‚   r[   rT   rÖ   Ú
allowedaclrâ   ÚentryresÚacerú   rû   r–   rÐ   rÂ   r   r   r   Údump_computers  s~   €
$
þ€þþ€þ

Ï3$ÿÿz$MSLDAPDump2Bloodhound.dump_computersc                 Ã   sò  �|   d| jd ¡I d H }|  d¡}d}| j ¡ 2 zŸ3 d H W \}}| | j¡}| j|d d  ¡  \}}|d |d< t	|| j| j
| jƒ|d< |jd ur~|jD ]/}	|	 ¡ | jv ru| j|	 ¡  }
|d	  | j|
 d
 | j|
 d  ¡ dœ¡ qN|	 d¡dkr}qNqN|  |¡}|d  |¡ |d d  d7  < |d d | jkr°|  d||¡I d H  |  d¡}|d7 }|  |¡I d H  q6 |d d dkrÌ|  d||¡I d H  |  |¡I d H  | jdu r÷tddƒ�}t ||¡ W d   ƒ d S 1 sðw   Y  d S d S )NzDumping groupsr   Úgroupsr   rÆ   rç   rÅ   rè   ÚMembersrn   ro   rm   ÚForeignSecurityPrincipalséÿÿÿÿrS   rT   rQ   rD   Tzgroups.jsonr°   )rC   r;   rV   r#   r·   rî   r%   r.   rq   r   r&   r,   Úmemberr*   rX   rv   Úfindræ   r:   rb   rI   rK   r!   r¼   r^   r½   )r<   rG   rZ   rð   rù   r‚   r[   rT   rÖ   r  ÚoidrÂ   r   r   r   Údump_groupsV  sJ   €



þÿ

ç
"ÿÿz!MSLDAPDump2Bloodhound.dump_groupsc           
      Ã   s†  �|   d| jd ¡I d H }|  d¡}d}| j ¡ 2 zi3 d H W \}}| | j| j¡}| j|d d  	¡  \}}|d |d< t
|| j| j| jƒ|d< |  |¡}|d	  |¡ |d
 d  d7  < |d
 d | jkrz|  d||¡I d H  |  d¡}|d7 }|  |¡I d H  q6 |d
 d dkr–|  d||¡I d H  |  |¡I d H  | jdu rÁtddƒ�}	t ||	¡ W d   ƒ d S 1 sºw   Y  d S d S )NzDumping GPOsr   Úgposr   rÆ   rç   rÅ   rè   rS   rT   rQ   rD   Tz	gpos.jsonr°   )rC   r;   rV   r#   rº   rî   r%   r&   r.   rq   r   r,   ræ   rX   r:   rb   rI   rK   r!   r¼   r^   r½   ©
r<   rG   rZ   rð   rù   r‚   r[   rT   rÖ   rÂ   r   r   r   Ú	dump_gpos}  s4   €


ó
"ÿÿzMSLDAPDump2Bloodhound.dump_gposc           
      Ã   sÆ  �|   d| jd ¡I d H }|  d¡}d}| j ¡ 2 z‰3 d H W \}}|d ur'|‚| | j| j¡}| j|d d  	¡  \}}|d |d< t
|| j| j| jƒ|d< |  |d d ¡I d H |d	< |  |d
 ¡I d H |d< |  |¡}|d  |¡ |d d  d7  < |d d | jkrš|  d||¡I d H  |  d¡}|d7 }|  |¡I d H  q6 |d d dkr¶|  d||¡I d H  |  |¡I d H  | jdu rátddƒ�}	t ||	¡ W d   ƒ d S 1 sÚw   Y  d S d S )NzDumping OUsr   Úousr   rÆ   rç   rÅ   rè   ré   rê   rë   rS   rT   rQ   rD   Tzous.jsonr°   )rC   r;   rV   r#   r¸   rî   r%   r&   r.   rq   r   r,   r„   rá   ræ   rX   r:   rb   rI   rK   r!   r¼   r^   r½   r  r   r   r   Údump_ous˜  s<   €


î
"ÿÿzMSLDAPDump2Bloodhound.dump_ousc           
      Ã   sº  �|   d| jd ¡I d H }|  d¡}d}| j ¡ 2 zƒ3 d H W \}}|d ur'|‚t|jƒr-q| | j| j	¡}| j
|d d  ¡  \}}|d |d< t|| j| j	| jƒ|d< |  |d d ¡I d H |d	< |  |¡}|d
  |¡ |d d  d7  < |d d | jkr”|  d||¡I d H  |  d¡}|d7 }|  |¡I d H  q6 |d d dkr°|  d||¡I d H  |  |¡I d H  | jdu rÛtddƒ�}	t ||	¡ W d   ƒ d S 1 sÔw   Y  d S d S )NzDumping Containersr   Ú
containersr   rÆ   rç   rÅ   rè   ré   rS   rT   rQ   rD   Tzcontainers.jsonr°   )rC   r;   rV   r#   r¹   r   rd   rî   r%   r&   r.   rq   r   r,   r„   ræ   rX   r:   rb   rI   rK   r!   r¼   r^   r½   r  r   r   r   Údump_containers¹  s>   €



î
"ÿÿz%MSLDAPDump2Bloodhound.dump_containersc                 Ã   sb  �t | jtƒr3| j d¡r3| jdd … | _|  d¡I d H  t | j¡I d H | _| j| _|  d¡I d H  t | jtƒdu r´t | jtƒrPt 	| j¡}| 
¡ | _d| j_t | jtƒr`| j 
¡ | _d| j_t | jtƒrj| j| _t | jtƒrytd d | jd�| _|  d¡I d H  d| j_| j ¡ I d H \}}|d ur•|‚|  d	¡I d H  | j ¡ | _| jd
  ¡  dd¡ dd¡| _n| jj ¡  dd¡ dd¡| _|  ¡ I d H  |  ¡ I d H  |  ¡ I d H  t | jdtj¡�:| _|  ¡ I d H  |  ¡ I d H  |  ¡ I d H  |  ¡ I d H  |   ¡ I d H  |  !¡ I d H  |  "¡ I d H  W d   ƒ n	1 �sw   Y  |  d| j ¡I d H  d S )Nzadexplorer://é   z"[+] Parsing ADEXPLORER Snapshot...z[+] Parsing done!FT)r#   z[+] Connecting to LDAP serverz[+] Connected to LDAP serrverÚdefaultNamingContextzDC=rŠ   rc   rö   r°   z[+] Bloodhound data saved to %s)#Ú
isinstancer"   rˆ   rã   r   r   Ú	from_filer#   r   Úfrom_urlÚ
get_clientÚ	keepaliver   r   ÚconnectÚget_server_infor$   rq   Úreplacer%   Ú
rootdomainr‰   rÃ   r×   r9   ÚZipFiler5   ÚZIP_DEFLATEDrñ   rü   r  r  r  r  r  )r<   Úfactoryrâ   r‚   r   r   r   Ú	dump_ldapÙ  sT   €
"ùzMSLDAPDump2Bloodhound.dump_ldapc                 Ã   s   �|   ¡ I d H  d S r   )r)  )r<   r   r   r   Úrun
  s   €zMSLDAPDump2Bloodhound.run)TNTNr   )rD   )r   )rŠ   N)!Ú__name__Ú
__module__Ú__qualname__rˆ   r   r   r   Úboolr?   r   rC   rI   rK   rV   r\   rb   r„   r‰   r—   ru   rÃ   r×   rá   ræ   rñ   rü   r  r  r  r  r  r)  r*  r   r   r   r   r      s4     (


-
&o4	%2?'! 1r   )r6   r9   r^   r  r1   rÊ   r   Ú!msldap.external.bloodhoundpy.aclsr   Ú%msldap.external.bloodhoundpy.resolverr   r   Ú"msldap.external.bloodhoundpy.utilsr   r   r   r	   r
   Úmsldap.commons.factoryr   Úmsldap.connectionr   Úmsldap.clientr   Úmsldap.commons.adexplorerr   Úmsldapr   r   r   r   r   r   r   Ú<module>   s"    