o
    àý°jI!  ã                   @   s˜   d dl mZ 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	m
Z
 e ¡  e d¡ZG dd„ dƒZG dd„ dƒZd	d„ Zed
krJeƒ  dS dS )é    )Úunicode_literalsN)Útrust_flagsÚtrust_directionsÚldd2bloodhoundc                   @   s$   e Zd Zedd„ ƒZedd„ ƒZdS )ÚUtilsc                 C   s*   t jdd| |  d¡d … t jd�dd … S )Nz,DC=Ú.zDC=)Úflagsé   )ÚreÚsubÚfindÚI)Úldap© r   ú‰/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldapdomaindump/convert.pyÚldap_to_domain   s   *zUtils.ldap_to_domainc                 C   sX   | d | d d d dd| d d d   ¡ |  ¡ f d| d v r(| d d d	œS g d	œS )
NÚdnÚ
attributesÚ	objectSidr   Úgroupú%s@%sÚsAMAccountNameÚmemberOf)r   ÚsidÚtypeÚ	principalr   )Úupper)ÚgroupoÚdomainr   r   r   Úget_group_object   s   ûûzUtils.get_group_objectN)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   r   r   r   r   r   r      s
    
r   c                   @   sV   e Z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d„Z
dd„ ZdS )ÚBloodHoundConverterc                 C   s.   g | _ g | _g | _g | _i | _i | _i | _d S )N)Úcomputers_filesÚtrust_filesÚgroup_filesÚ
user_filesÚgroups_by_dnÚgroups_by_sidÚdomaincache)Úselfr   r   r   Ú__init__   s   
zBloodHoundConverter.__init__c                 C   sJ   |  dd¡d }z| j| W S  ty$   t |¡| j|< | j|  Y S w )Nú-é   r   )Úrsplitr+   ÚKeyErrorr   r   )r,   r   r   Údsidr   r   r   Ú
get_domain*   s   þzBloodHoundConverter.get_domainc              
   C   sš   | j D ]G}t |dd¡�}t |¡}W d   ƒ n1 sw   Y  |D ]&}t ||  |d d d |d ¡¡}|| j|d < || j	|d d d < q#qd S )NÚrúutf-8r   r   r   r   )
r'   ÚcodecsÚopenÚjsonÚloadr   r   r3   r)   r*   )r,   ÚfileÚinfileÚdatar   Ú
groupattrsr   r   r   Úbuild_mappings2   s   
ÿ$ýz"BloodHoundConverter.build_mappingsc              
   C   s˜   t  ddd¡�;}| d¡ | jD ])}t  |dd¡�}t |¡}W d   ƒ n1 s)w   Y  |D ]}|  ||¡ q0qW d   ƒ d S 1 sEw   Y  d S )Núgroup_membership.csvÚwr5   z"GroupName,AccountName,AccountType
r4   )r6   r7   Úwriter(   r8   r9   Úwrite_entry_memberships)r,   Úoutfiler:   r;   r<   Úuserr   r   r   Úwrite_users>   s   

ÿÿü"þzBloodHoundConverter.write_usersc              
   C   s�   t  ddd¡�7}| jD ]*}t  |dd¡�}t |¡}W d   ƒ n1 s$w   Y  |D ]	}|  ||d¡ q+qW d   ƒ d S 1 sAw   Y  d S )Nr?   Úar5   r4   Úcomputer)r6   r7   r%   r8   r9   rB   )r,   rC   r:   r;   r<   rG   r   r   r   Úwrite_computersI   s   
ÿÿü"ÿz#BloodHoundConverter.write_computersc                 C   s–   t  ddd¡�:}| j ¡ D ]+}|d D ]$}z| d| j| d |d df ¡ W q ty7   t d|¡ Y qw qW d   ƒ d S 1 sDw   Y  d S )	Nr?   rF   r5   r   ú	%s,%s,%s
r   r   ú,Unknown group %s. Not found in groups cache!)r6   r7   r)   ÚvaluesrA   r1   ÚloggerÚwarning)r,   rC   r   Úmembergroupr   r   r   Úwrite_groupsT   s   &ÿýÿ"ÿz BloodHoundConverter.write_groupsc              
   C   s&  dd„ t  ¡ D ƒ}t ddd¡�y}| d¡ | jD ]g}t |dd¡�}t |¡}W d   ƒ n1 s2w   Y  |D ]F}|d d	 d
 }|td @ rLd}nd}|td @ rWd}	nd}	t	 
|d ¡|d d d
 ||d d d
  |t|	ƒg}
| d |
¡d ¡ q9qW d   ƒ d S 1 sŒw   Y  d S )Nc                 S   s   i | ]	\}}||  ¡ “qS r   )Ú
capitalize)Ú.0ÚmeaningÚflagr   r   r   Ú
<dictcomp>`   s    z4BloodHoundConverter.write_trusts.<locals>.<dictcomp>z
trusts.csvr@   r5   z>SourceDomain,TargetDomain,TrustDirection,TrustType,Transitive
r4   r   ÚtrustAttributesr   ÚWITHIN_FORESTÚParentChildÚExternalÚNON_TRANSITIVEFTr   ÚnameÚtrustDirectionú,Ú
)r   Úitemsr6   r7   rA   r&   r8   r9   r   r   r   ÚstrÚjoin)r,   Údirection_maprC   r:   r;   r<   Útrustr   Ú	trustTypeÚisTransitiveÚoutr   r   r   Úwrite_trusts_   s2   

ÿûîû"þz BloodHoundConverter.write_trustsrD   c           	   	   C   sV  |   |d d d |d ¡}|dkr#d|d d d  ¡ | ¡ f }nd|d d d d d	…  ¡ | ¡ f }d
|d v rh|d d
 D ]$}z| j| }| d|d ||f ¡ W qC tyg   t d|¡ Y qCw |d d d  dd¡d }z| jd||d d d f  }| d|d ||f ¡ W d S  tyª   t d|d d d ¡ Y d S w )Nr   r   r   r   rD   r   r   z%s.%séÿÿÿÿr   rI   r   rJ   r.   r/   z%s-%dÚprimaryGroupIDz*Unknown rid %d. Not found in groups cache!)	r3   r   r)   rA   r1   rL   rM   r0   r*   )	r,   ÚentryrC   Ú
entry_typer   r   r   Úrgroupr2   r   r   r   rB   }   s&   "(
ÿÿz+BloodHoundConverter.write_entry_membershipsc              	   C   sh   | j | j| j| jdœ}|D ]$}| tj¡d }z|| ¡   |¡ W q t	y1   t
 d|¡ Y qw d S )N)zdomain_users.jsonzdomain_groups.jsonzdomain_trusts.jsonzdomain_computers.jsonrg   zUnknown input file: %s)r(   r'   r&   r%   ÚsplitÚosÚsepÚlowerÚappendr1   rL   Údebug)r,   ÚinfilesÚfilemapr:   Úfilenamer   r   r   Úparse_files’   s   üÿzBloodHoundConverter.parse_filesN)rD   )r    r!   r"   r-   r3   r>   rE   rH   rO   rf   rB   ru   r   r   r   r   r$      s    
r$   c                  C   sü   t jdd�} | jdtdddd� | jdd	d
dd� |  ¡ }|jr&t tj	¡ t
ƒ }| |j¡ t|jƒdkr=t d¡ d S t|jƒdkrKt d¡ d S t d¡ | ¡  t d¡ | ¡  t d¡ | ¡  t d¡ | ¡  t d¡ | ¡  tdƒ d S )Nz_LDAPDomainDump to BloodHound CSV converter utility. Supports users/computers/trusts conversion.)ÚdescriptionÚfilesú+ÚFILENAMEz_The ldapdomaindump json files to load. Required files: domain_users.json and domain_groups.json)r   ÚnargsÚmetavarÚhelpz-dz--debugÚ
store_truezEnable debug logger)Úactionr|   r   zTNo domain_groups.json files were specified. Need at least one to perform conversion.zSNo domain_users.json files were specified. Need at least one to perform conversion.zMapping groups...zProcessing userszProcessing groupszProcessing computerszProcessing trustszDone!)ÚargparseÚArgumentParserÚadd_argumentr_   Ú
parse_argsrq   rL   ÚsetLevelÚloggingÚDEBUGr$   ru   rw   Úlenr'   Úerrorr(   r>   rE   rO   rH   rf   Úprint)ÚparserÚargsÚ	converterr   r   r   r   ¢   s2   






Ú__main__)Ú
__future__r   r   rm   r„   r8   r6   r
   Úldapdomaindumpr   r   ÚbasicConfigÚ	getLoggerrL   r   r$   r   r    r   r   r   r   Ú<module>   s"    
 
ÿ