
    h                        d 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	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mZmZmZ dd
lmZ ddlmZmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZi ddljmkZk  G d de	          Zl G d de          Zm G d de
em          Znejo        jp         G d de                      Zqerdk    rddlmsZs  eseq           dS dS )z
SMB 1 / 2 Client Automaton


.. note::
    You will find more complete documentation for this layer over at
    `SMB <https://scapy.readthedocs.io/en/latest/layers/smb.html#client>`_
    N)ATMT	Automaton
ObjectPipe)Net)conf)Scapy_Exception)UTCTimeField)SuperSocket)CLIUtilpretty_list
human_sizevalid_ip	valid_ip6)RandUUID)NDRUnionfind_dcerpc_interface)GSS_S_COMPLETEGSS_S_CONTINUE_NEEDEDGSS_C_FLAGS)Net6)KerberosSSPkrb_as_and_tgs
_parse_upn)LPSHARE_ENUM_STRUCTNetrShareEnum_RequestNetrShareEnum_ResponseSHARE_INFO_1_CONTAINER)NTLMSSPMD4le)
SMBNegotiate_Request'SMBNegotiate_Response_Extended_SecuritySMBNegotiate_Response_SecuritySMBSession_NullSMBSession_Setup_AndX_Request/SMBSession_Setup_AndX_Request_Extended_SecuritySMBSession_Setup_AndX_Response0SMBSession_Setup_AndX_Response_Extended_SecuritySMB_Dialect
SMB_Header),	DirectTCPFileAllInformationFileIdBothDirectoryInformationSMB_DIALECTSSMB2_Change_Notify_RequestSMB2_Change_Notify_ResponseSMB2_Close_RequestSMB2_Close_ResponseSMB2_Create_Context%SMB2_CREATE_DURABLE_HANDLE_REQUEST_V2SMB2_CREATE_REQUEST_LEASE_V2SMB2_CREATE_REQUEST_LEASESMB2_Create_RequestSMB2_Create_ResponseSMB2_Encryption_CapabilitiesSMB2_ENCRYPTION_CIPHERSSMB2_Error_ResponseSMB2_HeaderSMB2_IOCTL_RequestSMB2_IOCTL_ResponseSMB2_Negotiate_ContextSMB2_Negotiate_Protocol_Request SMB2_Negotiate_Protocol_Response!SMB2_Netname_Negotiate_Context_ID#SMB2_Preauth_Integrity_CapabilitiesSMB2_Query_Directory_RequestSMB2_Query_Directory_ResponseSMB2_Query_Info_RequestSMB2_Query_Info_ResponseSMB2_Read_RequestSMB2_Read_ResponseSMB2_Session_Setup_RequestSMB2_Session_Setup_ResponseSMB2_SIGNING_ALGORITHMSSMB2_Signing_CapabilitiesSMB2_Tree_Connect_RequestSMB2_Tree_Connect_ResponseSMB2_Tree_Disconnect_RequestSMB2_Tree_Disconnect_ResponseSMB2_Write_RequestSMB2_Write_ResponseSMBStreamSocketSRVSVC_SHARE_TYPESSTATUS_ERREF)	SPNEGOSSPc                        e Zd ZdZdZeZd(dZed             Z	e
d             Z fdZ ej        d	          d
             Z ej        e          d             Z ej        ed          d             Z ej        e          d             Z ej                    d             Z ej                    d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej                    d(d            Zd Z ej        ed          d             Z ej                    d             Z ej        e          d             Z ej        e          d             Z  ej        d          d             Z! ej                    d(d            Z" ej        e"d          d             Z# ej                    d             Z$ ej        e$          d             Z% ej                    d              Z& ej        e&          d!             Z' ej        e'          d"             Z( ej)        e&d#d$%          d&             Z* ej        e*          d'             Z+ xZ,S ))
SMB_Clienta  
    SMB client automaton

    :param sock: the SMBStreamSocket to use
    :param ssp: the SSP to use

    All other options (in caps) are optional, and SMB specific:

    :param REQUIRE_SIGNATURE: set 'Require Signature'
    :param MIN_DIALECT: minimum SMB dialect. Defaults to 0x0202 (2.0.2)
    :param MAX_DIALECT: maximum SMB dialect. Defaults to 0x0311 (3.1.1)
    :param DIALECTS: list of supported SMB2 dialects.
                     Constructed from MIN_DIALECT, MAX_DIALECT otherwise.
      Nc                 P    |                     dd           _        |                     dd           _        |                     dd           _        |                     dd           _        |                     dd           _        |                     d	d
           _        d|v r|                     d           _        nR|                     dd          |                     dd           _        t           fddD                        _        d _
        d  _        d  _        t                                                       _        d _        d _        d _        d _        |t)          t+          dd          g          }||d<   t-          j         g|R i |  j        rt3          j                     _        | j        _        |                     d j        rdnt=          t?          |                               j        _          j         j        _!        d S )NEXTENDED_SECURITYTUSE_SMB1FREQUIRE_SIGNATURERETRYr   SMB2SERVER_NAME DIALECTSMIN_DIALECT  MAX_DIALECT  c                 6    g | ]}|k    |j         k    |S  )re   ).0xrc   selfs     Z/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/smbclient.py
<listcomp>z'SMB_Client.__init__.<locals>.<listcomp>   s;       K''A1A,A,A ,A,A,A    )rd        i  rf   )r   r   guestrn   UPNHASHNTsockSECURITY_MODE   )"popr[   r\   r]   r^   r_   r`   rb   re   sortedIsGuestErrorStatusNegotiateCapabilitiesr   _fixGUIDSequenceWindowMaxTransactionSizeMaxReadSizeMaxWriteSizerV   r   r   __init__is_atmt_socket	threadingEventsmb_sock_readysessionsspintboolSecurityModeDialect)rk   ru   r   argskwargsrc   s   `    @rl   r   zSMB_Client.__init__   s<   !',?!F!F

:u55!',?!G!GZZ++
JJvu--	!::mR88"JJz22DMM **]F;;K%zz-@@D"    E   DM %)"JJOO%%	$"#;#"   C v	
	
 	
 	
 	
 	
 	

  	4"+/"3"3D$*JJ';AASc^^%
 %
!  $/rn   c                 F     | j         d t          |t                    fi |S N)smblinkrS   r*   clsru   r   s      rl   from_tcpsockzSMB_Client.from_tcpsock   s7    s{D),,
 
 
 
 	
rn   c                     | j         j        S r   )ru   r   rk   s    rl   r   zSMB_Client.session   s     y  rn   c                    | j         j        dk    r@t          |j        t                    r%t          |j        j                  }|t          u rd|_        n|t          t          t          t          t          t          fv r|t          k    r|j        j        }n|t          k    rt          |j        j                  }no|t          k    r2t#          t          |j        j                  |j        j                  }n2|t          t          t          fv r|j        j        }nt+          d          d|dz
  dz  z   |_        nd|_        |j        dz   |_        | j        d         |_        t3          t4          |                               |          S )Nrd   r   zimpossible case   i   )r   r   
isinstancepayloadr;   typer?   CreditChargerG   rQ   r<   rC   r.   rE   LengthlenDatamaxInputMaxOutputResponseOutputBufferLengthRuntimeErrorCreditRequestr   MIDsuperrX   send)rk   pkttypr   	__class__s       rl   r   zSMB_Client.send   sr   <&((Z[-Q-Q(s{*++C555#$  !"",*'   +++ [/FF... !122FF... S[%6!7!79VWWFF0.+  
 ![;FF&'8999#$
u'<#<   $%  # 01 4C%a(Z&&++C000rn   r   )initialc                     d S r   rh   r   s    rl   BEGINzSMB_Client.BEGIN       rn   c                     | j         r8t                      t          d          z  | _        |                                 d S )N  )PID)r_   r*   r;   
smb_headerSMB2_NEGOTIATEr   s    rl   continue_smb2zSMB_Client.continue_smb2  sC    9 	('kkKF,C,C,CCDO%%'''	( 	(rn   )prioc                 *    |                                  r   SENT_NEGOTIATEr   s    rl   send_negotiatezSMB_Client.send_negotiate      !!###rn   c                    t                      t          ddddd          z  | _        | j        r| j        xj        dz  c_        | j                                        t          d g d| j        sd	d
gng z   D                       z  }| j        s|xj        dz  c_        |t                   j        dz
  dz   |t                   _        |                     |           d S )NzILONG_NAMES+EAS+NT_STATUS+UNICODE+SMB_SECURITY_SIGNATURE+EXTENDED_SECURITY  r   r   )Flags2TIDPIDLowUIDr   r[   c                 .    g | ]}t          |           S ))DialectString)r(   ri   rj   s     rl   rm   z+SMB_Client.on_negotiate.<locals>.<listcomp>  s3        !,,,  rn   )zPC NETWORK PROGRAM 1.0z	LANMAN1.0zWindows for Workgroups 3.1az	LM1.2X002z	LANMAN2.1z
NT LM 0.12z	SMB 2.002z	SMB 2.???)DialectsSMB_SECURITY_SIGNATUREz,SMB_SECURITY_SIGNATURE_REQUIRED+IS_LONG_NAME)	r*   r)   r   r[   r   copyr    r\   r   rk   r   s     rl   on_negotiatezSMB_Client.on_negotiate  s#    $++
; 	)
 	)
 	)
 	
 ! 	:O""&99""o""$$';    6:]JK--L  (
 (
 (
 
 % 	.JJ--JJ
O"&'<= 	J
 			#rn   c                     d S r   rh   r   s    rl   r   zSMB_Client.SENT_NEGOTIATE1  r   rn   c                     d S r   rh   r   s    rl   r   zSMB_Client.SMB2_NEGOTIATE5  r   rn   c                 *    |                                  r   r   r   s    rl   send_negotiate_smb2zSMB_Client.send_negotiate_smb29  r   rn   c                    | j                                         t          | j        | j        j                  z  }| j        dk    r| j        |_        d	                    g d          | _
        | j        dk    r(| xj
        dd	                    g d          z   z  c_
        | j        dk    r| xj
        dz  c_
        | j        dk    rt                      t          | j        j        g| j        j        	          z  t                      t          | j        j        g
          z  t                      t#          | j                  z  t                      t'          | j        j        g          z  g|_        | j
        |_        |                     |           | j                            t3          |t4                                        d S )N)r   r   ro   +)DFSLEASING	LARGE_MTUrp   )MULTI_CHANNELPERSISTENT_HANDLESDIRECTORY_LEASINGz+ENCRYPTIONrf   )HashAlgorithmsSalt)Ciphers)NetName)SigningAlgorithms)r   r   r?   rb   r   r   re   r~   
ClientGUIDjoinr|   r>   rB   PreauthIntegrityHashIdr   r8   CipherIdrA   r`   rL   SigningAlgorithmIdNegotiateContextsCapabilitiesr   computeSMBConnectionPreauthbytesr;   r   s     rl   on_negotiate_smb2zSMB_Client.on_negotiate_smb2=  s
    o""$$'F]2(
 (
 (
 
 v%% "YCN%(XX  &
 &
" v%%&&#  1 1 + && v%% &&-7&&v%% '((5$(L$G#H*   '((.!\23   '((3 ,   '((+'+|'F&G  #%C!.  5		#00#k"##	
 	
 	
 	
 	
rn   c                    t           |v s
t          |v r	 |j        }n# t          $ r d }Y nw xY wt          |v rU|j        dz  dk    rGd| _        t                      t          dd          z  | _        d| _	        | 
                                t          |v r|j        | j        _        | j                            t          |t                                        |j        | _        |j        | _        |j        | _        | j        j        dk    rl|j        re|j        D ]]}|j        dk    r#t*          |j        d	                  | j        _        0|j        d
k    r"t0          |j        d	                  | j        _        ^|                     |           |                     |          t:          |v r|                     |j                  d S )N   )r   r   r   r   )r   r   Trf      r      )r!   r@   SecurityBlobAttributeErrorDialectRevisionr   r*   r;   r   r_   r   r   r   r   r   r   r   r   NegotiateContextsCountr   ContextTyper9   r   r   rK   r   r   update_smbheader
NEGOTIATEDr"   	Challenge)rk   r   ssp_blobngctxs       rl   receive_negotiate_responsez%SMB_Client.receive_negotiate_response~  s    4s::/366 +!        1C77'$.$66 '-#"+++A0N0N0N"N 	))+++3s::+.+>DL(L<<c+.//   (+D$.1.DD+(+(8D%|+v55#:T5%(%: 
" 
"E$0F::8O$)M!$49" 5 5 "'!2f!<!< %<E<STU<V$W !% ? %%c***ooh///+s22 //#-000 32s    ,,c                     | j         j        dk    rd| j        _        | j         j                            | j         j        |t          j        | j         j	        dk    rt          j
        ndz            }|S )Nrd   r   r   )	req_flags)r   r   r   r   r   GSS_Init_sec_context
sspcontextr   GSS_C_MUTUAL_FLAGr   GSS_C_INTEG_FLAG)rk   r   	ssp_tuples      rl   r   zSMB_Client.NEGOTIATED  s{     <&((,-DO)L$99L#- |0A55  00		 : 
 
	 rn   c                     |j         j        s3|j        | j        _        |j        | j        _        |j        | j        _        | j        d         t          |j        d          z   | j        d         |j	        z   f| _        dS )zV
        Called when receiving a SMB2 packet to update the current smb_header
        r   r   N)
FlagsSMB2_FLAGS_ASYNC_COMMAND	SessionIdr   r   r   r   r   r   r   r   s     rl   r   zSMB_Client.update_smbheader  sw    
 y1 	*(+DO%"%'DO"%'DO "S)91%=%=="S%66
rn   c                     |\  }}}|t           t          fvrt          d          |                                                     |          Nz0Internal error: the SSP completed with an error.)r   r   
ValueErrorSENT_SETUP_ANDX_REQUESTaction_parameters)rk   r   _	negResults       rl   should_send_setup_andx_requestz)SMB_Client.should_send_setup_andx_request  sM    #1i^-BCCCOPPP**,,>>yIIIrn   c                     d S r   rh   r   s    rl   r  z"SMB_Client.SENT_SETUP_ANDX_REQUEST  r   rn   c                 R   |\  | j         _        }}| j        r|t          k    rd| _        | j        s| j        rq| j        r6| j                                        t          d| j         j	                  z  }n,| j                                        t          ddd          z  }||_        n.| j                                        t          dddd|	          z  }|                     |           | j        r4| j                             t          |t                                         d S d S )
Nr   r   )r   r   zJUNICODE+NT_SMBS+STATUS32+LEVEL_II_OPLOCKS+DYNAMIC_REAUTH+EXTENDED_SECURITYrn   )ServerCapabilitiesNativeOSNativeLanManz)UNICODE+NT_SMBS+STATUS32+LEVEL_II_OPLOCKSs                           )r
  r  r  OEMPasswordUnicodePassword)r   r   r_   r   r   r[   r   r   rI   r   r%   r   r$   r   computeSMBSessionPreauthr   r;   )rk   r   tokenr  r   s        rl   send_setup_andx_requestz"SMB_Client.send_setup_andx_request  sa   4=1	9 	&;;;DN9 	. 	y o**,,/I!&!%!:0 0 0  O((**E? "%%(     %C /&&((+H#N & %, , , C 			#9 	L11c+&''    	 	rn   c                 F   t           |v st          |v s	t          |v rt           |v r|                                 |j        dk    rl|j        dk    ra|                    d          | _        |                     dt          j	        
                    |                    d                               | j        r|                     |           t          |v s	t          |v r|j        | j        _        |j        dk    r6t          |v r|j        j        rd| _        |                     |j                  t*          |v r2| j                            t1          |t*                                        |                     |j                  t          |v rd S t2          |v r| j        j                                         d | j        _        | j        s|                                 |                     dd	| j        z             | xj        dz  c_        |                                 d S )
Nr   l       %SMB2_Header.Status%r   z0SMB Session Setup Response: %SMB2_Header.Status%)lvlmsgTr   z	RETRY: %s)r#   r'   r&   r   Statussprintfr{   debugr   color_themeredr_   r   rJ   r   r   SessionFlagsIS_GUESTrz   AUTHENTICATEDr   r;   r   r  r   r:   r   
clifailure SessionPreauthIntegrityHashValuer^   AUTH_FAILEDr   s     rl   receive_setup_andx_responsez&SMB_Client.receive_setup_andx_response  s    s""?3FF-44 #%%oo''':??szZ77"{{+ABBDJJ$((KK RSS      9 	'!!#&&& =CC*c11 ),DO%zQ.#55#:J:S5#'DL(()9:::#%%L99c+.//   ooc&6777=DDD C''L#..000<@DL9: )&&(((JJ1+
":J;;;JJ!OJJ//### ('rn   )finalc                 8    | j                                          d S r   r   setr   s    rl   r   zSMB_Client.AUTH_FAILEDO      !!!!!rn   c                    | j         j                            | j         j        |          \  | j         _        }}|t          k    rt          d          | j                                          | j        rd | j         _        d S d S r  )	r   r   r   r   r   r  computeSMBSessionKeyrz   SMBSessionKey)rk   r   r  statuss       rl   r  zSMB_Client.AUTHENTICATEDS  s    -1\-=-R-RL#X.
 .
*F ^##OPPP))+++< 	.)-DL&&&	. 	.rn   c                 *    |                                  r   )SOCKET_BINDr   s    rl   authenticated_post_actionsz%SMB_Client.authenticated_post_actionsb  s       rn   c                 8    | j                                          d S r   r$  r   s    rl   r,  zSMB_Client.SOCKET_BINDh  r&  rn   c                 *    |                                  r   )SOCKET_MODE_SMBr   s    rl   start_smb_socketzSMB_Client.start_smb_socketl  s    ""$$$rn   c                     d S r   rh   r   s    rl   r0  zSMB_Client.SOCKET_MODE_SMBp  r   rn   c                 P    |                                                      |          r   )r0  r  r   s     rl   incoming_data_received_smbz%SMB_Client.incoming_data_received_smbt  s"    ""$$66s;;;rn   c                 $   |t                    j        }t          |t                    r|j        dk    rd S |j        dk    rd S |                     |           |                    d          |_        | j        j	        
                    |           d S )Ni  i  r  )r;   r   r   r:   r  r   r  NTStatusoismbpiper   )rk   r   resps      rl   receive_data_smbzSMB_Client.receive_data_smbx  s    ;'d/00 	zZ''zZ''c"""$:;;T"""""rn   r8  r   )nameas_supersocketc                 t    |                                                      |                                          r   )r0  r  recv)rk   fds     rl   outgoing_data_received_smbz%SMB_Client.outgoing_data_received_smb  s*    ""$$66rwwyyAAArn   c                 d    |                      | j                                        |z             d S r   )r   r   r   )rk   ds     rl   	send_datazSMB_Client.send_data  s-    		$/&&((1,-----rn   r   )-__name__
__module____qualname____doc__portr*   r   r   classmethodr   propertyr   r   r   stater   	conditionr   r   actionr   r   r   r   r   receive_conditionr   r   r   r  r  r  r!  r   r  r-  r,  r1  r0  r4  r:  ioeventr@  rC  __classcell__r   s   @rl   rX   rX   x   s         D
C70 70 70 70r 
 
 [
 ! ! X!*1 *1 *1 *1 *1X TZ   T^E( ( (
 T^E"""$ $ #"$ T[  # # ! #J TZ\\  \ TZ\\  \ T^N##$ $ $#$ T[$%%>
 >
 &%>
@ TN++61 61 ,+61p TZ\\   \(
 
 
$ T^JQ'''J J ('J TZ\\  \ T[/00) ) 10)V T3447$ 7$ 547$r TZa" " " TZ\\
. 
. 
. \
. T^M***! ! +*!
 TZ\\" " \" T^K  % % ! % TZ\\  \ TO,,< < -,< T[+,,# # -,# T\/	)LLLB B MLB T[+,,. . -,. . . . .rn   rX   c                       e Zd ZdZddZed             Zed             Zd Z	d Z
d	 Zd
 Zddg g fdZd ZddZddZddZddZd ZdS )
SMB_SOCKETz
    Mid-level wrapper over SMB_Client.smblink that provides some basic SMB
    client functions, such as tree connect, directory query, etc.
    Trw   c                     || _         || _        | j         j        j                            |          st          d          | j         j        j        r!t          d| j         j        j        z            d S )Ntimeoutz7The SMB handshake timed out ! (enable debug=1 for logs)zSMB Session Setup failed: %s)insrV  atmtr   waitTimeoutErrorr{   r   rk   smbsock	use_ioctlrV  s       rl   r   zSMB_SOCKET.__init__  s    x}+000AA 	I   8=$ 	!.1JJ  	 	rn   c           	           | |                     dd          |                     dd          t          j        |fi |          S )zu
        Wraps the tcp socket in a SMB_Client.smblink first, then into the
        SMB_SOCKET/SMB_RPC_SOCKET
        r]  TrV  rw   )r]  rV  r\  )rx   rX   r   r   s      rl   r   zSMB_SOCKET.from_tcpsock  sU     sjjd33JJy!,,+D;;F;;
 
 
 	
rn   c                 $    | j         j        j        S r   )rW  rX  r   r   s    rl   r   zSMB_SOCKET.session  s    x}$$rn   c                 2    || j         j        j        _        dS )z[
        Set the TID (Tree ID).
        This can be called before sending a packet
        NrW  rX  r   r   )rk   r   s     rl   set_TIDzSMB_SOCKET.set_TID  s    
 (+ $$$rn   c                 .    | j         j        j        j        S )z@
        Get the current TID from the underlying socket
        ra  r   s    rl   get_TIDzSMB_SOCKET.get_TID  s     x}'++rn   c           	         | j                             t          dd| j        j        j        d|fg          d| j                  }|st          d          t          |vrt          d|j	        z            | 
                                S )	z,
        Send a TreeConnect request
        Pathz\\\BufferFverboserV  zTreeConnect timed out !zFailed TreeConnect ! %s)rW  sr1rM   r   r   ServerHostnamerV  r  rN   r6  rd  )rk   r;  r9  s      rl   tree_connectzSMB_SOCKET.tree_connect  s     x||%  !L3BBB D	   L  
 
   	86777%T116FGGG||~~rn   c                     | j                             t                      d| j                  }|st	          d          t
          |vrt	          d|j        z            dS )z/
        Send a TreeDisconnect request
        Frj  zTreeDisconnect timed out !zFailed TreeDisconnect ! %sN)rW  rl  rO   rV  r  rP   r6  )rk   r9  s     rl   tree_disconnectzSMB_SOCKET.tree_disconnect  sq     x||(**L  
 

  	;9:::(449DMIJJJ 54rn   rpipec                 6   g }g }d|v r,|                     d           |                    ddg           d|v r,|                     d           |                    ddg           d	|v r|                     d
           g }g }	g }
d}|dk    r+|                     d           |	                     d           n|dv rdg}	d|v r|                    g d           d|v rd}|                     d           d	|v r*|                     d           |	                     d           |dk    r|                     d           n|rt          d|z            d}| j        j        dk    rd}n| j        j        dk    r|dk    rd}| j        j        dk    r|dv r|
                    t          dt          t                                                                           t          d!"          t          d#"          t          d$t          t                                                      %                     g           ng| j        j        dk    rW|dk    rQ|
                    t          d$t          t                                                      %                     g           |r|	                    |           |r|                    |           | j                            t          d&d'                    |          |d'                    |	          d'                    |          d'                    |          |
||(	  	        d| j        )          }|st          d*          t           |vrt          d+|j        z            |t                    j        S ),zv
        Open a file/pipe by its name

        :param name: the name of the file or named pipe. e.g. 'srvsvc'
        rq  FILE_SHARE_READFILE_READ_DATAFILE_READ_ATTRIBUTESwFILE_SHARE_WRITEFILE_WRITE_DATAFILE_WRITE_ATTRIBUTESrB  FILE_SHARE_DELETE	FILE_OPENfolderFILE_ATTRIBUTE_DIRECTORYFILE_DIRECTORY_FILE)filerr  FILE_NON_DIRECTORY_FILE)FILE_READ_EAREAD_CONTROLSYNCHRONIZEFILE_OVERWRITE_IFFILE_WRITE_EADELETEFILE_DELETE_ON_CLOSEr  FILE_ATTRIBUTE_NORMALzUnknown type: %sr   rp   SMB2_OPLOCK_LEVEL_LEASEro   )r  r}  s   DH2Q)
CreateGuid)Namer   s   MxAc)r  s   QFids   RqLs)LeaseKeyImpersonationr   )	ImpersonationLevelDesiredAccessCreateDispositionCreateOptionsShareAccessFileAttributesCreateContextsRequestedOplockLevelr  rj  zCreateRequest timed out !zFailed CreateRequest ! %s)appendextendr  r   r   r2   r3   r   r}   r4   r5   rW  rl  r6   r   rV  r7   r6  FileId)rk   r;  moder   extra_create_optionsextra_desired_accessr  r  r  r  r  r  r  r9  s                 rl   create_requestzSMB_SOCKET.create_request  s8    $;;0111  "24J!KLLL$;;1222  "35L!MNNN$;;2333'8!!"<===  !67777%%%67Md{{$$%T%T%TUUUd{{$7!$$_555d{{$$X...$$%;<<<v~~%%&=>>> 	8/$6777 <6))#<  \!V++#< <6))d6H.H.H!! ($B'/zz'8'8     ($   ($   ($98::??CTCTUUU  #   0 \!V++!! ($6

@Q@QRRR       	7  !5666 	7  !5666x||#2!hh}55"3!hh}55HH[11"xx77-%9
 
 
 L  
 
  	:8999t++84=HIII()00rn   c                     t          |          }| j                            |d| j                  }|st	          d          t
          |vrt	          d|j        z            dS )z"
        Close the FileId
        r  r   rj  zCloseRequest timed out !zFailed CloseRequest ! %sN)r0   rW  rl  rV  r  r1   r6  rk   r  r   r9  s       rl   close_requestzSMB_SOCKET.close_requestZ  so     !///x||CDL|AA 	97888d**7$-GHHH +*rn   r   c                     | j                             t          |||          d| j                  }|st	          d          t
          |vrt	          d|j        z            |j        S )z
        Read request
        )r  r   Offsetr   rj  zReadRequest timed out !zFailed ReadRequest ! %s)rW  rl  rG   rV  r  rH   r6  r   )rk   r  r   r  r9  s        rl   read_requestzSMB_SOCKET.read_requeste  s     x||  
 L  
 
  	86777T))6FGGGyrn   c                     | j                             t          |||          d| j                  }|st	          d          t
          |vrt	          d|j        z            |j        S )z
        Write request
        )r  r   r  r   rj  zWriteRequest timed out !zFailed WriteRequest ! %s)rW  rl  rQ   rV  r  rR   r6  Count)rk   r   r  r  r9  s        rl   write_requestzSMB_SOCKET.write_requestx  s     x||  
 L  
 
  	97888d**7$-GHHHzrn   *c                 f   g }d}	 t          d|||          }| j                            |d| j                  }d}|st	          d          t
          |v rnYt          |vrt	          d|j        z            t          |j	                  }|
                    d	 |j        D                        |S )
z1
        Query the Directory with FileId
        SMB2_RESTART_SCANSTr,   )FileInformationClassr  FileNamer   r   rj  zQueryDirectory timed out !zFailed QueryDirectory ! %sc                 B    g | ]}|j         |j        |j        |j        fS rh   r  r  	EndOfFileLastWriteTimer   s     rl   rm   z.SMB_SOCKET.query_directory.<locals>.<listcomp>  sA         
(	  rn   )rC   rW  rl  rV  r  r:   rD   r6  r,   Outputr  files)rk   r  r  resultsr   r   r9  ress           rl   query_directoryzSMB_SOCKET.query_directory  s     $	.%E!	  C 8<<Q<EEDE ? !=>>>"d**.d:: !=!MNNN0==CNN  !Y  
 
 
!	6 rn   c                     t          ||d||          }| j                            |d| j                  }|st	          d          t
          |vrt	          d|j        z            |j        S )z 
        Query the Info
        r   )InfoTypeFileInfoClassr   r  AdditionalInformationr   rj  zQueryInfo timed out !zFailed QueryInfo ! %s)rE   rW  rl  rV  r  rF   r6  r  )rk   r  r  r  r  r   r9  s          rl   
query_infozSMB_SOCKET.query_info  s     &'$"7
 
 
 x||CDL|AA 	64555#4//4t}DEEE{rn   c                     t          dd|d          }| j                            |dd          }t          |vrt	          d|j        z            |j        S )	z(
        Register change notify
        SMB2_WATCH_TREEr   i  )r   r   r  CompletionFilterr   T)rk  chainCCzFailed ChangeNotify ! %s)r.   rW  rl  r/   r  r6  r  r  s       rl   changenotifyzSMB_SOCKET.changenotify  sh     )#$#	
 
 
 x||CD|99&d227$-GHHH{rn   NTrw   )r   )r  )rD  rE  rF  rG  r   rI  r   rJ  r   rb  rd  rn  rp  r  r  r  r  r  r  r  rh   rn   rl   rS  rS    s@        

 
 
 
 	
 	
 [	
 % % X%+ + +, , ,  4K K K" q1 q1 q1 q1f	I 	I 	I   &   &! ! ! !F   $    rn   rS  c                   <     e Zd ZdZd	dZd Zd Z fdZd Z xZ	S )
SMB_RPC_SOCKETa  
    Extends SMB_SOCKET (which is a wrapper over SMB_Client.smblink) to send
    DCE/RPC messages (bind, reqs, etc.)

    This is usable as a normal SuperSocket (sr1, etc.) and performs the
    wrapping of the DCE/RPC messages into SMB2_Write/Read packets.
    Trw   c                 x    || _         t          j        | d           t                              | ||           d S )Nr  rU  )r]  r   r   rS  r[  s       rl   r   zSMB_RPC_SOCKET.__init__  s>    "D"2333D'7;;;;;rn   c                 @    |                      |dd          | _        d S )Nrwrr  )r  r   )r  
PipeFileId)rk   r;  s     rl   	open_pipezSMB_RPC_SOCKET.open_pipe  s"    --dF-KKrn   c                 H    |                      | j                   d | _        d S r   )r  r  r   s    rl   
close_pipezSMB_RPC_SOCKET.close_pipe  s#    4?+++rn   c                 |   | j         rt          | j        dd          }t          |          |_        | j                            |d          }t          |vrt          d|j	        z            t          |j
                  }|j	        dk    rD| j                            t          | j                  d          }||j        z  }|j	        dk    Dt          t          |                               |           dS t!          | j                  }t          |          |_        | j                            |d          }t"          |vrt          d	|j	        z            | j                            t          | j                  d          }t$          |vrt          d
|j	        z            t          |j                  }|j	        dk    rD| j                            t          | j                  d          }||j        z  }|j	        dk    Dt          t          |                               |           dS )z/
        Internal ObjectPipe function.
        SMB2_0_IOCTL_IS_FSCTLFSCTL_PIPE_TRANSCEIVE)r  r   CtlCoder   )rk  z"Failed reading IOCTL_Response ! %sSTATUS_BUFFER_OVERFLOWr  z!Failed sending WriteResponse ! %sz Failed reading ReadResponse ! %sN)r]  r<   r  r   r   rW  rl  r=   r  r6  r  rG   r   r   r  r   rQ   rR   rH   )rk   rj   r   r9  datar   s        rl   r   zSMB_RPC_SOCKET.send  s^   
 > 5	3$-/  C
 aCI8<<Q<//D"$.. !E!UVVV%%D-#;;;x||%#   	 $   	! -#;;; .$'',,T22222 %  C QxxCH8<<Q<//D"$.. !Dt}!TUUU8<<!?   	    D "-- !Cdm!STTT##D-#;;;x||%#   	 $   	! -#;;; .$'',,T22222rn   c                 b    t                               |            t          j        |            d S r   )rS  closer   r   s    rl   r  zSMB_RPC_SOCKET.close"  s-    rn   r  )
rD  rE  rF  rG  r   r  r  r   r  rP  rQ  s   @rl   r  r    s         < < < <
L L L  :3 :3 :3 :3 :3x      rn   r  c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d=ded	ed
edededededededefdZd Zd Z	d>dZ
d Zd Z ej                    d             Z ej        e          d             Z ej                    d             Z ej        e          d             Zd?dZd@dZd Z ej        d          d@d             Z ej        e          dddd!d"            Z ej        e          d#             Z ej        d          d$             Z ej        e          d%             Zd& Z ej        e          d'             Z ej                    d(             Z ej        e          d)             Z  ej        d          d*             Z! ej        e!          d+             Z" ej        e!          d,             Z#d- Z$d. Z%d?d/Z& ej        dd0          dAdd1d2            Z' ej        e'          d3             Z( ej        e'          d4             Z) ej        dd0          d5             Z* ej        e*          d6             Z+ ej        e*          d7             Z, ej        d          d8             Z- ej        e-          d9             Z. ej        d          d:             Z/ ej        e/          d;             Z0 ej                    d<             Z1dS )B	smbclienta  
    A simple smbclient CLI

    :param target: can be a hostname, the IPv4 or the IPv6 to connect to
    :param UPN: the upn to use (DOMAIN/USER, DOMAIN\USER, USER@DOMAIN or USER)
    :param guest: use guest mode (over NTLM)
    :param ssp: if provided, use this SSP for auth.
    :param kerberos: if available, whether to use Kerberos or not
    :param kerberos_required: require kerberos
    :param port: the TCP port. default 445
    :param password: (string) if provided, used for auth
    :param HashNt: (bytes) if provided, used for auth (NTLM)
    :param ST: if provided, the service ticket to use (Kerberos)
    :param KEY: if provided, the session key associated to the ticket (Kerberos)
    :param cli: CLI mode (default True). False to use for scripting
    NFTrY   r   r   targetrs   passwordrq   kerberoskerberos_requiredHashNtrH  rV  r  c           
      
   |r|                                   d }d|v r:t          j        }t          |          s|}t	          t          |                    }n9t          j        }t          |          s|}t	          t          |                    }|s|s|s
J d            ||s	 t          |          \  }}|dk    rd}n# t          $ r d}Y nw xY w|||ddlm}  |dd	          }g }|rj|rh|+t          |d
|z  ||
          }||j        j        |j        }}|r'|                    t%          ||||
                     n#|rt          d          n|rt          d          |s7||t'          |          }|                    t)          ||                     t+          |          }nd }t          j        |t          j                  }|                    t          j        t          j        d           |                    t          j        t          j        d           |                    t          j        t          j        d           |                    t          j        t          j        d           |                    |	           |                    ||f           g | _         |	| _!        |"                    d|           tG          j$        |f||
d|| _%        	 tM          | j%                  | _'        tQ          j(                    }	 | j%        j)        j*        +                                rn| j%        j)        ,                                sg| j%        j)        -                    d          }t]          | j%        j)        j/        j/        dta          j-        |tc          |                              tQ          j(                    |z
  |	k    r(| j%        2                                 tg          d          tQ          j4        d           n(# tj          $ r | j%        2                                  w xY wddl6m7} |8                    | j%        dd          | _9        tu          tw          j-        | j'        j<        j=        d| j'        j<        j=        z            dt}          | j'        j<        j?                  | j%        j)        j@        rdndd           t          jB        d          | _C        t          jD        d          E                                | _F        d | _G        i | _H        g | _I        |r| J                    |
            d S d S )!N:z+Either UPN, ssp or guest must be provided !.Fr   )promptz
Password: T)is_passwordzcifs/%s)upnspnr  r  )rs   STKEYr  z/Kerberos required but target isn't a hostname !zSKerberos required but domain not specified in the UPN, or target isn't a hostname !rr   r   
   r`   )r   r  r  z with status zThe SMB handshake timed out.g?)DCERPC_Client)ndr64verbzSMB %sz! authentication successful using z	 as GUESTra   z !/)r  )K	_depchecksocketAF_INET6r   strr   AF_INETr   r   r   r  prompt_toolkitr  r   tgsrepticket
sessionkeyr  r   r   r   rV   SOCK_STREAM
setsockopt
SOL_SOCKETSO_KEEPALIVEIPPROTO_TCPTCP_NODELAYTCP_KEEPIDLETCP_KEEPINTVL
settimeoutconnectr  rV  
setdefaultrX   r   ru   rS  r\  timerX  r   is_set	isrunninggetr   rK  rU   hexr  rZ  sleep	Exceptionscapy.layers.msrpce.rpcclientr  from_smblink	rpcclientprintr-   r   r   reprr   rz   pathlibPureWindowsPathpwdrf  resolvelocalpwdcurrent_treels_cachesh_cacheloop)rk   r  rs   r  rq   r  r  r  rH  rV  r  r   r  r  clir   hostnamefamilyr  realmr  sspsr9  ru   _tr*  r  s                              rl   r   zsmbclient.__init__:  s   &  	NN&==_FV$$ "!f&&FF^FF## "!V%%FQcQUQQ$QQQQ; 0%)#HAu||#(! % % %$HHH% >h&62:555555%vlEEEH  z- # )H 4%-"'	       +&*k&8$/B KCBCu$U$U$UVVVV* (M   ' $7  
 ) A~(*>!&xKKC ? ? ?@@@oo }VV%788
 	)6+>BBB*F,>BBB*F,?DDD*F,@"EEE   fd^$$$$&!-000+

 
 	
 
		%di00DLB 9>07799 y~//11 !Y^//99F) !IN0666(,VS[[AAA   9;;#g--IOO%%%&'EFFF
3!    	 	 	IOO	 	@?????&33DIUQV3WW  L(0t|3;;    T\)4555#y~5=2==
	
 
	
 
	
 *3//S))1133  	#IIEI"""""	# 	#s   'C CC-D.P %Qc                 <    d|                      | j                  z  S )Nz
smb: \%s> )normalize_pathr	  r   s    rl   ps1zsmbclient.ps1  s    t2248<<<<rn   c                 V    t          d           | j                                         d S )NzConnection closed)r  r\  r  r   s    rl   r  zsmbclient.close  s+    !"""rn   c                 :    | j         |st          d           dS d S )Nz,No share selected ! Try 'shares' then 'use'.T)r  r  )rk   silents     rl   _require_sharezsmbclient._require_share  s0    $ FDEEE4 %$rn   c                     t          j        t          j                            |                                                    S r   )r  r  ospathnormpathas_posixrk   r  s     rl   collapse_pathzsmbclient.collapse_path  s-     &rw'7'7'H'HIIIrn   c                 l    t          |                     |                                        d          S )z/
        Normalize path for CIFS usage
        rg  )r  r#  lstripr"  s     rl   r  zsmbclient.normalize_path  s.     4%%d++,,33D999rn   c                 6   | j         r| j         S | j                            d           | j                            t	          d                     t          t          dt          dt          d                              d          }| j        	                    || j
        	          }| j                                         t          |t                    st          d
          g }|                    d          D ]}|                    d          dz  }|                    |                    d                                          t%          j        ||          |                    d                                          f           || _         |S )z+
        List the shares available
        srvsvcr   Nrh  )tagvalue)Level	ShareInfol    )
InfoStructPreferedMaximumLengthrU  zNetrShareEnum_Request failed !zInfoStruct.ShareInfo.Buffer	shi1_typeishi1_netnameshi1_remark)r  r  open_smbpipebindr   r   r   r   r   sr1_reqrV  close_smbpiper   r   r  valueofr  decoderT   r  )rk   reqr9  r  sharer.  s         rl   shareszsmbclient.shares  s    = 	!= ##H---1(;;<<<#*"0===     #-	
 	
 	
 ~%%c4<%@@$$&&&$ 677 	?=>>>\\"?@@ 	 	Ek22Z?INNMM.1188::&*9i@@MM-007799     rn   c                 B    t          t          |dg                     dS )z.
        Print the output of 'shares'
        )	ShareName	ShareTypeCommentNr  r   rk   r  s     rl   shares_outputzsmbclient.shares_output  s&    
 	k'$I#JKKLLLLLrn   c                     | j                             |          | _        t          j        d          | _        | j                                         dS )z
        Open a share
        r  N)r\  rn  r  r  r  r	  r  clearrk   r8  s     rl   usezsmbclient.use!  sH    
 !L55e<<*3//rn   c                 D    fd|                                  D             S )z%
        Auto-complete 'use'
        c                 n    g | ]1}|d                                         r|d          dk    )|d          2S )r   zIPC$)
startswith)ri   rj   r8  s     rl   rm   z*smbclient.use_complete.<locals>.<listcomp>/  sE     
 
 
1Q4??5+A+A
FGdfnnAaDnnnrn   )r9  rC  s    `rl   use_completezsmbclient.use_complete*  s6    

 
 
 
++--
 
 
 	
rn   c                 ^    |rt           j        nt           j        |          } |rt           j        nt           j        d          }|j        }|                    d          s|                    d          r|}d}n.|j        r|j        j        s|                                r|j        }||fS )zG
        Parse a path. Returns the parent folder and file name
        r  r  rg  ra   )r  r  rf  r;  endswithparentis_absolute)rk   argremoteelteltpareltnames         rl   
_parsepathzsmbclient._parsepath3  s    
 C&Bw&&glCHHEVE'))sKK(<< 	 T 2 2 	 FGGZ 	 CJO 	 s/@/@ 	 ZFwrn   c                     d |                      |          \  	 |                               }n# t          $ r g cY S w xY wfd|D             S )zN
        Return a listing of the remote files for completion purposes
        Nc                     dS NTrh   )r  s    rl   <lambda>z(smbclient._fs_complete.<locals>.<lambda>G  s    T rn   rK  c                     g | ]t}|d                                                                                                          r3|d          dvK |d                   \t          |d          z            uS )r   r  z..r   )lowerrG  r  ri   rj   condrQ  rP  s     rl   rm   z*smbclient._fs_complete.<locals>.<listcomp>N  s     
 
 
!

''88	

 aD++D1JJ ,	 1 ,++rn   )rR  lsr  )rk   rM  r\  r  rQ  rP  s     ` @@rl   _fs_completezsmbclient._fs_completeB  s     <!>D//#..	GG6G**EE 	 	 	III	
 
 
 
 
 

 
 
 	
s   9 AAc                     |                      |d           }t          |          dk    r'|d                             |          r|d         dz   gS |S )zN
        Return a directories of remote files for completion purposes
        c                     | j         S r   )r~  rj   s    rl   rV  z)smbclient._dir_complete.<locals>.<lambda>^  s	    15 rn   )r\  r   r   rg  )r^  r   rG  )rk   rM  r  s      rl   _dir_completezsmbclient._dir_completeX  sh     ##55 $ 
 
 w<<1!6!6s!;!;AJ%&&rn   )spacesc                    |                                  rdS | j        }|||z  }|                     |          }| j        r|| j        v r| j        |         S | j                            | j                   | j                            |d| j                  }| j        	                    |          }| j        
                    |           || j        |<   |S )z
        List the files in the remote directory
        -t: sort by timestamp
        -S: sort by size
        -r: reverse while sorting
        Nr}  r   r  )r  r	  r  r  r\  rb  r  r  r  r  r  )rk   rK  r	  fileIdr  s        rl   r]  zsmbclient.lse  s        	Fh6MC!!#&&= 	&SDM11=%%T.///,,!%!: - 
 
 ,,V44""6***"crn   )tSrq  c                   t          dddg dd          |r|                    d            |r|                    d	            |r|ddd
         }fd|D             }t          t          |dgd                     dS )z*
        Print the output of 'ls'
        ra   Nz<Q)iA  r   r   r   r   r   g    cA)fmtepochcustom_scalingc                     | d          S )Nrw   rh   ra  s    rl   rV  z%smbclient.ls_output.<locals>.<lambda>      !u rn   )keyc                     | d          S )Nr   rh   ra  s    rl   rV  z%smbclient.ls_output.<locals>.<lambda>  rn  rn   c           
         g | ]~}|d          d                     d t          |d                                       d          D                       t          |d                                       d|d                   fS )r   r   c              3   @   K   | ]}|                     d           V  dS )FILE_ATTRIBUTE_N)r%  )ri   ys     rl   	<genexpr>z1smbclient.ls_output.<locals>.<listcomp>.<genexpr>  s/      SS"344SSSSSSrn   r   r   Nrw   )r   r  splitr   i2repr)ri   rj   flds     rl   rm   z'smbclient.ls_output.<locals>.<listcomp>  s     
 
 
  !SSc!A$iiooc>R>RSSSSS1Q4  

41&&	
 
 
rn   r  )sortBy)r	   sortr  r   )rk   r  rg  rh  rq  ry  s        @rl   	ls_outputzsmbclient.ls_output  s    
 $&;&;&;C
 
 
  	.LL__L--- 	.LL__L--- 	$dddmG
 
 
 
 
 
 
 	MN  	
 	
 	
 	
 	
rn   c                 \    |                      d          rg S |                     |          S )z"
        Auto-complete ls
        Tr  r  rb  rk   r}  s     rl   ls_completezsmbclient.ls_complete  6    
 d++ 	I!!&)))rn   c                     |                                  rdS |st          | j                  S | xj        |z  c_        |                     | j                  | _        | j                                         dS )z5
        Change the remote current directory
        N)r  r  r	  r#  r  rB  r  s     rl   cdzsmbclient.cd  st    
    	F 	!tx== F%%dh//rn   c                 \    |                      d          rg S |                     |          S )z"
        Auto-complete cd
        Tr~  r  r  s     rl   cd_completezsmbclient.cd_complete  r  rn   c                     |                      |d          \  | j        z  fd                                                    d          D             S )zI
        Return a listing of local files for completion purposes
        F)rN  c                     g | ]b}|j                                                                                                       @ |          Kt          |j         z            cS rh   )r;  rZ  rG  r  r[  s     rl   rm   z+smbclient._lfs_complete.<locals>.<listcomp>  ss     
 
 
 ))'--//::	
 @DtAww	
  
 
 
rn   r  )rR  r  r
  glob)rk   rM  r\  rQ  rP  s     `@@rl   _lfs_completezsmbclient._lfs_complete  s{     //#e/<<'
 
 
 
 
 
 ^^%%**3//
 
 
 	
rn   c                 ,    |rt          |           dS dS )z*
        Print the output of 'cd'
        Nr  rk   results     rl   	cd_outputzsmbclient.cd_output  %    
  	&MMMMM	 	rn   c                 P    t          | j                            d                    S )z7
        List the files in the local directory
        r  )listr  r  r   s    rl   llszsmbclient.lls  s"    
 DM&&s++,,,rn   c                 n    d d |D             D             }t          t          |dg                     dS )z+
        Print the output of 'lls'
        c           
          g | ]K\  }}|j         t          |j                  t          j        d t          j        |j                            fLS )z%Y-%m-%d %H:%M:%S)r;  r   st_sizer  strftime	localtimest_mtime)ri   rj   stats      rl   rm   z(smbclient.lls_output.<locals>.<listcomp>  s^     
 
 
 4	 4<((14>$-3P3PQQ
 
 
rn   c              3   B   K   | ]}||                                 fV  d S r   )r  r   s     rl   rv  z'smbclient.lls_output.<locals>.<genexpr>  s.      ;;aQM;;;;;;rn   )r  z	File SizezLast Modification TimeNr>  r?  s     rl   
lls_outputzsmbclient.lls_output  s_    

 
 <;7;;;
 
 
 	"U!VWW	
 	
 	
 	
 	
rn   c                     |st          | j                  S | xj        |z  c_        | j                                        | _        dS )z4
        Change the local current directory
        N)r  r  r
  r  s     rl   lcdzsmbclient.lcd  sE    
  	&t}%%%--//rn   c                 0    |                      |d           S )z#
        Auto-complete lcd
        c                 *    |                                  S r   is_dirra  s    rl   rV  z(smbclient.lcd_complete.<locals>.<lambda>  s    AHHJJ rn   r  r  s     rl   lcd_completezsmbclient.lcd_complete  s    
 !!&*>*>???rn   c                 ,    |rt          |           dS dS )z+
        Print the output of 'lcd'
        Nr  r  s     rl   
lcd_outputzsmbclient.lcd_output  r  rn   c                 (   | j         |z  }| j                            | j                   | j                            |                     |          ddg| j        z             }t          | j                            |dd                    }|j	        j
        }d}|r[t          | j        j        j        |          }|                    | j                            |||                     ||z  }||z  }|[| j                            |           |S )	z8
        Gets the file bytes from a remote host
        r  FILE_SEQUENTIAL_ONLYre  SMB2_0_INFO_FILEr+   )r  r  r  r   )r   r  )r	  r\  rb  r  r  r  r  r+   r  StandardInformationr  minru   rX  r   writer  r  )	rk   r  r?  fpathrf  infolengthoffset
lengthReads	            rl   	_get_filezsmbclient._get_file  s>   
 4T.///,,&&&" '"( - 
 
 "L##+2 $  
 
 )3 	!TY^7@@JHH))&F)SS   j Fj F  	! 	""6***rn   c                    | j         |z  }| j                            | j                   | j                            |                     |          dd| j                  }d}	 |                    | j        j	        j
                  }|sn!|| j                            |||          z  }H| j                            |           |S )z6
        Send the file bytes to a remote host
        r  rw  r   r  r  r   T)r   r  r  )r	  r\  rb  r  r  r  r  readru   rX  r   r  r  )rk   fnamer?  r  rf  r  r  s          rl   
_send_filezsmbclient._send_file4  s    
 5 T.///,,&&!%!:	 - 
 
 		7749>677D dl00 1   F		 	""6***rn   c           	      &   d}|                                 s|                                 |                     |          D ]}|d         dv r||d         z  }||d         z  }	 |d         j        r||                     ||          z  }n||                     ||          d         z  }|rt          |           |# t          $ rG}|r;t          t          j	        
                    |          dt          |                     Y d}~d}~ww xY w|S )z
        Internal recursive function to get a directory

        :param directory: the remote directory to get
        :param _root: locally, the directory to store any found files
        r   rW  rY  r   z->N)existsmkdirr]  r~  _getrr  r  r  r   r  r  r  )	rk   	directory_root_verbsizerj   rN  localexs	            rl   r  zsmbclient._getrR  s5    ||~~ 	KKMMM	** 	G 	GAt{""1%FAaDLEGQ40 7DJJvu555DD DHHVU33A66D "&MMM G G G G$*..v66c"ggFFFG s   %AB==
D=D		D)rc  globsupport)rq  c                   |                                  rdS |r=|                     |          \  }}||                     ||z  | j        |z  |          fS t	          j        |          j        }|
| j        |z  }|                    d          5 }|                     ||          }	ddd           n# 1 swxY w Y   ||	fS )zN
        Retrieve a file
        -r: recursively download a directory
        N)r  r  wb)	r  rR  r  r  r  r  r;  openr  )
rk   r  _destr  rq  dirpardirnamer  r?  r  s
             rl   r  zsmbclient.getq  s       	F 	"ood33OFG mg- $     +D116E}-D!! 0R~~dB//0 0 0 0 0 0 0 0 0 0 0 0 0 0 0$;s   B33B7:B7c           	      b    t          d|d         dt          |d                              dS )z+
        Print the output of 'get'
        zRetrieved 'r   z
' of size r   N)r  r   )rk   r  s     rl   
get_outputzsmbclient.get_output  s6    
 	T!WWWja6I6I6IJKKKKKrn   c                 \    |                      d          rg S |                     |          S )z#
        Auto-complete get
        Tr~  r  r^  rk   r  s     rl   get_completezsmbclient.get_complete  6    
 d++ 	I  &&&rn   c                     |                                  rdS t          j                    }|                     ||           |                                S )z
        Print a file
        N)r  ioBytesIOr  getvalue)rk   r  bufs      rl   catzsmbclient.cat  sJ    
    	FjlltS!!!||~~rn   c                 L    t          |                    d                     dS )z+
        Print the output of 'cat'
        backslashreplace)errorsN)r  r6  r  s     rl   
cat_outputzsmbclient.cat_output  s'    
 	fmm#5m6677777rn   c                 \    |                      d          rg S |                     |          S )z#
        Auto-complete cat
        Tr~  r  r  s     rl   cat_completezsmbclient.cat_complete  r  rn   c                 z   |                                  rdS | j        |z  }|                                rt          d          t	          j        |          j        }|                    d          5 }|                     ||          }ddd           n# 1 swxY w Y   | j	        
                                 ||fS )z
        Upload a file
        Nzput on dir not implrb)r  r  r  r  r  rf  r;  r  r  r  rB  )rk   r  
local_filer  r?  r  s         rl   putzsmbclient.put  s    
    	F]T)
 	22333L&&+E&& 2"ub112 2 2 2 2 2 2 2 2 2 2 2 2 2 2d{s   2BBBc                 0    |                      |d           S )z#
        Auto-complete put
        c                 ,    |                                   S r   r  ra  s    rl   rV  z(smbclient.put_complete.<locals>.<lambda>  s    

N rn   r  r  s     rl   put_completezsmbclient.put_complete  s    
 !!&*B*BCCCrn   c                 `   |                                  rdS | j        |z  }| j                            | j                   | j                            |                     |          dd| j                  }| j                            |           | j	        
                                 |j        S )z
        Delete a file
        Nr  rB  r  )r  r	  r\  rb  r  r  r  r  r  r  rB  r;  )rk   r  r  rf  s       rl   rmzsmbclient.rm  s    
    	F4T.///,,&&!%!:	 - 
 
 	""6***zrn   c                 \    |                      d          rg S |                     |          S )z"
        Auto-complete rm
        Tr~  r  r  s     rl   rm_completezsmbclient.rm_complete  r  rn   c                     d| j         v r+t          d           | j                             d           dS t          d           | j                             d           dS )z.
        Turn on or off backup intent
        FILE_OPEN_FOR_BACKUP_INTENTzBackup Intent: OffzBackup Intent: OnN)r  r  remover  r   s    rl   backupzsmbclient.backup  sl    
 )D,EEE&'''%,,-JKKKKK%&&&%,,-JKKKKKrn   )NNFTFNrY   r   r   NNNT)F)Tr   rU  )2rD  rE  rF  rG  r  r   r   r   r  r  r  r#  r  r   
addcommandr9  	addoutputr@  rD  addcompleterH  rR  r^  rb  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  rh   rn   rl   r  r  '  s        ( "'`# `#`# `# 	`#
 `# `#  `# `# `# `# `# `# `# `#D= = =     J J J
: : : W# # #J WvM M M W   W
 
 
   
 
 
 
,   Wt$$$   %$> Wr&+u 
 
 
 
 
B W* * * Wt$$$  %$ W* * *
 
 
 Wr   W- - - Ws
 
 
  Wt$$$0 0 %$0 W@ @ @ Ws  $ $ $L  <   > Wt666U     76. WsL L L W' ' ' Wt666	 	 76	 Ws8 8 8 W' ' ' Wt$$$  %$" WD D D Wt$$$  %$* W' ' ' W	L 	L 	L 	L 	Lrn   r  __main__)AutoArgparse)trG  r  r  r  r  r  r   scapy.automatonr   r   r   scapy.base_classesr   scapy.configr   scapy.errorr   scapy.fieldsr	   scapy.supersocketr
   scapy.utilsr   r   r   r   r   scapy.volatiler   scapy.layers.dcerpcr   r   scapy.layers.gssapir   r   r   scapy.layers.inet6r   scapy.layers.kerberosr   r   r   scapy.layers.msrpce.raw.ms_srvsr   r   r   r   scapy.layers.ntlmr   r   scapy.layers.smbr    r!   r"   r#   r$   r%   r&   r'   r(   r)   scapy.layers.smb2r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   scapy.layers.spnegorV   rX   rS  r  commandsregisterr  rD  r  rh   rn   rl   <module>r     s    
			 				        7 7 7 7 7 7 7 7 7 7 " " " " " "       ' ' ' ' ' ' % % % % % % ) ) ) ) ) )              $ # # # # # ? ? ? ? ? ? ? ?         
 $ # # # # #         
                                         - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\ * ) ) ) ) )U. U. U. U. U. U. U. U.p~ ~ ~ ~ ~ ~ ~ ~B
S S S S SZ S S Sl OL OL OL OL OL OL OL OLd z((((((L rn   