o
    j                     @   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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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
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l&m'Z'm(Z( d dl)mZ* d dl+m,Z,m-Z-m.Z.m/Z/ d dl0T d dl1T G dd dej2Z3g ddddfde4dee4 de5de5de5de5fddZ6dd Z7e8dkre7  dS dS )     N)ListDict)aiocmdSMBPathCompleterlogger)
__banner__)SMBConnectionFactory)SMBConnection)
SMBMachine)SMBShare)SMBFile)SMBDirectory)SMBException)DCERPCException)
sizeof_fmtsize_to_bytes)faccess_basic_checkfaccess_mask_to_unixfaccess_mask_to_tsvfaccess_match)*c                   @   s:  e Zd ZdddZdddZdd Zdd	d
Zdd Zdd Zdd Z	dd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dd$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zdd5ed6ed7efd8d9Zd:d; Zd<d= Zd>d? Z d@dA Z!dBdC Z"dDdE Z#dFdG Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+dVdW Z,ddXdYZ-dZd[ Z.d\d] Z/dd^d_Z0d`da Z1dbdc Z2ddde Z3dfdg Z4dhdi Z5djdk Z6dldm Z7ddndoZ8dpdq Z9ddrdsZ:ddtduZ;ddvdwZ<dxdy Z=dzd{ Z>d|d} Z?dddZ@dddZAdd ZBdddZCdd ZDdddZEdd ZFdddZGdddZHdddZIdd ZJddefddZKddefddZLddedefddZMddedefddZNdd ZOdddZPddefddZQdddZRdddZSdddZTdddZUdddZVdddZWdddZXddeYfddZZdddZ[dS )	SMBClientNFc                 C   sz   t jj| dd d | _|d urt|| _d | _d | _d| _|| _	|| _
|| _i | _d | _d | _d | _d | _d| jd< d S )NF)ignore_sigintlsll)r   PromptToolkitCmd__init__conn_urlr
   from_url
connectionmachineis_anonsilentnosigno_dceshares_SMBClient__current_share_SMBClient__current_directory_SMBClient__current_usersid_SMBClient__current_user_groupsaliases)selfurlr$   r&   r%    r/   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/examples/smbclient.pyr   %   s    zSMBClient.__init__c                    s  t  d }|j}t |d \}}}  fdd|D }d|v r$|d= t|dkrE|d7 }| D ]\}}	|d||	f 7 }q2|d d }|d	rP|d
d  }d| }
t|tr`|
|	 7 }
n|
d| 7 }
|d urp|d |
 }
t
|
 dtt|||j}td| d|fS )N   r   c                    s   i | ]}| | qS r/   r/   ).0argvaluesr/   r0   
<dictcomp>=   s    z.SMBClient.handle_exception.<locals>.<dictcomp>r-    z%s=%s do_   zCMD: "%s" ERR: z	Error: %s zTraceback:
%sF)inspectstackfunctiongetargvalueslenitems
startswith
isinstancer   pprintprintjoin	tracebackformat_exceptiontype__traceback__r   debug)r-   emsgframecallerargs_caller_argskvto_printformatted_exceptionr/   r4   r0   handle_exception8   s.   

zSMBClient.handle_exceptionc              
      s   z@ddl m} ddlm} ddlm} ddlm} t| j t| jj	  td|  td|  td|  td|  W dS  t
y[ } zt  d |fW  Y d }~S d }~ww )Nr   )__version__z
AIOSMB: %szASYSOCKS: %szMINIKERBEROS: %sz
WINACL: %sTN)aiosmb._versionrX   asysocks._versionminikerberos._versionwinacl._versionrE   r   r"   r!   get_extra_info	ExceptionrG   	print_exc)r-   smbversocksverkerbver	winaclverrL   r/   r/   r0   
do_coninfoe   s$   
zSMBClient.do_coninfoc              
      s  zk| j du r|du rtd |durt|| _ | j  }| j j| jd| _t	| j   t	| j 
  | j I dH \}}|durG|| jj | _t| j| _| jdu ra| dI dH  | jdu rjtd W dS  ty } zt  | |dW  Y d}~S d}~ww )zConnects to the remote machineNzNo url was set, cant do logon)nosignFzLogin successrY   zLogin failed!)r   rE   r
   r    get_credentialget_connectionr%   r!   r   rK   
get_targetlogingssapiis_guestr#   r   r"   r&   	do_sharesr$   r_   rG   r`   rW   )r-   r.   credrQ   errrL   r/   r/   r0   do_loginx   s2   


zSMBClient.do_loginc              
      sz   | j d ur| j  I d H  d | _ | jd ur8z
| j I d H  W n ty7 } ztd W Y d }~nd }~ww d | _d S )Nzconnection.close)r"   closer!   	terminater_   r   	exception)r-   rL   r/   r/   r0   	do_logout   s   


zSMBClient.do_logoutc                    s   |   I d H  d S N)rt   r-   r/   r/   r0   	_on_close   s   zSMBClient._on_closec                    s   d| _ dS )z)Disables automatic share listing on loginTN)r&   rv   r/   r/   r0   do_nodce   s   
zSMBClient.do_nodceTc              
      s   z7| j du rtd dtdfW S | j  2 z3 dH W \}}|dur%||| j|j< |du r4t|j q6 W dS  tyO } z| |W  Y d}~S d}~ww )zLists available sharesNz!Not logged in! Use "login" first!FzNot logged in!TrY   )r"   rE   r_   list_sharesr'   namerW   )r-   showsharero   rL   r/   r/   r0   rm      s$   

zSMBClient.do_sharesc              
      sv   z"| j  2 z3 dH W \}}|dur|td|j|jf  q6 W dS  ty: } z| |W  Y d}~S d}~ww )!Lists sessions of connected usersN%s : %s)r"   list_sessionsrE   usernameip_addrr_   rW   r-   sessro   rL   r/   r/   r0   do_sessions   s   zSMBClient.do_sessionsc              
      sp   z| j  2 z3 dH W \}}|dur|td|j  q6 W dS  ty7 } z| |W  Y d}~S d}~ww )r}   Nz%s)r"   wkstlist_sessionsrE   r   r_   rW   r   r/   r/   r0   do_wsessions   s   zSMBClient.do_wsessionsc              
      sj   z| j  2 z3 dH W \}}|dur|t| q6 W dS  ty4 } z| |W  Y d}~S d}~ww )zLists domainN)r"   list_domainsrE   r_   rW   )r-   domainro   rL   r/   r/   r0   
do_domains   s   
zSMBClient.do_domainsc              
      st   z!| j  2 z3 dH W \}}}|dur|td||f  q6 W dS  ty9 } z| |W  Y d}~S d}~ww )zLists local groupsNr~   )r"   list_localgroupsrE   r_   rW   )r-   rz   sidro   rL   r/   r/   r0   do_localgroups   s   zSMBClient.do_localgroupsc              
      sv   z"| j |2 z3 dH W \}}}|dur|td||f  q6 W dS  ty: } z| |W  Y d}~S d}~ww )zLists groups in a domainNr~   )r"   list_groupsrE   r_   rW   )r-   domain_namerz   r   ro   rL   r/   r/   r0   do_domaingroups   s   zSMBClient.do_domaingroupsc              
      s|   z%| j ||2 z3 dH W \}}}}|dur|td|||f  q	6 W dS  ty= } z| |W  Y d}~S d}~ww )z#Lists members of an arbitrary groupN
%s\%s : %sr"   list_group_membersrE   r_   rW   )r-   r   
group_namer   r   r   ro   rL   r/   r/   r0   do_groupmembers   s   "zSMBClient.do_groupmembersc              
      s|   z%| j d|2 z3 dH W \}}}}|dur|td|||f  q	6 W dS  ty= } z| |W  Y d}~S d}~ww )zLists members of a local groupBuiltinNr   r   )r-   r   r   r   r   ro   rL   r/   r/   r0   do_localgroupmembers   s   "zSMBClient.do_localgroupmembersc              
      sx   z#| j d||I dH \}}|dur||rtd W dS td W dS  ty; } z| |W  Y d}~S d}~ww )z$Add member (by SID) to a local groupr   NzModification OK!z"Something went wrong, status != ok)r"   add_sid_to_grouprE   r_   rW   )r-   r   r   resultro   rL   r/   r/   r0   do_addsidtolocalgroup  s   zSMBClient.do_addsidtolocalgroupc              
      s   zA| j  I dH \| _}| _| _}|dur||du r@td| j  td|  td| j  td | jD ]}td|  q7W dS  tyY } z| |W  Y d}~S d}~ww )	zPrints current userNTUsername: %sz
Domain: %szSID: %szGroups:z %srY   )r"   whoami_SMBClient__current_usernamer*   r+   rE   r_   rW   )r-   rU   
domainnamero   grouprL   r/   r/   r0   	do_whoami  s"    
zSMBClient.do_whoamic              
      s2  z| j du s
| jrBt| jdkr"| jddI dH \}}|dur"||| jvr;| | jvr7td|  W dS | }| j| | _nt	d| j
j |f | _| j| j
I dH \}}|durb|| jjd | _d| jj | _|  I dH \}}|dur|W d	S  ty } z| |W  Y d}~S d}~ww )
zselects share to be usedFr   )r{   NzError! Uknown share name %sz\\%s\%sr;   z[%s]$ rY   )r#   r&   r@   r'   rm   upperrE   r(   r   from_uncr!   targetget_hostname_or_ipconnectsubdirsr)   unc_pathpromptdo_refreshcurdirr_   rW   )r-   
share_namerQ   ro   rL   r/   r/   r0   do_use   s6   
zSMBClient.do_usec                    s   |   I d H S ru   )do_lsrv   r/   r/   r0   do_dir@  s   zSMBClient.do_dirc              
      s   z/| j d u rtd d tdfW S | jd u r"td d tdfW S | j D ]}t| q'W dS  tyG } z| |W  Y d }~S d }~ww )NNo share selected!No directory selected!rY   )r(   rE   r_   r)   get_console_outputrW   )r-   entryrL   r/   r/   r0   r   C  s   


zSMBClient.do_lsc              
      s^   z| j | j2 z
3 d H W \}}d}q	6 W dS  ty. } z| |W  Y d }~S d }~ww )Nr1   rY   )r"   list_directoryr)   r_   rW   )r-   r   ro   arL   r/   r/   r0   r   S  s   zSMBClient.do_refreshcurdirc              
      s   z^| j d u rtd W dS | jd u rtd W dS || jjvr@|dkr3| jj| _d| jj | _W dS td|| jjf  W dS | jj| | _d| jj | _|  I d H \}}|d ur]|W dS  t	yv } z| 
|W  Y d }~S d }~ww )Nr   FNr   z..z[%s] $rY   z2The directory "%s" is not in parent directory "%s")r(   rE   r)   r   
parent_dirr   r   fullpathr   r_   rW   r-   directory_namerQ   ro   rL   r/   r/   r0   do_cd]  s2   


zSMBClient.do_cdc                 C      | j d u rg S t| j j S ru   )r)   listr   keysrv   r/   r/   r0   get_current_dirs{     
zSMBClient.get_current_dirsc                 C   r   ru   )r)   r   filesr   rv   r/   r/   r0   get_current_files  r   zSMBClient.get_current_filesr1   accessfilterdepthoutfilenamec              
      s  z| j du rtd W dS | jdu rtd W dS | dI dH  | }t|}d}|dur;|dkr;t|ddd}| jj| jj	|d	d	d
2 zn3 dH W \}}}d}|durWqG|dkrkt
t|}|jdu rgqG|j}n|dkrt
t|}|jdu r{qG|j}nqG|durt|j| j| j}	|	}
d|vrt|	|}
|
dkrd|jt|
f }|du rt| qG||d  qG6 W dS  ty } z| |W  Y d}~S d}~ww )a)  Recursively enumerates all contents of a directory and checks for specific access rights
		accessfilter: can be 'r' 'w' 'x' 'a' or a combination of those. 'a' stands for all access rights
		Example: enumperms w 10 -> lists all contents the current user has write access to, up to 10 levels deep
		Nr   r   r   Fr;   w)newlineT)r   fetch_dir_sdfetch_file_sdfiledirr   r   z%s	%sz
rY   )r(   rE   r)   r   lowerintopenlist_rr"   r!   typingcastr   security_descriptorr   r   r*   r+   r   r   r   writer_   rW   )r-   r   r   r   outfiler   	entrytypero   sdaccessmatchesresrL   r/   r/   r0   do_enumperms  s\   

*



zSMBClient.do_enumpermsc              
      s   z;|| j jvrtd W dS | j j| }|| jI d H \}}|d ur&|t|  t|| j| j}td|  W dS  t	yS } z| 
|W  Y d }~S d }~ww )Nzfile not in current directory!r   
Access: %srY   )r)   r   rE   get_security_descriptorr!   to_sddlr   r*   r+   r_   rW   )r-   	file_namefile_objr   ro   r   rL   r/   r/   r0   do_getfilesd  s"   zSMBClient.do_getfilesdc              
         z7| j d u rtd W dS | j | jI d H \}}|d ur |tt|  t|| j| j}td|  W dS  t	yO } z| 
|W  Y d }~S d }~ww )Nr   r   r   rY   )r)   rE   r   r!   strr   r   r*   r+   r_   rW   r-   r   ro   r   rL   r/   r/   r0   do_getdirsd      
zSMBClient.do_getdirsdc              
      r   )Nr   r   r   rY   )r(   rE   r   r!   r   r   r   r*   r+   r_   rW   r   r/   r/   r0   do_getsharesd  r   zSMBClient.do_getsharesdc                 C      t | jdS Nr   r   r   rv   r/   r/   r0   _cd_completions     zSMBClient._cd_completionsc                 C   r   r   r   r   rv   r/   r/   r0   _get_completions  r   zSMBClient._get_completionsc                 C   r   r   r   rv   r/   r/   r0   _getdir_completions  r   zSMBClient._getdir_completionsc                 C   r   r   r   rv   r/   r/   r0   _del_completions  r   zSMBClient._del_completionsc                 C   r   r   r   rv   r/   r/   r0   _sid_completions  r   zSMBClient._sid_completionsc                 C   r   r   r   rv   r/   r/   r0   _dirsid_completions  r   zSMBClient._dirsid_completionsc                    s   t  fdddS )Nc                      s   t  j S ru   )r   r'   r   r/   rv   r/   r0   <lambda>  s    z,SMBClient._use_completions.<locals>.<lambda>r   r   rv   r/   rv   r0   _use_completions  s   zSMBClient._use_completionsc                 C   r   r   r   rv   r/   r/   r0   _cat_completions  r   zSMBClient._cat_completionsc              
      sn   z| j  2 z3 dH W \}}|dur|t|  q6 W dS  ty6 } z| |W  Y d}~S d}~ww )zLists remote servicesNrY   )r"   list_servicesrE   get_stauts_liner_   rW   )r-   servicero   rL   r/   r/   r0   do_services  s   zSMBClient.do_servicesc              
      sf   z| j |I dH \}}|dur|t|  W dS  ty2 } z| |W  Y d}~S d}~ww )z%Fetches service's security descriptorNrY   )r"   get_service_sdrE   r   r_   rW   )r-   service_namer   ro   rL   r/   r/   r0   do_servicesd+     zSMBClient.do_servicesdc              
      b   z| j |I dH \}}|dur|t| W dS  ty0 } z| |W  Y d}~S d}~ww )zEnables a remote serviceNrY   )r"   enable_servicerE   r_   rW   r-   r   r   ro   rL   r/   r/   r0   do_serviceen7     zSMBClient.do_serviceenc              
      b   z| j |I dH \}}|dur|td W dS  ty0 } z| |W  Y d}~S d}~ww )zStarts a remote serviceNzStart command sent!rY   )r"   start_servicerE   r_   rW   r   r/   r/   r0   do_servicestartC  r   zSMBClient.do_servicestartc              
      sf   z| j |||I dH \}}|dur|td W dS  ty2 } z| |W  Y d}~S d}~ww )zCreates a remote serviceNzService created!rY   )r"   create_servicerE   r_   rW   )r-   r   commanddisplay_namerQ   ro   rL   r/   r/   r0   do_servicecreateO  s   zSMBClient.do_servicecreatec              
      r   )zDeletes a remote serviceNzService deleted!rY   )r"   delete_servicerE   r_   rW   )r-   r   rQ   ro   rL   r/   r/   r0   do_servicedel[  r   zSMBClient.do_servicedelc              
      sf   z| j |I dH \}}|dur|tt| W dS  ty2 } z| |W  Y d}~S d}~ww )zGets info of a remote serviceNrY   )r"   get_service_configrE   r   r_   rW   )r-   r   r   ro   rL   r/   r/   r0   do_servicegetconfigg  r   zSMBClient.do_servicegetconfigc              
      s   zBd}|du s|dkrd}t |}| j|2 z'3 dH W \}}|dur&||du r. W dS zt|  W q   t| Y q6 W dS  tyZ } z| |W  Y d}~S d}~ww )z<Executes a shell command as a service and returns the result    Nr;   r1   rY   )r   r"   service_cmd_execrE   decoder_   rW   r-   r  timeoutbufferdataro   rL   r/   r/   r0   do_servicecmdexecs  s,   
zSMBClient.do_servicecmdexecc              
      s   z/t |}d| jj | jj| jj|f }| j	j
||dI dH \}}|dur*|td W dS  tyG } z| |W  Y d}~S d}~ww )zMDeploys a binary file from the local system as a service on the remote systemz\\%s\%s\%s\%s)remote_pathNzService deployed!rY   )ntpathbasenamer!   r   r   r(   rz   r)   r   r"   deploy_servicerE   r_   rW   )r-   path_to_execr  r  rQ   ro   rL   r/   r/   r0   do_servicedeploy  s   
 zSMBClient.do_servicedeployc              
      s   zAt |}d| jj| jj|f }| j||I dH \}}|dur-td|  d|fW S td | 	 I dH \}}|dur@|W dS  t
yY } z| |W  Y d}~S d}~ww )z"Uploads a file to the remote share	\%s\%s\%sNzFailed to put file! Reason: %sFzFile uploaded!rY   )r  r  r(   rz   r)   r   r"   put_filerE   r   r_   rW   r-   r   r  dstrQ   ro   rL   r/   r/   r0   do_put  s"   

zSMBClient.do_putc              
      s   z7t |}d| jj| jj|f }| j|I dH \}}|dur#|td | 	 I dH \}}|dur6|W dS  t
yO } z| |W  Y d}~S d}~ww )z$Removes a file from the remote sharer  NzFile deleted!rY   )r  r  r(   rz   r)   r   r"   del_filerE   r   r_   rW   r  r/   r/   r0   do_del  s    
zSMBClient.do_delc              
      sd   z| j ||I dH \}}|dur|td W dS  ty1 } z| |W  Y d}~S d}~ww )/Saves a registry hive to a file on remote shareNzHive saved!rY   )r"   save_registry_hiverE   r_   rW   )r-   	hive_name	file_pathrQ   ro   rL   r/   r/   r0   
do_regsave  s   zSMBClient.do_regsavec              
      j   z| j  I dH \}}|dur||D ]}t| qW dS  ty4 } z| |W  Y d}~S d}~ww )r   NrY   )r"   reg_list_usersrE   r_   rW   )r-   usersro   userrL   r/   r/   r0   do_reglistusers  s   
zSMBClient.do_reglistusersc              
      s   zwg }|| j jvr2tt| j j |D ]}|| qt|dkr1td|| j j	f  W dS n|| |D ]<}| j j| }td|j
  | j|2 z%3 dH W \}}|dur\||du rb nzt|  W qN   t| Y qN6 q9W dS  ty } z| |W  Y d}~S d}~ww )z,Prints the content of a file to the console.r   4File with name %s is not present in the directory %sr   z0---------------------- %s ----------------------NrY   )r)   r   fnmatchfilterr   r   appendr@   rE   rz   r   r"   get_file_datar  r_   rW   )r-   r   matchedfnr   r  ro   rL   r/   r/   r0   do_cat  s<   
	zSMBClient.do_catc           
   
      sl  zg }|| j jvr2tt| j j |D ]}|| qt|dkr1td|| j j	f  W dS n|| |D ]b}| j j| }t
j
d| |jddddE}t|d	0}| j|2 z 3 d
H W \}}|d
uri||d
u ro n|| |t| q[6 W d
   n1 sw   Y  W d
   n1 sw   Y  q9W dS  ty }	 z| |	W  Y d
}	~	S d
}	~	ww )z;Download a file from the remote share to the current folderr   r*  r   Downloading %sBT   desctotalunit
unit_scaleunit_divisorwbNrY   )r)   r   r+  r,  r   r   r-  r@   rE   rz   tqdmsizer   r"   r.  r   updater_   rW   )
r-   r   r/  r0  r   pbarr   r  ro   rL   r/   r/   r0   do_get  sB   


zSMBClient.do_getc                    s  dd }dt dtf fdd zFt|}t|}|dkr!d}|dur/d	d
 |dD }g }|jjvr_ttjj	 |D ]}|
| qCt|dkr^td|jjf  W dS n|
| |D ]}d}d}	jj| }
tj|
jtd }tj|dd tjdddddd} ||
2 z3 dH W \}}|dur|j|krq|dur|j|k rq|dur||j|du rq|j|_d|_d|_t |_|  |j}t|jdkrd|jdd  }|d|  t|d<}j|2 z,3 dH W \}}|dur n|du r|d7 } n| | |!t| |	t|7 }	q6 W d   n	1 s0w   Y  q6 |  W d   n	1 sFw   Y  td|t"|	f  qfW dS  t#yp } z$|W  Y d}~S d}~ww )a0  Download a directory recirsively from the current location on the remote machine to the current local folder.
		Minfsize and maxfsize are in bytes or in 1G 1M 1k notation. Filenamefilter is a comma separated list of fnmatch patterns (eg. *.exe,*.dll)
		In case you want to specify the parameters partially, you can use the following notation:
		getdir <dir_name> '' '1M' '*.exe,*.dll' -> only maxfsize and filenamefilter will be used
		getdir <dir_name> -> all files will be downloaded
		getdir <dir_name> '1M' -> all files bigger than 1M will be downloaded
		c                 S   s    |D ]}t  | |r dS qdS )z
			Check if the filename matches any of the provided patterns.
			
			:param filename: The name of the file.
			:param patterns: A list of patterns to match against.
			:return: True if the filename matches any pattern, otherwise False.
			TF)r+  )filenamepatternspatternr/   r/   r0   matches_any_pattern  s
   z0SMBClient.do_getdir.<locals>.matches_any_patternout_pathdir_objc                   s   |j jddd2 zM3 d H W \}}}|d urq
|dkrCtj| t|j}tj|dd  ||2 z3 d H W \}}||fV  q36 q
|dkrWtj| tj	|j|fV  q
q
6 d S )Nr1   r8   )r   
maxentriesr   Texist_okr   )
r   r!   ospathrF   r  normpathrz   makedirsr  )rE  rF  objotypero   dirpathlfiler   get_directoryr-   r/   r0   rS  (  s   $ z*SMBClient.do_getdir.<locals>.get_directoryr;   Nc                 S   s   g | ]}|  qS r/   )strip)r2   xr/   r/   r0   
<listcomp>=  s    z'SMBClient.do_getdir.<locals>.<listcomp>,r   z9Directory with name %s is not present in the directory %sr   z%Y%m%d_%H%M%STrH  zDownloading files...r3  r4  r5  F   z...ir2  r;  r1   z"Donwloaded %s files, total size %srY   )%r   r   r   splitr)   r   r+  r,  r   r   r-  r@   rE   rz   rJ  rK  r  timestrftimerM  r<  r=  r7  nlast_print_nstart_trefreshr   set_descriptionr   r"   r.  r   r>  r   r_   rW   )r-   dir_nameminfsizemaxfsizefilenamefilterrD  r/  r0  total_files
total_sizerF  basedirnamer?  rQ  r   r6  r   r  ro   rL   r/   rR  r0   	do_getdir  s   





zSMBClient.do_getdirc              
      s   z)| j || jI dH \}}|dur|td |  I dH \}}|dur(|W dS  tyA } z| |W  Y d}~S d}~ww )z'Creates a directory on the remote shareNzDirectory created!rY   )r"   create_subdirectoryr)   rE   r   r_   rW   r   r/   r/   r0   do_mkdirs  s   zSMBClient.do_mkdirc              
      s   z0g }|dur| | | jj|d2 z3 dH W \}}|dur"||du r'qtt| q6 W dS  tyH } z| |W  Y d}~S d}~ww )z*It's a suprse tool that will help us laterN)target_usersrY   )r-  r"   dcsyncrE   r   r_   rW   )r-   r   r'  secretro   rL   r/   r/   r0   	do_dcsync  s"   
zSMBClient.do_dcsyncc              
      s~   z&| j |2 z3 dH W \}}}|durtt| td||f  q6 W dS  ty> } z| |W  Y d}~S d}~ww )zList users in domainN%s %srY   )r"   list_domain_usersrE   r   r_   rW   )r-   r   r   user_sidro   rL   r/   r/   r0   do_users  s   zSMBClient.do_usersc           	   
      s  d }zz~|d u rdt j  d }| j I d H \}}|d ur#|tjd|jdddd}t|d+}	 |d	I d H \}}|d urE||d
krJn|	| |
t| q5W d    n1 saw   Y  W W |d ur| I d H  | j|jI d H \}}dS dS  ty } z$| |W  Y d }~W |d ur| I d H  | j|jI d H \}}S S d }~ww |d ur| I d H  | j|jI d H \}}w )Nzlsass_%s.dmpz%Y_%m_%d_%H%M%SzDownloading lsass dumpr3  Tr4  r5  r;  i  r  rY   )datetimenowr[  r"   task_dump_lsassr<  r=  r   readr   r>  r@   rq   r  r   r_   rW   )	r-   	lfilepath	lsassfilero   r?  fr  rQ   rL   r/   r/   r0   do_lsass  sJ   

zSMBClient.do_lsassc              
      sj   z| j |I dH \}}|durtt| t| W dS  ty4 } z| |W  Y d}~S d}~ww )
PrinterbugNrY   )r"   
printerbugrE   r   r_   rW   )r-   attacker_ipr   ro   rL   r/   r/   r0   do_printerbug  s   zSMBClient.do_printerbugc              
      sj   z| j  2 z3 dH W \}}|dur|t| q6 W dS  ty4 } z| |W  Y d}~S d}~ww )zList scheduled tasks NrY   )r"   
tasks_listrE   r_   rW   )r-   tasknamero   rL   r/   r/   r0   do_tasks  s   
zSMBClient.do_tasksc              
      r   )z Gets the XML of a scheduled taskNrY   )r"   get_taskrE   r_   rW   )r-   	task_namexmlro   rL   r/   r/   r0   
do_taskxml  s   zSMBClient.do_taskxml\c              
      sl   z| j |2 z3 dH W \}}|dur|t| q6 W dS  ty5 } z| |W  Y d}~S d}~ww )zLists scheduled task foldersNrY   )r"   list_task_foldersrE   r_   rW   )r-   rK  folderro   rL   r/   r/   r0   do_tasklistfolders  s   
zSMBClient.do_tasklistfoldersc              
      s   z4t |d}| }W d   n1 sw   Y  | jj||dI dH \}}|dur3td |W dS  tyL } z| |W  Y d}~S d}~ww )zRegisters a new scheduled taskrN)r  z [!] Failed to register new task!rY   )r   rv  r"   tasks_registerr   infor_   rW   )r-   template_filer  ry  templater   ro   rL   r/   r/   r0   do_taskregister  s   

zSMBClient.do_taskregisterc              
      sZ   z| j |I dH \}}|dur|W dS  ty, } z| |W  Y d}~S d}~ww )zDeletes a scheduled task	NrY   )r"   tasks_deleter_   rW   )r-   r  rQ   ro   rL   r/   r/   r0   
do_taskdel  s   zSMBClient.do_taskdelc              
      s   zCd}|du s|dkrd}t |}| j||2 z'3 dH W \}}|dur'||du r/ W dS zt|  W q   t| Y q6 W dS  ty[ } z| |W  Y d}~S d}~ww )z; Executes a shell command using the scheduled tasks servicer  Nr;   r1   rY   )r   r"   tasks_cmd_execrE   r  r_   rW   r  r/   r/   r0   do_taskcmdexec  s,   
zSMBClient.do_taskcmdexecc              
      sz   z$| j  I dH \}}|dur||D ]}td|d |d f  qW dS  ty< } z| |W  Y d}~S d}~ww )z4 Lists all network interfaces of the remote machine Nz%d: %sindexaddressrY   )r"   list_interfacesrE   r_   rW   )r-   
interfacesro   ifacerL   r/   r/   r0   do_interfaces%  s   zSMBClient.do_interfacesr:   c              
      s*  z|t |}| jj|d2 zl3 dH W \}}}|dur0|dv r(td||jf  ntd||f  |dkrItt|}td|j|j|j	|j
f  q|dkratt|}td|jd	|j	|j
f  q|d
krstt|}td|j  qtd|  q6 W dS  ty } z| |W  Y d}~S d}~ww )= Enumerates all shares for all files and folders recursively r   N)r   r   z	[E] %s %sr   z[F] %s %s %s %sr   z[D] %s %s %s %s0r|   z[S] %sz[?] %srY   )r   r"   enum_all_recursivelyrE   r   r   r   r   r=  last_access_timelast_write_timer   r   rz   r_   rW   )r-   r   rN  rO  ro   rL   r/   r/   r0   
do_enumall3  s0    zSMBClient.do_enumallc              
      r%  )r  NrY   )r"   enum_printer_driversrE   r_   rW   )r-   driversro   driverrL   r/   r/   r0   do_printerenumdriversO  s   
zSMBClient.do_printerenumdriversr;   c              
      l   zt |dkr
d}| j||I dH \}}|dur|W dS  ty5 } z| |W  Y d}~S d}~ww )z, printnightmare bug using the RPRN protocol r   NrY   )r@   r"   printnightmarer_   rW   r-   r|   
driverpathrQ   ro   rL   r/   r/   r0   do_printnightmare[     zSMBClient.do_printnightmarec              
      r  )z+ printnightmare bug using the PAR protocol r   NrY   )r@   r"   par_printnightmarer_   rW   r  r/   r/   r0   do_parprintnightmareg  r  zSMBClient.do_parprintnightmarec              
      s.  z| j  I dH \}}|dur||D ]}|du s t|dkr&td|  d|| v rf|du s6t|dkrCtd|| d    n#td||df d}||| d  W d   n1 saw   Y  d|| v r|du svt|dkrtd	|| d     n$td
||f d}||| d   W d   n1 sw   Y  d|| v r|du st|dkrtd|| d    n"td||f d}||| d  W d   n1 sw   Y  |du st|dkrtd qtd qW dS  ty } z| 	|W  Y d}~S d}~ww )z$Obtains the DPAPI domain backup keysNr   zGUID: %s	legacykeyzLegacy key: 0x%sz%s_%s_%s.keyr;  pvkzPVK: %sz	%s_%s.pvkcertificatezCertificate: 
%sz	%s_%s.derr;   zBackupkey saved to diskrY   )
r"   get_backupkeysr@   rE   hexr   r   to_bytesr_   rW   )r-   r   
backupkeysro   guidry  rL   r/   r/   r0   do_backupkeyss  sD   

zSMBClient.do_backupkeysc              
      s   z=| j jdd2 z-3 dH W \}}}}}|dur|td|  td|  td|  td|  td q	6 td	 W d
S  tyU } z| |W  Y d}~S d}~ww )z#Searches for cpassword in GPP files   r  NzFilename: %sr   zCpassword: %szType: %sr;   zDone!rY   )r"   get_cpasswdrE   r_   rW   )r-   rA  r   	cpasswordxmltypero   rL   r/   r/   r0   
do_cpasswd  s"   $
zSMBClient.do_cpasswdserver_namec              
      sj   z| j j||dI d H \}}|d ur|td|  W dS  ty4 } z| |W  Y d }~S d }~ww )Nr  zJob added! Job ID: %srY   )r"   
at_add_jobrE   r_   rW   )r-   atinfor  jobidro   rL   r/   r/   r0   do_ataddjob  s   zSMBClient.do_ataddjobc              
      sd   z| j j|dI d H \}}|d ur|t| W dS  ty1 } z| |W  Y d }~S d }~ww Nr  rY   )r"   at_enumrE   r_   rW   )r-   r  rU  ro   rL   r/   r/   r0   	do_atenum  s   zSMBClient.do_atenumr  c              
      sn   zt |}| jj||dI d H \}}|d ur|td W dS  ty6 } z| |W  Y d }~S d }~ww )Nr  zJob deleted!rY   )r   r"   
at_del_jobrE   r_   rW   )r-   r  r  rQ   ro   rL   r/   r/   r0   do_atdeljob  s   zSMBClient.do_atdeljobc              
      sn   zt |}| jj||dI d H \}}|d ur|t| W dS  ty6 } z| |W  Y d }~S d }~ww r  )r   r"   at_get_inforE   r_   rW   )r-   r  r  jobinforo   rL   r/   r/   r0   do_atgetjob  s   zSMBClient.do_atgetjobc              
      sv   z"| j  2 z3 d H W \}}}|d ur|td|j|f  q6 W dS  ty: } z| |W  Y d }~S d }~ww )Nro  rY   )r"   share_write_testrE   rz   r_   rW   )r-   r|   writablero   rL   r/   r/   r0   do_sharewritetest  s   zSMBClient.do_sharewritetestc              
      s   zE| j du r| jdu rtd W dS | j du r'| jj| j|dI dH \}}n| j j| j|dI dH \}}|dur;||D ]}t| q=W dS  ty] } z| |W  Y d}~S d}~ww )z+ Lists all snapshots of the remote machine Nz"Select a share or directory first!r   )rK  rY   )r)   r(   rE   	snapshotsr!   r_   rW   )r-   rK  r  ro   snapshotrL   r/   r/   r0   do_snapshots  s"   

zSMBClient.do_snapshotsr   c              
      sz   z$|dks
|du rd}| j |||I dH \}}|dur|td W dS  ty< } z| |W  Y d}~S d}~ww )zbCreates a new user in the given domain. If domain is not set, it will default to the local machiner;   Nr   zUser added OK!rY   )r"   add_new_userrE   r_   rW   r-   r   passwordr   rQ   ro   rL   r/   r/   r0   do_usercreate  s   zSMBClient.do_usercreatec              
      x   z#|dks
|d u rd}| j ||I d H \}}|d ur|td W dS  ty; } z| |W  Y d }~S d }~ww )Nr;   r   zUser removed OK!rY   )r"   delete_userrE   r_   rW   r-   r   r   rQ   ro   rL   r/   r/   r0   
do_userdel     zSMBClient.do_userdelc              
      r  )Nr;   r   zUser enabled OK!rY   )r"   enable_userrE   r_   rW   r  r/   r/   r0   do_userenable  r  zSMBClient.do_userenablec              
      r  )Nr;   r   zUser disabled OK!rY   )r"   disable_userrE   r_   rW   r  r/   r/   r0   do_userdisable  r  zSMBClient.do_userdisablec              
      |   z%|dks
|d u rd}| j ||||I d H \}}|d ur |td W dS  ty= } z| |W  Y d }~S d }~ww Nr;   r   zUser pw changed OK!rY   )r"   change_user_passwordrE   r_   rW   )r-   r   oldpasswordr  r   rQ   ro   rL   r/   r/   r0   do_userchangepw)     zSMBClient.do_userchangepwc              
      r  r  )r"   change_user_password_ntrE   r_   rW   )r-   r   oldhashr  r   rQ   ro   rL   r/   r/   r0   do_userchangepwhash7  r  zSMBClient.do_userchangepwhashc              
      z   z$|dks
|d u rd}| j |||I d H \}}|d ur|td W dS  ty< } z| |W  Y d }~S d }~ww r  )r"   change_user_password_newrE   r_   rW   r  r/   r/   r0   do_userchangepw4E     zSMBClient.do_userchangepw4c              
      r  r  )r"   change_user_password_internalrE   r_   rW   r  r/   r/   r0   do_userchangepwinternalS  r  z!SMBClient.do_userchangepwinternalwith_sidc              
      s   zB|du s|dkst | dkrd}nd}| j|2 z"3 d H W \}}}}|d ur-||du r;t| d|  qt| q6 W dS  tyZ } z| |W  Y d }~S d }~ww )NT1TRUEFz : rY   )r   r   r"   list_users_allowed_to_replicaterE   r_   rW   )r-   r   r  rz   r   ridro   rL   r/   r/   r0   do_rodcallowertoreplicatea  s"     
	z#SMBClient.do_rodcallowertoreplicateHELLO!c              
      s  dd }d}zwzRt d| jj df }|| jdI dH \}}|dur(|td}||I dH \}}|dur=|	 |	d	I dH \}}|durN|t
| td
I dH  q> ty~ } z| |W  Y d}~W |dury| I dH  S S d}~ww |dur| I dH  w w )z
 pipetest c                    s~   z3t dI d H  dd}t|jdddd| }	 | |I d H \}}|d ur,|t d	I d H  q   t  Y d S )
Nr  z
HELLO!!!
zutf-8   littleF)	byteordersignedTr1   )asynciosleepencoder@   r  r   rG   r`   )piper  rQ   ro   r/   r/   r0   tempw  s   
z#SMBClient.do_pipetest.<locals>.tempNz\\%s\IPC$\%stestpiperwD00000022000570b75f7cf1897fd2a679b70e9a46d5475443500004acd9a84e005001Tr     )r   from_uncpathr!   r   r   	open_pipebytesfromhexr   rv  rE   r  r  rq   r_   rW   )r-   r  r  r  rQ   ro   rL   r/   r/   r0   do_pipetestu  s:   
zSMBClient.do_pipetest)NFFFru   )T)r1   N)r1   )NNN)r  )r:   )r;   )F)r  )\__name__
__module____qualname__r   rW   re   rp   rt   rw   rx   rm   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   r   r  r  r  r
  r  r  r  r  r$  r)  r1  r@  rh  rj  rn  rr  rz  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  boolr  r  r/   r/   r/   r0   r   $   s    

-







 
6*


a









#










r   Fsmb_urlcommandsr$   continue_on_errorno_interactiver%   c                    sV  t | ||d}t|dkr8|du rtd td |dg I d H \}}|d ur/td | I d H  d S zj|D ]X}	|	dkrM| I d H  td t|	}
|
d dkrk|	 I d H \}}|d urjtd q;td|	  ||
d |
dd  I d H \}}|d ur|d	u rtd
 td q;td W |
 I d H  d S |
 I d H  w )N)r$   r%   r   TzNot starting interactive!r1   rj   iz>>> %sFz8Batch execution stopped early, because a command failed!)r   r@   rE   sysexit_run_single_commandrunshlexrY  rp   rt   )r  r	  r$   r
  r  r%   clientrQ   ro   r  cmdr/   r/   r0   amain  s:   




"
"r  c               	   C   sh  dd l } dd l}dd l}ddlm} ddlm} | jdd}|jddddd |jd	d
ddd |jdddd |jddddd |jdddd |jddd |jddd | }|j	du rdt
t |jdkrut|j ||j |jdkrt
d td td |d |d t d  |j|jd! tt|j|j|j	|j|j|j d S )"Nr   r   zInteractive SMB client)descriptionz-vz	--verbosecount)actiondefaultz-sz--silent
store_truezdo not print banner)r  helpz-nz--no-interactive)r  z-cz--continue-on-errorzDWhen in batch execution mode, execute all commands even if one failsz--nosigzDisable SMB signing (SMB2 only)r  zConnection string that describes the authentication and target. Example: smb+ntlm-password://TEST\Administrator:password@10.10.10.2)r  r	  r   )nargsFr1   r  zsetting deepdebugT)level)argparseplatformloggingasysocksr   asyauthArgumentParseradd_argument
parse_argsr$   rE   r	   verbosesetLevelDEBUGsocksloggerr  get_event_loop	set_debugbasicConfigr  r  r  r	  r
  r  r%   )r  r  r  	asyloggerasyauthloggerparserrP   r/   r/   r0   main  sJ   






r/  __main__)9r  rJ  r  rG   r  r+  rs  rZ  r  r<  r<   r   r   r   aiosmb.external.aiocmd.aiocmdr    aiosmb.examples.smbpathcompleterr   aiosmbr   rZ   r	   !aiosmb.commons.connection.factoryr
   aiosmb.connectionr   !aiosmb.commons.interfaces.machiner   aiosmb.commons.interfaces.sharer   aiosmb.commons.interfaces.filer   #aiosmb.commons.interfaces.directoryr   aiosmb.commons.exceptionsr   aiosmb.dcerpc.v5.rpcrtr   aiosmb.commons.utils.fmtsizer   r   r   r(  aiosmb.commons.utils.faccessr   r   r   r   aiosmb.wintypes.access_maskaiosmb.protocol.smb2.commandsr   r   r   r  r  r/  r  r/   r/   r/   r0   <module>   s^               2	!,
