o
    j2>                     @   s   d dl Z d dlZd dlZd dlZd dlmZ d dlT d dlT d dlT d dl	m
Z
 d dlmZ d dlmZ d dlmZ g dZG d	d
 d
ZG dd dZdd Zdd Zedkr]e  dS dS )    N)logger)*)SMBConnectionFactory)
SMBMachine)UniversalEncoder)tqdm)	target	target_idotypepathcreationtimesizesizefmtsddlerrc                   @   s8   e Zd Zdd Zdd Zdd Zdd Zefd	d
ZdS )EnumResultFinalc                 C   s   || _ || _|| _|| _|| _d | _d | _d | _d | _d | _	d | _
| jdv rm| j j
| _
| jdks:| jdks:| jdkr[| jdksD| jdkrI| j j| _| j j| _| jd u rUdn| j | _	| jdkro| j j| _t| j| _d S d S d S )N)dirfilesharer   r   r    )objr
   r   r   r	   creation_timer   size_fmtsecurity_descriptorsecurity_descriptor_sddlunc_pathto_sddl
sizeof_fmt)selfr   r
   r   r   r	    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/examples/smbshareenum.py__init__   s.   





zEnumResultFinal.__init__c                 C   s   | j d urd| j| j f S | jdkr d| j| j| j| j| jf S | jdkr/d| j| j| jf S | jdkr<d| j| jf S | jdkrSd	| jj| jj	t
| jj| jjf S d
S )Nz[E] %s | %sr   z[F] %s | %s | %s | %s | %sr   z[D] %s | %s | %sr   z[S] %s | %sprogressz[P][%s/%s][%s] %sz[UNK])r   r   r
   r   r   r   r   r   total_targetstotal_finishedstrgens_finishedcurrent_finishedr   r   r   r    __str__2   s   




$zEnumResultFinal.__str__c                 C   s.   | j | j| j| j| j| j| j| j| j| j	d
S )N)
r   r	   r   r   r   r   securitydescriptorr   r
   r   )
r   r	   r   r   r   r   r   r   r
   r   r(   r   r   r    to_dictE   s   zEnumResultFinal.to_dictc                 C   s   |   }|d= tj|tdS )Nr*   )cls)r+   jsondumpsr   )r   ddr   r   r    to_jsonS   s   zEnumResultFinal.to_jsonc                    s2   | j dkrdS |    fdd|D }d|S )Nr"   r   c                    s   g | ]}t  | qS r   r%   .0xr/   r   r    
<listcomp>\   s    z*EnumResultFinal.to_tsv.<locals>.<listcomp>	)r
   r+   join)r   hdrsdatar   r5   r    to_tsvX   s
   

zEnumResultFinal.to_tsvN)	__name__
__module____qualname__r!   r)   r+   r0   ENUMRESFINAL_TSV_HDRr;   r   r   r   r    r      s    r   c                   @   sr   e Zd Zdddddddddddddg g g ddf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S )SMBFileEnum
      FNTr%      c                 C   s   g | _ || _t|trt|| _|| _|| _|| _|| _	g | _
d | _|| _|| _|| _|| _|| _|	| _|
| _|| _|| _|| _|| _|| _|| _|| _d| _d| _d| _d| _d| _d| _d| _ d| _!i | _"d S )NFr   )#target_genssmb_mgr
isinstancer%   r   from_urlworker_counttask_qres_qdepthworkersresult_processing_taskenum_urlout_file	show_pbar	max_itemsmax_runtimefetch_share_sdfetch_dir_sdfetch_file_sdoutput_typeexclude_shareexclude_direxclude_targetext_result_qconnection_timeout_SMBFileEnum__gens_finished_SMBFileEnum__total_targets_SMBFileEnum__total_finished_SMBFileEnum__total_size_SMBFileEnum__total_shares_SMBFileEnum__total_dirs_SMBFileEnum__total_files_SMBFileEnum__total_errors_SMBFileEnum__current_targets)r   smb_urlrH   rK   rN   rO   rP   rQ   rR   rS   rT   rU   rI   rJ   rV   rW   rX   rY   rZ   r[   r   r   r    r!   a   sB   

zSMBFileEnum.__init__c                    s  zzm| j |}|4 I d H T tj| | jdI d H \}}|d ur%|t|}|j| j| j	| j
| j| j| j| jd2 z3 d H W \}}}t|||||f}	| j|	I d H  q<6 W d   I d H  n1 I d H siw   Y  W n> tjy   Y W | jt||d tjdI d H  d S  ty }
 z| jt||d |
tjdI d H  W Y d }
~
nd }
~
ww W | jt||d tjdI d H  d S W | jt||d tjdI d H  d S | jt||d tjdI d H  w )Ntimeout)rK   
maxentriesrS   rT   rU   rW   rX   statuserrorrj   )rE   create_connection_newtargetasynciowait_forloginr[   r   enum_all_recursivelyrK   rQ   rS   rT   rU   rW   rX   
EnumResultrJ   putCancelledErrorEnumResultStatusFINISHED	ExceptionERROR)r   tidr   
connection_r   machiner   r
   erer   r   r    
__executor   s2   8(
$.$FzSMBFileEnum.__executorc                    s8  z|	 | j  I d H }|d u rW d S |\}}ztj| ||| jdI d H  W nU tjy3   Y W d S  tjyf } z'| j	t
||d |tjdI d H  | j	t
||d tjdI d H  W Y d }~qd }~w ty| } ztd W Y d }~qd }~ww q tjy   Y d S  ty } z|W  Y d }~S d }~ww )NTrf   rk   ri   worker)rI   getrn   ro   _SMBFileEnum__executorrR   rt   TimeoutErrorrJ   rs   rr   ru   rx   rv   rw   r   	exception)r   indatary   r   r~   r   r   r    r      s8   "" 
zSMBFileEnum.workerc                    s4  zd }| j du rUi }tdddd|d< tdddd|d	< td
ddd|d< tdddd|d< tddddd|d< tdddd|d< tdddd|d< tdddd|d< g }d}	 ze| jdu r~| j du r~|d jd u r~| j|d _|D ]}||   qu| jd urg }t|dks|r2| jd u r2d}| jd krd!	d"d# |D }n+| jd$kr|D ]
}|d%|
  7 }qn| jd&kr|D ]
}|d%|  7 }qnd!	|}| jd urt| jd'dd(/}z|| W n   |d!D ]}z	||d!  W q   td) Y qY W d    n	1 sw   Y  nt| | j du r.|D ]	}||   q$g }d}|r@t|   W W d S ztj| j dd*I d H }	W n- tjy|   | j du rj|D ]	}||   q`| j| jkry| jdu ryd}Y W qYw |	jtjkr|  jd7  _| j du r|d d t| j| j| j|	j }
| jd ur| j!t"|
d+d |	j |	j#I d H  |$t"|
d+d |	j |	j# | j| jkr| jdu rd}W qY|	j%d ur|	j%\}
}}| jd ur| j!t"|
|||	j |	j#I d H  |$t"|
|||	j |	j# |d ur|d,kr9|  j&d7  _&t'|
j(t)du r8|  j*|
j(7  _*| j du r8|d |
j( n|d-krF|  j+d7  _+n|d.krR|  j,d7  _,| j du r|d-kre|d d n&|d,krr|d d n|d.kr|d	 d n|dkr|d d |d ur|  j-d7  _-| j du r|d d |	jtj.kr|  j-d7  _-| j du r|d d W n- tj/y   Y W d S  t0y } zt1d/ t|   W Y d }~W d S d }~ww qZ tj/y   Y d S  t0y } zt1d0 t|   W Y d }~d S d }~ww )1NTzTargets     r   r   )descunitpositiontargetszShares         shareszDirs           dirszFiles       rB   fileszFiles (size)B   )r   r   
unit_scaler   filesizezMaxed       rC   maxedzEnum Errors    
enumerrorszConn Errors    
connerrorsFi  r%   z
c                 S   s   g | ]}t |qS r   r1   r2   r   r   r    r6      s    z1SMBFileEnum.result_processing.<locals>.<listcomp>tsvz%s
r-   za+)newlinezEncoding issue, skipping a linerf   r"   r   r   r   zresult_processing innerresult_processing)2rP   r   r\   totalr]   refreshrZ   lenrV   r8   r;   r0   rO   openwritesplitr   debugprintrn   create_task	terminatero   rJ   r   r   r^   rj   ru   rv   updateEnumProgressr   rs   r   r	   appendresultrb   rF   r   intr_   ra   r`   rc   rx   rt   rw   r   )r   pbar
out_buffer
final_iterkeyout_dataresfliner}   r   r
   r   r~   r   r   r    r      s  
"





	""









t
zSMBFileEnum.result_processingc                    s2   | j D ]}|  q| jd ur| j  d S d S N)rL   cancelrM   )r   r   r   r   r    r   =  s   


zSMBFileEnum.terminatec              
      s   z6| j d u rt| j| _ t|  | _| jd u r"t| j| _t| jD ]}| j	
t|   q'W dS  tyM } z
d |fW  Y d }~S d }~ww )NTN)rJ   rn   QueuerH   r   r   rM   rI   rangerL   r   r   rw   )r   r{   r~   r   r   r    setupC  s   

zSMBFileEnum.setupc                    s   | j du r!|  jd7  _| jtt | j 	 fI d H  | j
D ]=}| 2 z53 d H W \}}}|d ur?td|   n"|| jv rEq*|  jd7  _| j||fI d H  tdI d H  q*6 q$t| jD ]}| jd I d H  qgd| _d S )NTr   zTarget gen error! %sr   )rN   r]   rI   rs   r%   uuiduuid4rE   
get_targetget_hostname_or_iprD   generater   rY   rn   sleepr   rH   r\   )r   
target_genuidr   r   r{   r   r   r    __generate_targetsR  s&   
(


zSMBFileEnum.__generate_targetsc                    s  zqz?|   I d H \}}|d ur|t|  }tj| j I d H  | jI d H  W W | jd ur@| jt	d dd d d I d H  dS dS  t
yr } z%td d |fW  Y d }~W | jd urm| jt	d dd d d I d H  S S d }~ww | jd ur| jt	d dd d d I d H  w w )Nfinishedr   run)r   rn   r   _SMBFileEnum__generate_targetsgatherrL   rM   rZ   rs   r   rw   r   r   )r   r{   r   gen_taskr~   r   r   r    r   h  s.   
"

 
 zSMBFileEnum.run)r<   r=   r>   r!   r   r   r   r   r   r   r   r   r   r   r    r@   `   s    .% r@   c                     s  dd l } dd l}d}| jd| j|d}|jddddd |jd	td
dd |jddtddd |jdddd |jddddd |jdtd dd |jdtd dd |jddd |jd dd!d |jd"dd#d |jd$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d0d1d.d2d |jd3td4d5d |jd6d7d8d9 | }|jd:krt	t
j |jd;krtd< t	d: t d= t
jt
jd> d?}|jd=u rd@}|jd=u rdA}|j}g }|jd ur|j}g }|jd ur|j}t||j|j|j|j|j|j|j|j||j|||j dB}	g }
t!|j"dkr5|j#d=u r5|	j$%t&|j# n%|j"D ]!}zt'|dC}|(  |	j$%t)| W q8   |
%| Y q8t!|
dkri|	j$%t&|
 t!|	j$dkrtd=|	_*|	+ I d H  d S )DNr   z
Output legend:
    [S] Share
    [D] Dictionary
    [F] File
    [E] Error
    [M] Maxed (max items limit reached for directory)
    [P] Progress (current/total)
zSMB Share enumerator)descriptionformatter_classepilogz-vz	--verbosecount)actiondefaultz--depthrB   z"Recursion depth, -1 means infinite)typer   helpz-wz--smb-worker-countd   zParallell countz-oz
--out-filezOutput file path.)r   z-sz--stdin
store_truezRead targets from stdin)r   r   z--max-itemsz>Stop enumeration of a directory after N items were discovered.z--max-runtimez*Stop enumeration of a host after N secondsz--urlzConnection URL base, target can be set to anything. Owerrides all parameter based connection settings! Example: "smb2+ntlm-password://TEST\victim@test"z
--progresszShow progress barz	--sharesdzFetch share security descriptorz--dirsdz#Fetch directory security descriptorz--filesdzFetch file security descriptorz--jsonzOutput in JSON formatz--tsvz,Output in TSV format. (TAB Separated Values)z--esz--exclude-sharer   z"Exclude shares with name specifiedz--edz--exclude-dirz'Exclude directories with name specifiedz--connection-timeoutrC   zConnection timeoutr   r   z5Hostname or IP address or file with a list of targets)nargsr   r   r   zsetting deepdebugT)levelr%   r-   r   )rH   rK   rO   rP   rQ   rS   rT   rU   rV   rR   rW   rX   r[   r),argparsesysArgumentParserRawDescriptionHelpFormatteradd_argumentr   
parse_argsverboser   setLevelloggingDEBUGr   rn   get_event_loop	set_debugbasicConfigr-   r   urlesedr@   smb_worker_countrK   rO   r"   rQ   sharesddirsdfilesdrR   r[   r   r   stdinrD   r   ListTargetGenr   closeFileTargetGenrN   r   )r   r   r   parserargsrV   re   rW   rX   
enumeratornotfiler   r   r   r   r    amainz  s   









r   c                   C   s   t t  d S r   )rn   r   r   r   r   r   r    main  s   r   __main__)rn   r   r   r-   aiosmbr   &aiosmb.examples.scancommons.targetgens$aiosmb.examples.scancommons.internal!aiosmb.examples.scancommons.utils!aiosmb.commons.connection.factoryr   !aiosmb.commons.interfaces.machiner   !aiosmb.commons.utils.univeraljsonr   r   r?   r   r@   r   r   r<   r   r   r   r    <module>   s,   J  c
