o
    àý°jy±  ã                   @   sv  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Zd dlZd dlmZm	Z	 d dl
mZ d dlZd dlmZmZmZmZmZmZmZ d dlmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dl Z!i d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$“d%d&“d'd(“d)d*“Z"d+d
d,d-ddd.œZ#d+d
d,d-dddddd/d0d1œZ$d+d
d2d3œZ%d+d
d2d4œZ&i d5d6“d7d8“d9d:“d;d<“d=d>“d?d@“dAdB“dCdD“dEdF“dGdH“dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdV“dWdXdYdZd[d\d]œ¥Z'g d^¢Z(g d_¢Z)g d`¢Z*G dadb„ dbƒZ+G dcdd„ ddƒZ,G dedf„ dfƒZ-dgdh„ Z.didj„ Z/dkdl„ Z0dmdn„ Z1e2dokr9e1ƒ  dS dS )pé    N)ÚdatetimeÚ	timedelta)Ú
quote_plus)ÚServerÚ
ConnectionÚSIMPLEÚSYNCÚALLÚSASLÚNTLM)ÚLDAPKeyErrorÚLDAPAttributeErrorÚLDAPCursorErrorÚLDAPInvalidDnError)Ú	attributeÚattrDef)Údn)Ú
format_sidÚACCOUNT_DISABLEDé   ÚACCOUNT_LOCKEDé   ÚPASSWD_NOTREQDé    ÚPASSWD_CANT_CHANGEé@   ÚPASSWORD_STORE_CLEARTEXTé€   ÚNORMAL_ACCOUNTé   ÚWORKSTATION_ACCOUNTi   ÚSERVER_TRUST_ACCOUNTi    ÚDONT_EXPIRE_PASSWDi   ÚSMARTCARD_REQUIREDi   ÚTRUSTED_FOR_DELEGATIONi   ÚNOT_DELEGATEDi   ÚUSE_DES_KEY_ONLYi    ÚDONT_REQ_PREAUTHi  @ ÚPASSWORD_EXPIREDi  € ÚTRUSTED_TO_AUTH_FOR_DELEGATIONi   ÚPARTIAL_SECRETS_ACCOUNTi   é   é   é   )ÚPASSWORD_COMPLEXÚPASSWORD_NO_ANON_CHANGEÚPASSWORD_NO_CLEAR_CHANGEÚLOCKOUT_ADMINSr   ÚREFUSE_PASSWORD_CHANGEi   i   )ÚNON_TRANSITIVEÚUPLEVEL_ONLYÚQUARANTINED_DOMAINÚFOREST_TRANSITIVEÚCROSS_ORGANIZATIONÚWITHIN_FORESTÚTREAT_AS_EXTERNALÚUSES_RC4_ENCRYPTIONÚ$CROSS_ORGANIZATION_NO_TGT_DELEGATIONÚ(CROSS_ORGANIZATION_ENABLE_TGT_DELEGATIONÚ	PIM_TRUSTé   )ÚINBOUNDÚOUTBOUNDÚBIDIRECTIONAL)Ú	DOWNLEVELÚUPLEVELÚMITÚsAMAccountNamezSAM NameÚcnÚCNÚoperatingSystemzOperating SystemÚoperatingSystemServicePackzService PackÚoperatingSystemVersionz
OS VersionÚuserAccountControlÚFlagsÚ	objectSidÚSIDÚmemberOfzMember of groupsÚprimaryGroupIdzPrimary groupÚdNSHostNamezDNS HostnameÚwhenCreatedz
Created onÚwhenChangedz
Changed onÚIPv4zIPv4 AddressÚlockOutObservationWindowzLockout time windowÚlockoutDurationzLockout DurationÚlockoutThresholdzLockout ThresholdÚ	maxPwdAgezMax password agezMin password agezMin password lengthzPassword history lengthzPassword propertieszMachine Account QuotazNETBIOS Domain name)Ú	minPwdAgeÚminPwdLengthÚpwdHistoryLengthÚpwdPropertiesúms-DS-MachineAccountQuotaÚflatName)rF   rE   rQ   rH   rI   rJ   Ú	lastLogonrK   rR   rM   ÚdescriptionÚobjectClass)rF   ÚnamerE   rO   rP   rR   rS   r_   rK   Ú
pwdLastSetrM   r`   ÚservicePrincipalNamera   )
rF   rb   rE   rO   r`   rR   rS   rM   ÚdistinguishedNamera   c                   @   s   e Zd Zdd„ ZdS )ÚdomainDumpConfigc                 C   sd   d| _ d| _d| _d| _d| _d| _d| _d| _d	| _d	| _	d	| _
d
| _d| _d
| _d| _d
| _d S )NÚ.Údomain_groupsÚdomain_usersÚdomain_computersÚdomain_policyÚdomain_trustsÚdomain_users_by_groupÚdomain_computers_by_osTFú	Ú )ÚbasepathÚ
groupsfileÚ	usersfileÚcomputersfileÚ
policyfileÚ
trustsfileÚusers_by_groupÚcomputers_by_osÚ
outputhtmlÚ
outputjsonÚ
outputgrepÚgroupedjsonÚgrepsplitcharÚlookuphostnamesÚ	dnsserverÚminimal©Úself© rƒ   úŠ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldapdomaindump/__init__.pyÚ__init__{   s    
zdomainDumpConfig.__init__N)Ú__name__Ú
__module__Ú__qualname__r…   rƒ   rƒ   rƒ   r„   rf   z   s    rf   c                   @   sÐ   e Zd Zd2dd„Zdd„ Zd2d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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*d+„ Zd,d-„ Zd.d/„ Zd0d1„ ZdS )3ÚdomainDumperNc                 C   sZ   || _ || _|| _|d u r|  ¡ | _n|| _d | _d | _d | _d | _d | _	d | _
d | _d S ©N)ÚserverÚ
connectionÚconfigÚgetRootÚrootÚusersÚgroupsÚ	computersÚpolicyÚgroups_dnmapÚgroups_dictÚtrusts)r‚   r‹   rŒ   r   r   rƒ   rƒ   r„   r…   œ   s   
zdomainDumper.__init__c                 C   s   | j jjd d S )NÚdefaultNamingContextr   )r‹   ÚinfoÚotherr   rƒ   rƒ   r„   rŽ   ®   s   zdomainDumper.getRootc                 C   s´   | j j| jd| g d¢d z | j jd d j}|d ur,| |  || j jd d j¡¡ |W S  tyO   |d urK|  || j jd d j¡}|g Y S g  Y S  t	yY   g  Y S w )Nz?(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s)))rF   rO   rP   ©Ú
attributesr   rO   rP   )
rŒ   Úsearchr   ÚentriesÚvaluesÚappendÚgetGroupDNfromIDÚvaluer   Ú
IndexError)r‚   ÚusernameÚ	domainsidr‘   Úprimarygrouprƒ   rƒ   r„   ÚgetCurrentUserGroups²   s    
þz!domainDumper.getCurrentUserGroupsc                 C   sÚ   |   ¡ }|  ||¡}|  |¡}|  |¡}|D ] }d|v s$d|v s$||kr' dS d|v s3|dur6||kr6 dS q| jj| jd||f ddgd	 t| jjƒd
krQdS | jj| jd||f ddgd	 t| jjƒd
krkdS dS )NzCN=AdministratorszCN=Domain AdminsTzCN=Enterprise AdminsFze(&(objectCategory=person)(objectClass=user)(sAMAccountName=%s)(memberOf:1.2.840.113556.1.4.1941:=%s))rF   rE   rš   r   )	Ú
getRootSidr¦   ÚgetDAGroupDNÚgetEAGroupDNrŒ   rœ   r   Úlenr   )r‚   r£   r¤   r‘   Ú	dagroupdnÚ	eagroupdnÚgrouprƒ   rƒ   r„   ÚisDomainAdminÅ   s"   

€  zdomainDumper.isDomainAdminc                 C   óZ   | j jr| jjjjd| j dtddd | jj
S | jjjjd| j dtj	ddd | jj
S )Nú%sz,(&(objectCategory=person)(objectClass=user))éô  F©r›   Ú
paged_sizeÚ	generator©r   r€   rŒ   ÚextendÚstandardÚpaged_searchr   ÚMINIMAL_USERATTRIBUTESÚldap3ÚALL_ATTRIBUTESr   r   rƒ   rƒ   r„   ÚgetAllUsersÝ   ó
    "ÿzdomainDumper.getAllUsersc                 C   r¯   )Nr°   z+(&(objectClass=computer)(objectClass=user))r±   Fr²   )r   r€   rŒ   r¶   r·   r¸   r   ÚMINIMAL_COMPUTERATTRIBUTESrº   r»   r   r   rƒ   rƒ   r„   ÚgetAllComputerså   r½   zdomainDumper.getAllComputersc                 C   r¯   )Nr°   zD(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))r±   Fr²   rµ   r   rƒ   rƒ   r„   ÚgetAllUserSpnsí   r½   zdomainDumper.getAllUserSpnsc                 C   sR   | j jr| jjjj| jdtddd | jj
S | jjjj| jdtj	ddd | jj
S )Nz(objectClass=group)r±   Fr²   )r   r€   rŒ   r¶   r·   r¸   r   ÚMINIMAL_GROUPATTRIBUTESrº   r»   r   r   rƒ   rƒ   r„   ÚgetAllGroupsõ   s
   ÿzdomainDumper.getAllGroupsc                 C   ó   | j j| jdtjd | j jS )Nú(objectClass=domain)rš   ©rŒ   rœ   r   rº   r»   r   r   rƒ   rƒ   r„   ÚgetDomainPolicyý   ó   zdomainDumper.getDomainPolicyc                 C   rÃ   )Nz(objectClass=trustedDomain)rš   rÅ   r   rƒ   rƒ   r„   Ú	getTrusts  rÇ   zdomainDumper.getTrustsc                 C   rÃ   )Nz.(groupType:1.2.840.113556.1.4.803:=2147483648)rš   rÅ   r   rƒ   rƒ   r„   ÚgetAllSecurityGroups	  rÇ   z!domainDumper.getAllSecurityGroupsc              
   C   sF   | j j| jddgd z
| j jd j}W |S  tttfy"   Y dS w )NrÄ   rM   rš   r   F)rŒ   rœ   r   r   rM   r   r   r¢   )r‚   Úsidrƒ   rƒ   r„   r§     s   þÿzdomainDumper.getRootSidc                 C   s(   | j jjj| jd| tddd | j jS )NzR(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=%s))r±   Fr²   )rŒ   r¶   r·   r¸   r   r¹   r   )r‚   Úgroupdnrƒ   rƒ   r„   ÚgetRecursiveGroupmembers  s    z%domainDumper.getRecursiveGroupmembersc                 C   s0   | j j| jd||f dgd | j jd d jS )Nz(objectSid=%s-%d)re   rš   r   )rŒ   rœ   r   r   r¡   )r‚   r¤   Úgidrƒ   rƒ   r„   r      s   zdomainDumper.getGroupDNfromIDc                 C   s   |   |d¡S )Nr   )r    ©r‚   r¤   rƒ   rƒ   r„   r¨   !  s   zdomainDumper.getDAGroupDNc              
   C   s*   z|   |d¡W S  tttfy   Y dS w )Ni  F)r    r   r   r¢   rÎ   rƒ   rƒ   r„   r©   %  s
   þzdomainDumper.getEAGroupDNc              
   C   sö   t j ¡ }d|_t d¡}| jjdkr| jjg|_| j	D ]\}z| 
|jjd d¡}t|jjd d ƒ}W n% t jjyA   d}Y n t jjyM   d}Y n ttfyY   d}Y nw t ||d ¡}||jd	< |g|jd
< |g|jd< ||jjd< qd S )Nr   Úipv4rp   r   ÚAzerror.NXDOMAINzerror.TIMEOUTzerror.NOHOSTNAMEÚ	_responseÚ
raw_valuesrž   rT   )ÚdnsÚresolverÚResolverÚlifetimer   ÚAttrDefr   r   Únameserversr’   ÚqueryrQ   rž   ÚstrÚresponseÚanswerÚNXDOMAINÚTimeoutr   r   r   Ú	AttributeÚ__dict__Ú_stater›   )r‚   ÚdnsresolverÚipdefÚcomputerÚanswersÚipÚipattrƒ   rƒ   r„   ÚlookupComputerDnsNames.  s,   


ÿ
ðz#domainDumper.lookupComputerDnsNamesc              
   C   sl   i }|D ]/}z|j jpd}W n ttfy   d}Y nw z	||  |¡ W q ty3   |g||< Y qw |S )NÚUnknown)rH   r¡   r   r   rŸ   ÚKeyError)r‚   ÚitemsÚosdicträ   Úcosrƒ   rƒ   r„   ÚsortComputersByOSG  s   ÿþzdomainDumper.sortComputersByOSc                 C   s@   i }| j D ]}t|jj d¡d ƒ}|jjd ||< q|| _|S )Nú-éÿÿÿÿr   )r‘   ÚintrM   r¡   Úsplitre   rž   r”   )r‚   Údnmapr­   rÍ   rƒ   rƒ   r„   ÚmapGroupsIdsToDnsW  s   
zdomainDumper.mapGroupsIdsToDnsc                 C   s   dd„ | j D ƒ}|| _|S )Nc                 S   s   i | ]	}|j jd  |“qS )r   )rF   rž   )Ú.0Úgrprƒ   rƒ   r„   Ú
<dictcomp>a  s    z5domainDumper.createGroupsDictByCn.<locals>.<dictcomp>)r‘   r•   )r‚   Úgdictrƒ   rƒ   r„   ÚcreateGroupsDictByCn`  s   z!domainDumper.createGroupsDictByCnc                 C   s   |   t |¡d d ¡}|S )Nr   r+   )Ú
unescapecnr   Úparse_dn)r‚   ÚdninrF   rƒ   rƒ   r„   ÚgetGroupCnFromDnf  s   zdomainDumper.getGroupCnFromDnc                 C   ó   dD ]
}|  d| |¡}q|S ©Nz "#+,;<=>\ ú\©Úreplace©r‚   rF   Úcrƒ   rƒ   r„   rú   k  ó   zdomainDumper.unescapecnc              
      s2  i }ˆ j d u rˆ  ¡  |D ]R}z‡ fdd„|jjD ƒ}W n ttfy)   g }Y nw z| ˆ  ˆ j |jj	 ¡¡ W n	 t
yB   Y nw |D ]}z	||  |¡ W qE t
y^   |g||< Y qEw qˆ jD ]3}z&|jjD ]}z|ˆ  |¡  |¡ W qj t
y‰   |g|ˆ  |¡< Y qjw W qc ttfy–   Y qcw |S )Nc                    s   g | ]}ˆ   |¡‘qS rƒ   )rý   )rõ   r­   r   rƒ   r„   Ú
<listcomp>x  s    z1domainDumper.sortUsersByGroup.<locals>.<listcomp>)r”   rô   rO   rž   r   r   rŸ   rý   rP   r¡   rê   r‘   )r‚   rë   Ú
groupsdictÚuserÚugroupsr­   Úparentgrouprƒ   r   r„   ÚsortUsersByGroupq  sD   
ÿÿþý
þýÿzdomainDumper.sortUsersByGroupc                 C   s–   |   ¡ | _|  ¡ | _|  ¡ | _| jjr|  ¡  |  	¡ | _
|  ¡ | _t| jƒ}| | ¡ | | ¡ | | ¡ | | ¡ | | ¡ | | ¡ | | ¡ d S rŠ   )r¼   r   r¿   r’   rÂ   r‘   r   r~   rè   rÆ   r“   rÈ   r–   ÚreportWriterÚgenerateUsersReportÚgenerateGroupsReportÚgenerateComputersReportÚgeneratePolicyReportÚgenerateTrustsReportÚgenerateComputersByOsReportÚgenerateUsersByGroupReport)r‚   Úrwrƒ   rƒ   r„   Ú
domainDump™  s   











zdomainDumper.domainDumprŠ   )r†   r‡   rˆ   r…   rŽ   r¦   r®   r¼   r¿   rÀ   rÂ   rÆ   rÈ   rÉ   r§   rÌ   r    r¨   r©   rè   rî   rô   rù   rý   rú   r  r  rƒ   rƒ   rƒ   r„   r‰   ›   s2    

			(r‰   c                   @   s  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	dGdd„Z
dd„ ZdHdd„ZdIdd„Zdd„ Zdd„ ZdJd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;d<„ Zd=d>„ Zd?d@„ Z dAdB„ Z!dCdD„ Z"dEdF„ Z#dS )Kr  c                 C   s`   || _ d | _| j jrg d¢| _ng d¢| _g d¢| _g d¢| _g d¢| _g d¢| _g d¢| _d S )N)rF   rE   rQ   rT   rH   rI   rJ   r_   rK   rR   rM   r`   )rF   rE   rQ   rH   rI   rJ   r_   rK   rR   rM   r`   )rF   rb   rE   rO   rP   rR   rS   r_   rK   rc   rM   r`   rd   )rF   rb   rE   rR   rS   r_   rK   rc   rM   r`   rd   )rF   rE   rO   r`   rR   rS   rM   )
re   rU   rV   rW   rX   rY   rZ   r[   r\   r]   )rF   r^   ÚsecurityIdentifierÚtrustAttributesÚtrustDirectionÚ	trustType)	r   Úddr~   ÚcomputerattributesÚuserattributesÚuserattributes_groupedÚgroupattributesÚpolicyattributesÚtrustattributes)r‚   r   rƒ   rƒ   r„   r…   «  s   




zreportWriter.__init__c                 C   s,   |  dd¡  dd¡  dd¡  dd¡  d	d
¡S )Nú&z&amp;ú<z&lt;ú>z&gt;ú'z&#39;ú"z&quot;r  )r‚   Úhtmlrƒ   rƒ   r„   Ú
htmlescapeº  s   ,zreportWriter.htmlescapec                 C   rþ   rÿ   r  r  rƒ   rƒ   r„   rú   ¾  r  zreportWriter.unescapecnc                 C   ó&   t |tƒr| ¡ d S t|ƒd d S )Ni€Q çH¯¼šò×z>©Ú
isinstancer   Útotal_secondsÚabs©r‚   Úlengthrƒ   rƒ   r„   ÚnsToDaysÄ  ó   
zreportWriter.nsToDaysc                 C   r(  )Né<   r)  r*  r.  rƒ   rƒ   r„   ÚnsToMinutesË  r1  zreportWriter.nsToMinutesc                 C   sH   g }|d u s|j d u r|S | ¡ D ]\}}t|j ƒ|@ r!| |¡ q|S rŠ   )r¡   rë   rñ   rŸ   ©r‚   ÚattrÚ	flags_defÚoutflagsÚflagÚvalrƒ   rƒ   r„   Ú
parseFlagsÓ  s   
€zreportWriter.parseFlagsc                 C   s>   g }|d u r|S |  ¡ D ]\}}t|jƒ|kr| |¡ q|S rŠ   )rë   rñ   r¡   rŸ   r4  rƒ   rƒ   r„   ÚparseSingleFlagÝ  s   
€zreportWriter.parseSingleFlagrp   TFc                 C   s8  g }|r	|  d¡ |dkr|  dt|ƒ|  |¡|f ¡ |  d¡ |D ]#}z|  d|  t| ¡ ¡ W q# tyF   |  d|  |¡ ¡ Y q#w |  d¡ |D ]C}|rad|d jv rad	}	|  d
¡ nd}	|  d¡ |D ]!}
z|  d|  ||
 |	¡ ¡ W qj tt	fy‹   |  d¡ Y qjw |  d¡ qN|  d¡ d 
|¡S )Nz<table>rp   z;<thead><tr><td colspan="%d" id="cn_%s">%s</td></tr></thead>z<tbody><tr>z<th>%s</th>z</tr>
r­   ra   Tz<tr class="group">Fz<tr>z<td>%s</td>z<td>&nbsp;</td>z	</tbody>
)rŸ   rª   ÚformatIdr'  Úattr_translationsrê   rž   ÚformatAttributer   r   Újoin)r‚   Úlistabler›   ÚheaderÚ
firstTableÚspecialGroupsFormatÚofÚhdrÚliÚ	liIsGroupÚattrƒ   rƒ   r„   ÚgenerateHtmlTableç  s8   

ÿ

ÿ

zreportWriter.generateHtmlTablec                 c   s:    d}|  ¡ D ]\}}| j||||ddV  |rd}qd S )NT)rC  F)rë   rI  )r‚   r‘   r›   ÚfirstÚ	groupnameÚmembersrƒ   rƒ   r„   ÚgenerateGroupedHtmlTables  s   €€ýz&reportWriter.generateGroupedHtmlTablesNc           
   	   C   s:  t j | jj¡st  | jj¡ t j | jj|¡}t |dd¡t}| 	d¡ z1tt j t j 
t¡d¡dƒ}| 	d¡ | 	| ¡ ¡ | 	d¡ W d   ƒ n1 sPw   Y  W n tyc   tdƒ Y nw | 	d	¡ |d u rs| 	|¡ n||Ž D ]}	| 	|	¡ qw|r†| 	d
¡ | 	d¡ W d   ƒ d S 1 s–w   Y  d S )NÚwÚutf8z3<!DOCTYPE html>
<html>
<head><meta charset="UTF-8">z	style.cssÚrz<style type="text/css">z</style>zAstyle.css not found in package directory, styling will be skippedz</head><body>z</table>z</body></html>)ÚosÚpathÚexistsr   rq   Úmakedirsr?  ÚcodecsÚopenÚwriteÚdirnameÚ__file__ÚreadÚIOErrorÚlog_warn)
r‚   Úrel_outfileÚbodyÚgenfuncÚgenargsÚ
closeTableÚoutfilerD  ÚsfÚtpartrƒ   rƒ   r„   ÚwriteHtmlFile  s0   

ý€ÿ

"ìzreportWriter.writeHtmlFilec                 C   s    t j | jj¡st  | jj¡ t j | jj|¡}t |dd¡'}|d u r*| 	|¡ n||Ž D ]}| 	|¡ q.W d   ƒ d S W d   ƒ d S 1 sIw   Y  d S ©NrN  rO  ©
rQ  rR  rS  r   rq   rT  r?  rU  rV  rW  )r‚   r]  Újsondatar_  r`  rb  rD  Újpartrƒ   rƒ   r„   ÚwriteJsonFile.  s   ýý"ûzreportWriter.writeJsonFilec                 C   sn   t j | jj¡st  | jj¡ t j | jj|¡}t |dd¡}| 	|¡ W d   ƒ d S 1 s0w   Y  d S rf  rg  )r‚   r]  r^  rb  rD  rƒ   rƒ   r„   ÚwriteGrepFile;  s   "ÿzreportWriter.writeGrepFilec                 C   sx   t |ƒtu rz| d¡W S  ty   Y dS w t |ƒtu r"| d¡S t |ƒtu r*|S t |ƒtu r4t|ƒS |d u r:dS |S )Nz%x %XÚ0rO  rp   )Útyper   ÚstrftimeÚ
ValueErrorÚbytesÚencoderÚ   rñ   )r‚   r¡   rƒ   rƒ   r„   ÚformatStringC  s   þ
zreportWriter.formatStringc                 C   sà  |j  ¡ }|dkrd |  |t¡¡S |dks!|dkr't|jƒtu r'|  |j¡S |dkr8t|jƒtu r8|  	|j¡S |dkrSz|  | j
j|j g¡W S  tyR   Y dS w |dkrdt|jƒtu rdd	 |j¡S |d
krqd |  |t¡¡S |dkr~d |  |t¡¡S |dkr’|jdkr‰dS d |  |t¡¡S |dkrŸd |  |t¡¡S |dkrªt|jd ƒS |dks²|dkrºd|  |j¡ S |dksÂ|dkrÊd|  |j¡ S |dkrÛd|j|j d¡d f S |dkrç|rç|  |j¡S |  |  |j¡¡S )NÚuseraccountcontrolú, ÚmemberÚmemberofÚserviceprincipalnameÚprimarygroupidú
NOT FOUND!r`   ú Úpwdpropertiesr   Útrustdirectionr   ÚDISABLEDÚ	trusttypeÚsecurityidentifierÚ	minpwdageÚ	maxpwdageú	%.2f daysÚlockoutobservationwindowÚlockoutdurationú%.1f minutesÚ	objectsidz<abbr title="%s">%s</abbr>rï   rð   rF   )ÚkeyÚlowerr?  r:  Ú	uac_flagsrm  rž   ÚlistÚformatGroupsHtmlÚformatSPNsHtmlr  r”   r¡   rê   Ú	pwd_flagsÚtrust_flagsr;  Útrust_directionsÚ
trust_typer   rÒ   r0  r3  rò   ÚformatCnWithGroupLinkr'  rr  )r‚   rH  ÚformatCnAsGroupÚanamerƒ   rƒ   r„   r>  W  sH   
ÿ
zreportWriter.formatAttributec                 C   s    d|   |¡|  |¡|  |¡f S )Nz)Group: <a href="#cn_%s" title="%s">%s</a>)r<  r'  ©r‚   rF   rƒ   rƒ   r„   r‘  …  s    z"reportWriter.formatCnWithGroupLinkc                 C   s   t  dd|¡S )Nz[^a-zA-Z0-9_\-]+Ú_)ÚreÚsubr”  rƒ   rƒ   r„   r<  ‰  s   zreportWriter.formatIdc                 C   s~   z2|dd …   d¡}|dd …   d¡}||k r%|dd …  d¡d }W |S |dd …  d¡d }W |S  ty>   |}Y |S w )Nr>   z,CN=z,OU=r   )Úindexrò   ro  )r‚   r   ÚindcnÚindourF   rƒ   rƒ   r„   ÚparseDnFallback  s   ýþþzreportWriter.parseDnFallbackc              
   C   sˆ   g }|D ]:}z|   t |¡d d ¡}W n ty%   |   |  |¡¡}Y nw | d| jjt|  	|¡ƒ|  
|¡|  
|¡f ¡ qd |¡S )Nr   r+   z)<a href="%s.html#cn_%s" title="%s">%s</a>rt  )rú   r   rû   r   r›  rŸ   r   rw   r   r<  r'  r?  ©r‚   Ú	grouplistÚoutcacher­   rF   rƒ   rƒ   r„   r‹  š  s   þ2
zreportWriter.formatGroupsHtmlc              	   C   sb   g }|D ]'}z|   t |¡d d ¡}W n ty%   |   |  |¡¡}Y nw | |¡ qd |¡S )Nr   r+   rt  )rú   r   rû   r   r›  rŸ   r?  rœ  rƒ   rƒ   r„   ÚformatGroupsGrep¦  s   þ
zreportWriter.formatGroupsGrepc                 C   ó
   d  |¡S )Nz<br />©r?  ©r‚   Úspnlistrƒ   rƒ   r„   rŒ  ²  ó   
zreportWriter.formatSPNsHtmlc                 C   r   )Nú,r¡  r¢  rƒ   rƒ   r„   ÚformatSPNsGrep¶  r¤  zreportWriter.formatSPNsGrepc                 C   s   |j  ¡ }|dkrd |  |t¡¡S |dks!|dkr't|jƒtu r'|  |j¡S |dkr8t|jƒtu r8|  	|j¡S |dkrSz|  | j
j|j g¡W S  tyR   Y dS w |dkrdt|jƒtu rdd	 |j¡S |d
krqd |  |t¡¡S |dkr…|jdkr|dS d |  |t¡¡S |dkr’d |  |t¡¡S |dkrt|jd ƒS |dkrªd |  |t¡¡S |dks²|dkrºd|  |j¡ S |dksÂ|dkrÊd|  |j¡ S |  |j¡S )Nrs  rt  ru  rv  rw  rx  ry  r`   rz  r   r|  r   r}  r~  r  r{  r€  r  r‚  rƒ  r„  r…  )r‡  rˆ  r?  r:  r‰  rm  rž   rŠ  rŸ  r¦  r  r”   r¡   rê   rŽ  r;  r  r  r   rÒ   r  r0  r3  rr  )r‚   rH  r“  rƒ   rƒ   r„   ÚformatGrepAttributeº  s@   
ÿ
z reportWriter.formatGrepAttributec                 C   s†   | j j |¡}|g}|D ]1}g }|D ] }z| |  || ¡pd¡ W q ttfy2   | d¡ Y qw | | j j |¡¡ qd |¡S )Nrp   Ú
)r   r}   r?  rŸ   r§  r   r   )r‚   Ú	entrylistr›   rE  ÚoutÚentryÚeor5  rƒ   rƒ   r„   ÚgenerateGrepListá  s   ÿ
zreportWriter.generateGrepListc                 C   s    dd  dd„ |D ƒ¡ d }|S )Nú[r¥  c                 S   s   g | ]}|  ¡ ‘qS rƒ   )Úentry_to_json)rõ   r«  rƒ   rƒ   r„   r  ò  s    z1reportWriter.generateJsonList.<locals>.<listcomp>ú]r¡  )r‚   r©  rª  rƒ   rƒ   r„   ÚgenerateJsonListñ  s   zreportWriter.generateJsonListc                 C   s$   dt  |d ¡|  |d ¡f }|S )Nz{%s:%s}r   r+   )ÚjsonÚdumpsr±  )r‚   r­   rª  rƒ   rƒ   r„   ÚgenerateJsonGroup÷  s    zreportWriter.generateJsonGroupc                 c   s@    dV  d}|  ¡ D ]}|sdV  nd}|  |¡V  q
dV  d S )Nr®  Tr¥  Fr°  )rë   r´  )r‚   r‘   Ú
firstGroupr­   rƒ   rƒ   r„   ÚgenerateJsonGroupedListþ  s   €
z$reportWriter.generateJsonGroupedListc                 C   óp   |  |j¡}| jjr| jd| jj d | j|| jfd | jjr4| jj	r6| j
d| jj d | j|fd d S d S d S ©Nú%s.html)r_  r`  ú%s.json)rî   r’   r   ry   re  rx   rM  r  rz   r|   rj  r¶  ©r‚   r  Úgroupedrƒ   rƒ   r„   r    ó   ""ÿz(reportWriter.generateComputersByOsReportc                 C   r·  r¸  )r  r   r   ry   re  rw   rM  r  rz   r|   rj  r¶  r»  rƒ   rƒ   r„   r    r½  z'reportWriter.generateUsersByGroupReportc                 C   s˜   || _ | ¡  | jjr|  |j| jd¡}|  d| jj |¡ | jj	r4|  
|j| j¡}|  d| jj |¡ | jjrJ|  |j¡}|  d| jj |¡ d S d S )NzDomain usersr¹  ú%s.greprº  )r  rô   r   ry   rI  r   r  re  rs   r{   r­  rk  rz   r±  rj  ©r‚   r  r&  ÚgrepoutÚjsonoutrƒ   rƒ   r„   r    s   þz reportWriter.generateUsersReportc                 C   óŠ   | j jr|  |j| jd¡}|  d| j j |¡ | j jr-|  |j| j¡}|  	d| j j |¡ | j j
rC|  |j¡}|  d| j j |¡ d S d S )NzDomain computer accountsr¹  r¾  rº  )r   ry   rI  r’   r  re  rt   r{   r­  rk  rz   r±  rj  r¿  rƒ   rƒ   r„   r  -  ó   þz$reportWriter.generateComputersReportc                 C   rÂ  )NzDomain groupsr¹  r¾  rº  )r   ry   rI  r‘   r  re  rr   r{   r­  rk  rz   r±  rj  r¿  rƒ   rƒ   r„   r  9  rÃ  z!reportWriter.generateGroupsReportc                 C   rÂ  )NzDomain policyr¹  r¾  rº  )r   ry   rI  r“   r  re  ru   r{   r­  rk  rz   r±  rj  r¿  rƒ   rƒ   r„   r  E  rÃ  z!reportWriter.generatePolicyReportc                 C   rÂ  )NzDomain trustsr¹  r¾  rº  )r   ry   rI  r–   r   re  rv   r{   r­  rk  rz   r±  rj  r¿  rƒ   rƒ   r„   r  Q  rÃ  z!reportWriter.generateTrustsReport)rp   TF)NNT)NN)F)$r†   r‡   rˆ   r…   r'  rú   r0  r3  r:  r;  rI  rM  re  rj  rk  rr  r>  r‘  r<  r›  r‹  rŸ  rŒ  r¦  r§  r­  r±  r´  r¶  r  r  r  r  r  r  r  rƒ   rƒ   rƒ   r„   r  ª  sD    


$


.'		r  c                 C   ó   t d|  ƒ d S )Nz[!] %s©Úprint©Útextrƒ   rƒ   r„   r\  ]  ó   r\  c                 C   rÄ  )Nz[*] %srÅ  rÇ  rƒ   rƒ   r„   Úlog_info_  rÉ  rÊ  c                 C   rÄ  )Nz[+] %srÅ  rÇ  rƒ   rƒ   r„   Úlog_successa  rÉ  rË  c            	      C   sŒ  t jdd} d| j_d| j_| jdtddd | jd	d
tddd | jddtddd | jddtddgddd |  d¡}|jddtddd |jdddd |jd dd!d |jd"dd#d |jd$dd%d&d' |jd(d)d*d+ |  d,¡}|jd-d.dd/d |jd0d1d2d+ |jd3d4dd%d5d' |  ¡ }t	ƒ }|j
rd6|_|jd ur¦|j|_|jr¬d6|_|jd urµ|j|_|jr»d%|_|jrÁd%|_|jrÇd%|_|jd urÐ|j|_|j|_d }|jd urþ|jdkrãd}nt}d7|jvrótd8ƒ t  d9¡ |j!d u rýt" "¡ |_!nt#d:ƒ t$|j%t&d;}t#d<ƒ t'||j|j!|d=}t#d>ƒ | (¡ s.td?ƒ t|j)ƒ t  d9¡ t*d@ƒ t#dAƒ t+|||ƒ}| ,¡  t*dBƒ d S )CNz}Domain information dumper via LDAP. Dumps users/computers/groups and OS/membership information to HTML/JSON/greppable output.)r`   zMain optionszRequired optionsÚhostÚHOSTNAMEzYHostname/ip or ldap://host:port connection string to connect to (use ldaps:// to use SSL))rm  ÚmetavarÚhelpz-uz--userÚUSERNAMEzLDOMAIN\username for authentication, leave empty for anonymous authenticationz-pz
--passwordÚPASSWORDz6Password or LM:NTLM hash, will prompt if not specifiedz-atz
--authtyper   r   z3Authentication type (NTLM or SIMPLE, default: NTLM))rm  ÚchoicesÚdefaultrÏ  zOutput optionsz-oz--outdirÚ	DIRECTORYz<Directory in which the dump will be saved (default: current)z	--no-htmlÚ
store_truezDisable HTML output)ÚactionrÏ  z	--no-jsonzDisable JSON outputz	--no-grepzDisable Greppable outputz--grouped-jsonFz;Also write json files for grouped files (default: disabled))rÖ  rÓ  rÏ  z-dz--delimiterz3Field delimiter for greppable output (default: tab))rÏ  zMisc optionsz-rz	--resolvezXResolve computer hostnames (might take a while and cause high traffic on large networks)z-nz--dns-serverzJUse custom DNS resolver instead of system DNS (try a domain controller IP)z-mz	--minimalz;Only query minimal set of attributes to limit memmory usageTr   z4Username must include a domain, use: DOMAIN\usernamer+   zoConnecting as anonymous user, dumping will probably fail. Consider specifying a username/password to login with)Úget_infozConnecting to host...)r  ÚpasswordÚauthenticationzBinding to hostz)Could not bind with specified credentialszBind OKzStarting domain dumpzDomain dump finished)-ÚargparseÚArgumentParserÚ
_optionalsÚtitleÚ_positionalsÚadd_argumentrÚ   Úadd_argument_groupÚ
parse_argsrf   Úresolver~   Ú
dns_serverr   r€   Ú	delimiterr}   Úno_htmlry   Úno_jsonrz   Úno_grepr{   Úoutdirrq   Úgrouped_jsonr|   r  Úauthtyper   r\  ÚsysÚexitrØ  ÚgetpassrÊ  r   rÌ  r	   r   ÚbindÚresultrË  r‰   r  )	ÚparserÚoutputgroupÚ	miscgroupÚargsÚcnfrÙ  Úsr  r  rƒ   rƒ   r„   Úmaind  s|   










€


rö  Ú__main__)3rë  rQ  r–  rU  r²  rÚ  rí  Úbase64r   r   Úurllib.parser   rº   r   r   r   r   r	   r
   r   Úldap3.core.exceptionsr   r   r   r   Úldap3.abstractr   r   Úldap3.utilsr   Ú$ldap3.protocol.formatters.formattersr   Údns.resolverrÓ   r‰  r  rŽ  r  r  r=  r¾   r¹   rÁ   rf   r‰   r  r\  rÊ  rË  rö  r†   rƒ   rƒ   rƒ   r„   Ú<module>   s   @$ÿþýüûúùø	÷
öõôóòñðû	öþþÿþýüûúùø	÷
öõôóòñðê!     6
[
ÿ