o
    àý°jØ.  ã                
   @   sŠ  d dl mZ d dl mZ d dl m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 d dlmZ d d	lmZmZ d d
lmZmZ G dd„ dƒZedk�rCeejƒ ejddd�Zejdddd� ejddddd� ejdddd� ejdddd� ejdddd� e d ¡Zejd!dd"d#d� ejd$dd%d� ejd&dd'd� ejd(dd)d*d� e d+¡Zejd,dd-d.d� ejd/dd0d1d� eej ƒd2krÙe !¡  e "d2¡ e #¡ Z$e %e$j&e$j'¡ ee$j(e$j)e$j*e$j+e$j,ƒ\Z-Z.Z/Z0Z0e$_,e-d3k�re 1d4¡ e "d2¡ zee.e/e-e$ƒZ2e2 3¡  W dS  e4�yB Z5 ze 6¡ j7ej8k�r0d dl9Z9e9 :¡  e ;e<e5ƒ¡ W Y dZ5[5dS dZ5[5ww dS )5é    )Údivision)Úprint_function)Úunicode_literalsN)Údatetime)Úversion)ÚUF_ACCOUNTDISABLE)Úlogger)Úparse_identityÚ
ldap_login)ÚldapÚldapasn1c                   @   s0   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	S )
ÚGetADComputersc                 C   s$  || _ || _|| _|| _d | _d| _d| _|j| _|j	| _
|j| _|j| _|j| _|j| _|jd ur<|j d¡\| _| _| j d¡}d| _|D ]}|  jd| 7  _qG| jd d… | _| jrxg d¢| _g d¢| _d d	d
„ t| jƒD ƒ¡| _d S g d¢| _g d¢| _d dd
„ t| jƒD ƒ¡| _d S )NÚ ú:Ú.zdc=%s,éÿÿÿÿ)úSAM AcctNameúDNS Hostnameú
OS VersionÚOSÚ	IPAddress)é   é#   r   r   é   ú c                 S   ó   g | ]
\}}d ||f ‘qS ©z	{%d:%ds} © ©Ú.0ÚnumÚwidthr   r   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/GetADComputers.pyÚ
<listcomp>M   ó    z+GetADComputers.__init__.<locals>.<listcomp>)r   r   r   r   )r   r   r   r   c                 S   r   r   r   r   r   r   r"   r#   S   r$   )ÚoptionsÚ_GetADComputers__usernameÚ_GetADComputers__passwordÚ_GetADComputers__domainÚ_GetADComputers__targetÚ_GetADComputers__lmhashÚ_GetADComputers__nthashÚaesKeyÚ_GetADComputers__aesKeyÚkÚ_GetADComputers__doKerberosÚdc_ipÚ_GetADComputers__kdcIPÚdc_hostÚ_GetADComputers__kdcHostÚuserÚ_GetADComputers__requestUserÚ	resolveIPÚ_GetADComputers__resolveIPÚhashesÚsplitÚbaseDNÚ_GetADComputers__headerÚ_GetADComputers__colLenÚjoinÚ	enumerateÚ_GetADComputers__outputFormat)ÚselfÚusernameÚpasswordÚdomainÚcmdLineOptionsÚdomainPartsÚir   r   r"   Ú__init__.   s6   


 

 zGetADComputers.__init__c                 C   s   | d8 } | d } | S )Nl     }*{Gíi€–˜ r   )Útr   r   r"   ÚgetUnixTimeU   s   zGetADComputers.getUnixTimec              
   C   s„  t |tjƒdur
d S d}d}d}d}�zŠ| jrôd}tj ¡ }tjjdd�tj_| jgtjj_	|d D ]±}t
|d ƒdkrW|d d	  ¡  d
¡ d¡du rW|d d	  ¡  d
¡}t
|d ƒdkr�|d d	  ¡  d
¡ d¡du r�|d d	  ¡  d
¡}ztjj|d d	  ¡  d
¡ddd�}	|	D ]}
|
j}q�W n   d}Y t
|d ƒdkrÀ|d d	  ¡  d
¡ d¡du rÀ|d d	  ¡  d
¡}t
|d ƒdkrã|d d	  ¡  d
¡ d¡du rã|d d	  ¡  d
¡}q2t| jj|||||gŽ ƒ W d S |d D ]–}t
|d ƒdk�r|d d	  ¡  d
¡ d¡du �r|d d	  ¡  d
¡}t
|d ƒdk�rD|d d	  ¡  d
¡ d¡du �rD|d d	  ¡  d
¡}t
|d ƒdk�ri|d d	  ¡  d
¡ d¡du �ri|d d	  ¡  d
¡}t
|d ƒdk�rŽ|d d	  ¡  d
¡ d¡du �rŽ|d d	  ¡  d
¡}qøt| jj||||gŽ ƒ W d S  t�yÁ } ztjddd� t dt
|ƒ ¡ W Y d }~d S d }~ww )NTr   F)Ú	configureÚ
attributesÚtypeÚsAMAccountNameÚvalsr   zutf-8ú$ÚdNSHostNameÚA)Útcpz<unable to resolve>ÚoperatingSystemÚoperatingSystemVersionÚ	Exception)Úexc_infoz-Skipping item, cannot process due to error %s)Ú
isinstancer   ÚSearchResultEntryr7   ÚdnsÚresolverÚResolverÚdefault_resolverr1   ÚnameserversÚstrÚasOctetsÚdecodeÚendswithÚresolveÚaddressÚprintr?   ÚformatrU   ÚloggingÚdebugÚerror)r@   ÚitemrM   rP   rS   rT   ÚresolvedIPAddressr6   Ú	attributeÚanswersÚrdataÚer   r   r"   ÚprocessRecord[   sn   
  $ÿ  € """"€€ýzGetADComputers.processRecordc                 C   sÔ   t | j| j| j| j| j| j| j| j| j	| j
| jƒ}|j| _t d| j ¡ t| jj| jŽ ƒ td dd„ | jD ƒ¡ƒ d}zt d| ¡ tjdd�}|j|g d	¢d
|g| jd� W n	 tjyc   ‚ w | ¡  d S )Nz)Querying %s for information about domain.z  c                 S   s   g | ]}d | ‘qS )ú-r   )r   ÚitemLenr   r   r"   r#   ¥   s    z&GetADComputers.run.<locals>.<listcomp>z2(&(objectCategory=computer)(objectClass=computer))zSearch Filter=%séd   )Úsize)rM   rP   rS   rT   r   )ÚsearchFilterrK   Ú	sizeLimitÚsearchControlsÚperRecordCallback)r
   r)   r:   r1   r3   r/   r&   r'   r(   r*   r+   r-   Ú_dstHostrf   Úinford   r?   re   r;   r=   r<   rg   r   ÚSimplePagedResultsControlÚsearchro   ÚLDAPSearchErrorÚclose)r@   ÚldapConnectionrt   Úscr   r   r"   Úrun�   s   2 ÿzGetADComputers.runN)Ú__name__Ú
__module__Ú__qualname__rG   ÚstaticmethodrI   ro   r€   r   r   r   r"   r   -   s    '
Br   Ú__main__Tz'Queries target domain for computer data)Úadd_helpÚdescriptionÚtargetÚstorezdomain[/username[:password]])ÚactionÚhelpz-userrA   z Requests data for specific user )rŠ   Úmetavarr‹   z-tsÚ
store_truez&Adds timestamp to every logging outputz-debugzTurn DEBUG output ONz
-resolveIPzZTries to resolve the IP address of computer objects, by performing the nslookup on the DC.Úauthenticationz-hasheszLMHASH:NTHASHz$NTLM hashes, format is LMHASH:NTHASHz-no-passz&don't ask for password (useful for -k)z-kzÁUse Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters. If valid credentials cannot be found, it will use the ones specified in the command linez-aesKeyzhex keyz<AES key to use for Kerberos Authentication (128 or 256 bits)Ú
connectionz-dc-ipz
ip addresszoIP Address of the domain controller. If ommited it use the domain part (FQDN) specified in the target parameterz-dc-hostÚhostnamez|Hostname of the domain controller to use. If ommited, the domain part (FQDN) specified in the account parameter will be usedé   r   zDomain should be specified!)=Ú
__future__r   r   r   Úargparserf   ÚsysÚdns.resolverrY   r   Úimpacketr   Úimpacket.dcerpc.v5.samrr   Úimpacket.examplesr   Úimpacket.examples.utilsr	   r
   Úimpacket.ldapr   r   r   r�   rd   ÚBANNERÚArgumentParserÚparserÚadd_argumentÚadd_argument_groupÚgroupÚlenÚargvÚ
print_helpÚexitÚ
parse_argsr%   ÚinitÚtsrg   rˆ   r8   Úno_passr,   r.   rC   rA   rB   Ú_ÚcriticalÚexecuterr€   rU   rn   Ú	getLoggerÚlevelÚDEBUGÚ	tracebackÚ	print_excrh   r^   r   r   r   r"   Ú<module>   sf    




(


€üÎ