
    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mZ ddlm	Z	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 dd	lmZmZ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"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZkmlZlmmZm ddlnmoZo ddlpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZz ddl{m|Z|m}Z}m~Z~  G d d          Z G d de
          Z G d de          Z G d d          Zedk    rddlmZ  ee           dS dS )aF  
SMB 2 Server Automaton

This provides a [MS-SMB2] server that can:
- serve files
- host a DCE/RPC server

This is a Scapy Automaton that is supposedly easily extendable.

.. note::
    You will find more complete documentation for this layer over at
    `SMB <https://scapy.readthedocs.io/en/latest/layers/smb.html#server>`_
    N)get_if_addr)ATMT	Automaton)conf)log_runtimelog_interactive)RandUUID)DCERPC_TransportNDRUnion)GSS_S_COMPLETEGSS_S_CONTINUE_NEEDEDGSS_S_CREDENTIALS_EXPIRED)DCERPC_Server)NTLMSSP)
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SMBTree_Connect_AndX
SMB_Header)EDFS_REFERRAL_ENTRY1DFS_REFERRAL_V3	DirectTCPFILE_BOTH_DIR_INFORMATIONFILE_FULL_DIR_INFORMATIONFILE_ID_BOTH_DIR_INFORMATIONFILE_NAME_INFORMATIONFileAllInformationFileAlternateNameInformationFileBasicInformationFileEaInformationFileFsAttributeInformationFileFsSizeInformationFileFsVolumeInformationFileIdBothDirectoryInformationFileInternalInformationFileNetworkOpenInformationFileStandardInformationFileStreamInformationNETWORK_INTERFACE_INFOSECURITY_DESCRIPTORSMB2_Cancel_RequestSMB2_Change_Notify_RequestSMB2_Change_Notify_ResponseSMB2_Close_RequestSMB2_Close_ResponseSMB2_Create_Context&SMB2_CREATE_DURABLE_HANDLE_RESPONSE_V2)SMB2_CREATE_QUERY_MAXIMAL_ACCESS_RESPONSESMB2_CREATE_QUERY_ON_DISK_IDSMB2_Create_RequestSMB2_Create_ResponseSMB2_Echo_RequestSMB2_Echo_ResponseSMB2_Encryption_CapabilitiesSMB2_Error_ResponseSMB2_FILEIDSMB2_Header!SMB2_IOCTL_Network_Interface_InfoSMB2_IOCTL_Request SMB2_IOCTL_RESP_GET_DFS_ReferralSMB2_IOCTL_Response+SMB2_IOCTL_Validate_Negotiate_Info_ResponseSMB2_Negotiate_ContextSMB2_Negotiate_Protocol_Request SMB2_Negotiate_Protocol_Response#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_Logoff_RequestSMB2_Session_Logoff_ResponseSMB2_Session_Setup_RequestSMB2_Session_Setup_ResponseSMB2_Set_Info_RequestSMB2_Set_Info_Response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SOCKADDR_STORAGESRVSVC_SHARE_TYPES)	SPNEGOSSP)
LPSERVER_INFO_101LPSHARE_ENUM_STRUCTLPSHARE_INFO_1NetrServerGetInfo_RequestNetrServerGetInfo_ResponseNetrShareEnum_RequestNetrShareEnum_ResponseNetrShareGetInfo_RequestNetrShareGetInfo_ResponseSHARE_INFO_1_CONTAINER)LPWKSTA_INFO_100NetrWkstaGetInfo_RequestNetrWkstaGetInfo_Responsec                        e Zd ZdZddZd ZdS )SMBSharea  
    A class used to define a share, used by SMB_Server

    :param name: the share name
    :param path: the path the the folder hosted by the share
    :param type: (optional) share type per [MS-SRVS] sect 2.2.2.4
    :param remark: (optional) a description of the share
    .N c                     |d}|                     d          r|dz  }|                                | _        t          j        |                                          | _        || _        || _        || _	        d S )Nr   $        )
endswithlower_namepathlibPathresolvepathnametyperemark)selfr|   r{   r}   r~   s        Z/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/smbserver.py__init__zSMBShare.__init__   so    <D}}S!! #
"ZZ\\
L&&..00			    c           
          t           | j        dz           }| j        dz  rd|z   }| j        dz  rd|z   }d| j        d|d| j        r
d	| j        z  pd
dt	          | j                  d	S )Nirt   zSPECIAL+i   @z
TEMPORARY+z
<SMBShare z []z '%s'rq   z = >)r_   r}   r|   r~   strr{   )r   r}   s     r   __repr__zSMBShare.__repr__   s    !$)j"899z! 	%$D9z! 	'$&DIIIDDK3Wt{29r99	NNNN	
 	
r   )rp   Nrq   )__name__
__module____qualname____doc__r   r    r   r   ro   ro      sA            
 
 
 
 
r   ro   c                   	    e Zd ZdZeZeZg dddfdZe	d             Z
dPdZ fdZ ej        d	
          d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej                    d             Zd Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej                    d             Z ej        e          d             Z ej        e          d             Z ej                    d             Z ej        ed	          d             Z dQdZ! ej        d	          d             Z"d Z#d  Z$ ej                    d!             Z% ej        e%          d"             Z& ej        e&          d#             Z' ej        e%          d$             Z( ej        e%          d%             Z) ej        e%          d&             Z* ej        e*          d'             Z+ ej        e%          d(             Z, ej        e,          d)             Z- ej        e%          d*             Z. e/d+d,-           e/d.d/-           e/d0d1-          d2Z0 e/d3d3-          Z1d4 Z2d5 Z3dRd7Z4d8 Z5d9 Z6d: Z7 ej        e.          d;             Z8 ej        e%          d<             Z9 ej        e9          d=             Z: ej        e%          d>             Z; ej        e;          d?             Z< ej        e%          d@             Z= ej        e=          dA             Z> ej        e%          dB             Z? ej        e?          dC             Z@ ej        e%          dD             ZA ej        eA          dE             ZB ej        e%          dF             ZC ej        eC          dG             ZD ej        e%          dH             ZE ej        eE          dI             ZF ej        e%          dJ             ZG ej        eG          dK             ZH ej        e%          dL             ZI ej        eI          dM             ZJ ej        e%          dN             ZK ej        eK          dO             ZL xZMS )S
SMB_Servera  
    SMB server automaton

    :param shares: the shares to serve. By default, share nothing.
                   Note that IPC$ is appended.
    :param ssp: the SSP to use

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

    :param ANONYMOUS_LOGIN: mark the clients as anonymous
    :param GUEST_LOGIN: mark the clients as guest
    :param REQUIRE_SIGNATURE: set 'Require Signature'
    :param MAX_DIALECT: maximum SMB dialect. Defaults to 0x0311 (3.1.1)
    :param TREE_SHARE_FLAGS: flags to announce on Tree_Connect_Response
    :param TREE_CAPABILITIES: capabilities to announce on Tree_Connect_Response
    :param TREE_MAXIMAL_ACCESS: maximal access to announce on Tree_Connect_Response
    :param FILE_MAXIMAL_ACCESS: maximal access to announce in MxAc Create Context
    NTc           	         || _         d|vrt          d          |                    dd          | _        |                    dd           | _        |                    dd          | _        |                    dd          | _        |                    d	d          | _        |                    d
d          | _        |                    dd          | _	        |                    dd          | _
        |                    dd                    g d                    | _        |                    dd                    g d                    | _        |                    dt          |                    dt           j                  pt           j                  g          | _        |                    dg           | _        | j        rt)          j        d           || _        |                                | _        | j                            t5          ddd                     t7          t8          j        | j        | j                   | _        d|v r-| j                            |                    d                     d| _         d | _!        tE                      #                                | _$        d| _%        d | _&        |-tO          tQ          dd          g          }| j        d| _        tS          j*        | g|R i | || j+        _,        |                    d | j        rd!nt[          |                    | j+        _.        d S )"Nsockz<SMB_Server cannot be started directly ! Use SMB_Server.spawnANONYMOUS_LOGINFGUEST_LOGINEXTENDED_SECURITYTUSE_SMB1REQUIRE_SIGNATUREMAX_DIALECT  TREE_SHARE_FLAGSz-FORCE_LEVELII_OPLOCK+RESTRICT_EXCLUSIVE_OPENSTREE_CAPABILITIESr   TREE_MAXIMAL_ACCESS+)FILE_READ_DATAFILE_WRITE_DATAFILE_APPEND_DATAFILE_READ_EAFILE_WRITE_EAFILE_EXECUTEFILE_DELETE_CHILDFILE_READ_ATTRIBUTESFILE_WRITE_ATTRIBUTESDELETEREAD_CONTROL	WRITE_DACWRITE_OWNERSYNCHRONIZEFILE_MAXIMAL_ACCESS)r   r   r   r   r   r   	LOCAL_IPSifaceDOMAIN_REFERRALSz Serving SMB1 is not supported :/IPC$l       z
Remote IPC)r|   r}   r~   )sharesverbDCERPC_SERVER_CLS)USE_MICDO_NOT_CHECK_LOGINSECURITY_MODE   )/r   
ValueErrorpopr   r   r   r   r   r   r   r   joinr   r   r   getr   r   r   r   r   warningreadonlycopyr   appendro   SMB_DCERPC_Serverr
   NCACN_NP
rpc_serverextendSMB2NegotiateCapabilitiesr	   _fixGUIDNextCompoundCompoundedHandler`   r   r   r   sessionsspboolSecurityMode)r   r   r   r   r   argskwargss          r   r   zSMB_Server.__init__   sL   	N    &zz*;UCC!::mT::!',?!F!F

:u55!',?!G!G!::mV<< &

 O!
 !
 "(,?!C!C#)::!HH   $
 $
 * $*::!HH  	 	$
 $
   +fjj$*&E&E&STTU
 
 !'

+=r B B= 	D BCCC kkmm#  	
 	
 	
 ,%;
 
 
 &((O""6::.A#B#BCCC	%)"JJOO%%	 " $; %+/   C '#' 41$111&111$*JJ'6AAT#YY%
 %
!!!r   c                     | j         j        S N)r   r   r   s    r   r   zSMB_Server.sessionC  s     y  r   rq   c                     | j         r7t          j        rt          j        d|           dS t          d|z             dS dS )z,
        Verbose print (if enabled)
        z> %sN)r   r   interactiver   infoprint)r   ss     r   vprintzSMB_Server.vprintH  sT     9 	" "$VQ/////fqj!!!!!		" 	"r   c                 b    t          t          |                               || j                  S )N)
Compounded)superr   sendr   )r   pkt	__class__s     r   r   zSMB_Server.sendR  s)    Z&&++CD<M+NNNr      )initialc                     d| _         d S )NF)authenticatedr   s    r   BEGINzSMB_Server.BEGINU  s    "r   c                 f    t           |v r'|                                                     |          d S r   )r   
NEGOTIATEDaction_parametersr   r   s     r   received_negotiatezSMB_Server.received_negotiateY  s3    3&&//##55c::: '&r   c                 t    t           |v r.d| _        |                                                     |          d S )NT)rG   r   r   r   r   s     r   received_negotiate_smb2_beginz(SMB_Server.received_negotiate_smb2_begin^  s:    *c11DI//##55c::: 21r   c                 0    |                      |           d S r   on_negotiater   s     r   on_negotiate_smb2_beginz"SMB_Server.on_negotiate_smb2_begind      #r   c                 	     j         j                                        \   j         _        }d }d }t          |v rA|t                   j        } fd|D             }|                    d           |r|d         }nd |t                   j        D             } j        r|	                    d          }nMdD ]5\  }}	 |	                    |          }|}d _
         n%# t          $ r Y 2w xY w|	                    d          }|r|dz  dk    r| j         _        d }	 j
        rLt          }	t                      t          d	d
d
          z   _        t          |v r                     |           nSt                      t%          dd|j        |j        |j        |j                  z   _         j        rt0          }	nt2          }	|| j
        r0 j                                        t7                      z  }
d|
_        n/ j                                        t;                      z  }
d|
_        d|
_                             |
           d S  j
        r`d                     g d           _!        |dk    r( xj!        dd                     g d          z   z  c_!        |dv r xj!        dz  c_!         j                                         |	| j         j"        tG          j#                    dz   dz  dddd j!                  z  }
|dk    rd|
_$        d|
_%        d|
_&        |dk    rtO                      tQ           j         j)        g j         j*                  z  tO                      tW           j         j,        g          z  tO                      t[           j         j.        g           z  g|
_/        nb j                                         |	|d! j         j"        tG          j#                    dz   dz  d"#          z  }
 j        r|
xj0        d$z  c_0         j        s j
        r j1        |
_1        ||
_2        n||
_2        |
xj3        d$z  c_3         j
        s(|
t$                   j3        d%z
  d&z   |
t$                   _3        t          |v rK j         4                    tk          |t                             tk          |
t                                                             |
           d S )'Nc                 *    g | ]}|j         k    |S r   )r   ).0xr   s     r   
<listcomp>z+SMB_Server.on_negotiate.<locals>.<listcomp>q  s&    UUUaqDDT?T?T?T?T?Tr   T)reverser   c                     g | ]	}|j         
S r   )DialectStringr   r   s     r   r   z+SMB_Server.on_negotiate.<locals>.<listcomp>w  s'       $%  r   s
   NT LM 0.12))s	   SMB 2.???i  )s	   SMB 2.002i     SMB2_FLAGS_SERVER_TO_REDIRr   )FlagsCreditRequestCreditChargez*REPLY+CASE_INSENSITIVE+CANONICALIZED_PATHSzILONG_NAMES+EAS+NT_STATUS+SMB_SECURITY_SIGNATURE+UNICODE+EXTENDED_SECURITY)r   Flags2TIDMIDUIDPIDLowSMB2_NEGOTIATESMB_COM_NEGOTIATESTATUS_NOT_SUPPORTEDr   )DFSLEASING	LARGE_MTU   )MULTI_CHANNELPERSISTENT_HANDLESDIRECTORY_LEASING)r  i  z+ENCRYPTIONl    !l
 g    cAi   )DialectRevisionr   
ServerTimeServerStartTimeMaxTransactionSizeMaxReadSizeMaxWriteSizeCapabilitiesi   r   )HashAlgorithmsSalt)Ciphers)SigningAlgorithmszUNICODE+LARGE_FILES+NT_SMBS+RPC_REMOTE_APIS+STATUS32+LEVEL_II_OPLOCKS+LOCK_AND_READ+NT_FIND+LWIO+INFOLEVEL_PASSTHRU+LARGE_READX+LARGE_WRITEX<   )DialectIndexServerCapabilitiesr   r  ServerTimeZoner   SMB_SECURITY_SIGNATUREz,SMB_SECURITY_SIGNATURE_REQUIRED+IS_LONG_NAME)6r   r   NegTokenInit2
sspcontextrG   Dialectssortr   r   indexr   r   DialectrH   r   r@   
smb_headerupdate_smbheaderr   r   r   r   r   r   r   r   r   r>   Commandr   Statusr   r   r   r   timer  r  r  rF   rI   PreauthIntegrityHashIdr  r=   CipherIdrV   SigningAlgorithmIdNegotiateContextsr  r   SecurityBlobr   computeSMBConnectionPreauthbytes)r   r   spnego_tokenr  r  DialectRevisionsDialectIndexeskeyrevclsresps   `          r   r   zSMB_Server.on_negotiateh  s   040@0N0N0P0P-*c11"#BCLUUUU+;UUU!!$!/// 6"21"5 ),-A)B)K  N } G-33MBB !Q 	G 	GHC'5';';C'@'@*-$(	%    $2#7#7#F#FL 	35==#2DL 9 	52C'kkK2- - - DO
 /#55%%c*** (kkJB0 GGGz
- 
- 
- 
DO % 5=4"|';y 3++--0C0E0EE/++--0A0AA20DKIIdOOOF9 M	?),  * *D& &(( **cCHH  5 5 / ** "222 **m;**?''))CC /!\6 IKK+5< !#(!"!7	- 	- 	- 	D &((*2'#+ $,!&(( +,,9(,(K'L!\.   +,,2!%!6 7   +,,/+/<+J*K  *&. ?''))CC)G "\6 IKK+5<#
- 
- 
- 
D % ?''+>>''! 		/TY 		/	DI ,D !-DKK..KKy 	Z '*+@A #
 #L44c+&''d;'((   			$s   <C
C)(C)c                     d S r   r   r   s    r   r   zSMB_Server.NEGOTIATED      r   c                    |j         | j        _         |j        | j        _        t          |j                  | _        |j        j        r| j        xj        dz  c_        n| j        xj        dz  c_        | j        j	        pddk    r?| j        xj        dz  c_        | j        xj        t          |j                  dz  z  c_        |j        | j        _        |j        | j        _        |j        | j        _        |j        | j        _        dS )zV
        Called when receiving a SMB2 packet to update the current smb_header
        SMB2_FLAGS_RELATED_OPERATIONSr   r   i  p   N)r   r!  r   r   NextCommandr   r   r7  r   r   int	SessionIdr   r   PIDr   s     r   r"  zSMB_Server.update_smbheader  s    
 ),(9% (+'7$ 11 92 	EO!!%DD!!!O!!%DD!!L %A&00O!!V+!!O!!S^^d%::!!$'M!!g!g!gr   c                 f    t           |v r'|                                                     |          d S r   )rG   r   r   r   s     r   received_negotiate_smb2z"SMB_Server.received_negotiate_smb29  s3    *c11//##55c::: 21r   c                 0    |                      |           d S r   r   r   s     r   on_negotiate_smb2zSMB_Server.on_negotiate_smb2>  r   r   c                 0   t           |v s	t          |v rKt           |v r|j        }n|t                   j        }|                                                     ||          t          |v r/|j        }|                                                     ||          d S r   )r   r   r*  UnicodePasswordRECEIVED_SETUP_ANDX_REQUESTr   rR   )r   r   ssp_blobs      r   receive_setup_andx_requestz%SMB_Server.receive_setup_andx_requestB  s     <sBB,33 ?#EE+ <=M2244FFsHUUU'3..'H2244FFsHUUU /.r   c                     d S r   r   r   s    r   rC  z&SMB_Server.RECEIVED_SETUP_ANDX_REQUESTU  r5  r   c                 ^   | j         j                            | j         j        |          \  | j         _        }}|                     |           t
          |v rd| j        _        |t          t          fvrt
          |v r0| j        
                                t                      z  }||_        n(| j        
                                t                      z  }|t          k    rd|_        nd|_        d | j         _        nt"          |v s	t
          |v rt
          |v rE| j        
                                t                      z  }| j        rd|_        | j        rd|_        n9| j        
                                t+          dd          z  }| j        rd|_        ||_        n4t.          |v r+| j        
                                t1          dd          z  }|t          k    rd	nd
|_        |t          k    rL| j                             t5          |t6                             t5          |t6                                        n2| j                             t5          |t6                                        |t          k    r | j                                          d| _        |                     |           d S )Nl         STATUS_PASSWORD_EXPIREDSTATUS_LOGON_FAILUREIS_GUESTIS_NULLzWindows 4.0)NativeOSNativeLanManSMB_SETUP_GUESTr   l       T)r   r   GSS_Accept_sec_contextr  r"  rR   r!  r;  r   r   r   rS   r*  r   r   r$   SessionPreauthIntegrityHashValuer   r   SessionFlagsr   r   Actionr   r   computeSMBSessionPreauthr,  r@   computeSMBSessionKeyr   r   )r   r   rD  tokstatusr3  s         r   on_setup_andx_requestz SMB_Server.on_setup_andx_requestY  s   /3|/?/V/VL#X0
 0
,f 	c"""%,,(:DO%/@@@)S00++--0K0M0MM$'!! ++--0A0AA22274<@DL99 @3FF-44 .44?//114O4Q4QQD' 7,6)+ 6,5) ,,..J%2)6    ' 8&7$'!!.#55++--0N*!.1 1 1  #)N":":##DK***L11c+&''d;'((    L11c+&''   ^##L--///!%D		$r   c                     | j         r5|                     d| j        rdpdz             |                                 |                                 )NzUser authenticated %s!z	 as guestrq   )r   r   r   AUTHENTICATEDr   r   s    r   wait_for_next_requestz SMB_Server.wait_for_next_request  s]     	$KK(D,<,L,RPRS   $$&&&//###r   c                     dS )zDev: overload thisNr   r   s    r   rY  zSMB_Server.AUTHENTICATED  s	     	r   )prioc                     i | _         i | _        i | _        d| _        |                                 | _        |                                 )Nr   )current_treescurrent_handlesenumerate_indextree_idcurrent_smb_timebase_time_tSERVINGr   s    r   should_servezSMB_Server.should_serve  sE      !!0022llnnr   r  c                     | j                                         t          d          z  }||_        d|_        |                     |           d S )N   	ErrorData
SMB2_IOCTL)r!  r   r>   r$  r#  r   )r   r$  r   s      r   _ioctl_errorzSMB_Server._ioctl_error  sG    o""$$':W'M'M'MM
"		#r   )finalc                 .    |                                   d S r   )endr   s    r   ENDzSMB_Server.END  s    




r   c                 0    | j         | j        j                 S )z.
        Return the current tree name
        )r^  r!  r   r   s    r   current_treezSMB_Server.current_tree  s     !$/"566r   c                     |                                  	 t          fd| j        D                       }n# t          $ r Y dS w xY wt	          j        |                                          S )z:
        Return the root path of the current tree
        c              3   `   K   | ](}|j                                         k    |j        V  )d S r   )rw   rv   r{   )r   r   curtrees     r   	<genexpr>z'SMB_Server.root_path.<locals>.<genexpr>  s9      XXQW=W=Waf=W=W=W=WXXr   N)rq  nextr   StopIterationrx   ry   rz   )r   
share_pathrt  s     @r   	root_pathzSMB_Server.root_path  s     ##%%	XXXXdkXXXXXJJ 	 	 	44	|J''//111s    8 
AAc                     dS )z/
        Main state when serving files
        Nr   r   s    r   rd  zSMB_Server.SERVING  s	    
 	r   c                 f    t           |v r'|                                                     |          d S r   )rP   r   r   r   s     r   receive_logoff_requestz!SMB_Server.receive_logoff_request  s3    &#--//##55c::: .-r   c                     |                      |           |                     | j                                        t	                      z             d S r   )r"  r   r!  r   rQ   r   s     r   send_logoff_responsezSMB_Server.send_logoff_response  sH    c"""		$/&&((+G+I+IIJJJJJr   c                 0    |                      |           d S r   )rE  r   s     r   %receive_setup_andx_request_in_servingz0SMB_Server.receive_setup_andx_request_in_serving  s    '',,,,,r   c                 h    t           |v r(t          j        d           |                                 d S )Nz)Tree request in SMB1: unimplemented. Quit)r   r   r   ro  r   s     r   is_smb1_treezSMB_Server.is_smb1_tree  s5    3&& KLLL((** '&r   c                     t           |v rS|t                    j                            d          d         }|                                                     ||          d S )N\)rW   ry   splitrd  r   )r   r   	tree_names      r   receive_tree_connectzSMB_Server.receive_tree_connect  sT    $++56;AA$GGKI,,..223	BBB ,+r   c           	         |                      |           t          fd| j        D                       sM| j                                        t                      z  }d|_        d|_        |                     |           d S | j	        vr!| xj
        dz  c_
        | j
        | j        _        | j	        | j        j        <   |                     dz             |                     | j        t          |                                 dk    rdnd|                                 dk    rd	n| j        |                                 dk    rd
n| j        | j                  z             d S )Nc              3   R   K   | ]!}|j                                         k    V  "d S r   )rw   rv   )r   r   r  s     r   ru  z8SMB_Server.send_tree_connect_response.<locals>.<genexpr>  s4      EEA17ioo///EEEEEEr   SMB2_TREE_CONNECTSTATUS_BAD_NETWORK_NAMEr   zTree Connect on: %sr   PIPEDISKzAUTO_CACHING+NO_CACHINGr   )	ShareType
ShareFlagsr  MaximalAccess)r"  anyr   r!  r   r>   r#  r$  r   r^  ra  r   r   rX   rq  r   r   r   )r   r   r  r3  s     ` r   send_tree_connect_responsez%SMB_Server.send_tree_connect_response  s{   c"""EEEEEEEEE 	?'')),?,A,AAD.DL3DKIIdOOOFD...LLALL"&,DO2;4?./)I5666		O($($5$5$7$76$A$A&&v$$&&&00 54*$$&&&00 Q+"6	 	 	
	
 	
 	
 	
 	
r   c                 f    t           |v r'|                                                     |          d S r   )rB   rd  r   r   s     r   receive_ioctlzSMB_Server.receive_ioctl!  1    $$,,..223777 %$r   c                    |                      |           |j        dk    r| j                            |j        j                   |                     | j                                        t          d|t                   j        d| j                                        fg          z             d S |j        dk    r| j        j        j        r| j        j        pddk     r|                     d           d S |                     | j                                        t          d|t                   j        dt%          | j        | j        j        | j        j        | j        	          fg          z             d S |j        d
k    rn|                     | j                                        t          d
|t                   j        t-          d | j        D                                 z             d S |j        dk    r| j        r|t                   j        j        s~|                     | j                                        t          d|t                   j        t5          d | j        D             d | j        D                                 z             d S | j                                        t7                      z  }d|_        d|_        |                     |           d S |                     d           d S )Ni Output)CtlCodeFileIdBufferi r   r  STATUS_FILE_CLOSED)r$  )r   r  r   r  i c                 L    g | ]!}t          t          d |                    "S )   )FamilyIPv4Adddress)SockAddr_Storage)r.   r^   r   s     r   r   z2SMB_Server.send_ioctl_response.<locals>.<listcomp>b  sQ     $ $ $ !" 31A+1122" 2" 2"  $ $ $r   )
interfaces)r  r  r  i c                 0    g | ]}t          d d          S )NameListReferraliX  )ReferralEntryFlags
TimeToLive)r   )r   _s     r   r   z2SMB_Server.send_ioctl_response.<locals>.<listcomp>{  s?     - - -
 %&	 !07I/2!" !" !"- - -r   c                 .    g | ]}t          |           S ))SpecialName)r   )r   r|   s     r   r   z2SMB_Server.send_ioctl_response.<locals>.<listcomp>  s3     , , ,$( !4 E E E, , ,r   )ReferralEntriesReferralBufferrj  STATUS_FS_DRIVER_REQUIREDr  )r"  r  r   recvInputloadr   r!  r   rD   rB   r  get_responser   r  
SessionKeyr   rk  rE   r   r   r   rA   r   r   RequestFileNamerC   r>   r#  r$  r   r   r3  s      r   send_ioctl_responsezSMB_Server.send_ioctl_response&  sb   c""";(""O  000II$$&&%$129%t'C'C'E'EFG       [J&&4<+B+M& $)V33!!)=!>>> II$$&&%&129 %G%)Y040D-1\-F-1-G	  
      $ [J&&II$$&&%&129<$ $ &*^$ $ $
 
 
      $ [J&& %./5E
 		O((**) *"#56=?- -
 *.)>- - -, ,,0,A, , ,         ( ?'')),?,A,AAD'DL5DKIIdOOOOO %;<<<<<r   c                 f    t           |v r'|                                                     |          d S r   )r9   rd  r   r   s     r   receive_create_filezSMB_Server.receive_create_file  1    #%%,,..223777 &%r   l       l       )
PersistentVolatilel       l       l       l       )srvsvcwkssvcNETLOGON    c                 r    t                                          d                              d d           dz
  S )NCreationTimel    @T$)r+   	get_fieldi2mr   s    r   rb  zSMB_Server.current_smb_time  s6    &((22>BBFFtTRR	
r   c                     t          j        |pd                                                                          }dt	          j        d|dd                   d         z  S )zB
        Generate deterministic FileId based on the fname
        rq   l        z<IN   r   )hashlibmd5encodedigeststructunpack)r   fnamehashs      r   make_file_idzSMB_Server.make_file_id  sS     {EKR//112299;;fmD$rr(;;A>>>r   Fc                    |                                  }t          |t          j                  r
|}|j        }n||pd                    dd          z  }|                                }||j        vr||k    rt          |	                                rt          |
                                sl|rc|ra|j        r-|                                 |                     d|z              n4|                                 |                     d|z              nt          |1t          |                     |          | j        j        z             }n|}| j        | j        | j        | j        ddd	}|                                }	|	j        x|d
<   |d<   |d                    g d          |d<   n|                                rd|d<   nd|d<   ||f| j        |<   d| j        |<   |S )z<
        Lookup the file and build it's SMB2_FILEID
        rq   r  /zCreated folder:zCreated file:N)r  r   r  LastAccessTimeLastWriteTime
ChangeTime	EndOfFileAllocationSizer  r  r   )FILE_ATTRIBUTE_HIDDENFILE_ATTRIBUTE_SYSTEMFILE_ATTRIBUTE_DIRECTORYFileAttributesr  FILE_ATTRIBUTE_ARCHIVE)ry  
isinstancerx   ry   r|   replacerz   parentsFileNotFoundErroris_reservedexistsFILE_DIRECTORY_FILEmkdirr   touchr?   r  r!  r   rc  statst_sizer   is_dirr_  r`  )
r   r  durable_handlecreatecreateOptionsrootr{   handleattrs	path_stats
             r   lookup_filezSMB_Server.lookup_file  s+    ~~eW\** 	;DIEE5;B//c:::D||~~ t|#### 	$##{{}} 	( 
(- 
( 4 9JJLLLKK 1E 9:::: JJLLLKK% 78888''! ,,U33do6II  FF
 $F ,".!-*
 
 IIKK	7@7HHkU#34=&)hh  ' 'E"## [[]] 	?&@E"##&>E"#(
V$ ()V$r   c                     || _         dS )zD
        Mark a handle as the current one being compounded.
        N)r   )r   r  s     r   set_compounded_handlez SMB_Server.set_compounded_handle  s     !'r   c                 8    |j         }|| j        k    r| j        S |S )zY
        Return the FileId attribute of pkt, accounting for compounded requests.
        )r  LAST_HANDLEr   )r   r   fids      r   get_file_idzSMB_Server.get_file_id  s'     j$"""((
r   c                      j         |         d         }                     dt          |          z                                                j         |         d         d<   |                                st
          t           fd|                    |          D              dd          gz   |                                 	                                k    r dd	          gng z   d
           |d         S )z(
        Lookup a folder handle
        r   zQuery directory: r   r  c           
          g | ]I}|                                  dd |j        ij                            |                   d         JS )FileNamer   r   )
is_symlinkr|   r_  r  )r   r   r2  r   s     r   r   z,SMB_Server.lookup_folder.<locals>.<listcomp>  sl        ||~~TTQVTt';D<L<LQ<O<O'PQR'STT  r   r  rp   )r  r  z..c                     | j         S r   r  )r   s    r   <lambda>z*SMB_Server.lookup_folder.<locals>.<lambda>#  s    !* r   )r0  N)
r_  r   r   rb  r  NotADirectoryErrorsortedglobrz   ry  )r   r  filteroffsetr2  r{   s   `   ` r   lookup_folderzSMB_Server.lookup_folder  sI    #F+A.'#d))3444<@<Q<Q<S<SV$Q'(89{{}} 	%$$    6**   $>   ( <<>>T^^%5%555 C(B!%    +. %$1
 
 
2 ''3 	r   c                 x   |                      |           |t                   j        r|t                   j        }nd}|r|                     d|z              |                                 dk    r| j                            |d          }|rWddddddd}||f| j        |<   | 	                    | j
                                        t          d|j        |d|z             nK| j
                                        t                      z  }d|_        d	|_        | 	                    |           dS d}|t                   j        r;	 t%          d
 |t                   j        D                       }n# t(          $ r Y nw xY w	 |                     ||          }n# t,          $ r |t                   j        dv r| j        rN| j
                                        t                      z  }d|_        d|_        | 	                    |           Y dS |                     ||d|t                   j                  }nN| j
                                        t                      z  }d|_        d	|_        | 	                    |           Y dS Y nw xY w|                     |           | j        |         d         }| j
                                        t          d|j        |d|z  }|t                   j        r3g }|t                   j        D ]}	|	j        dk    rG|                    t9          dt;          |                     |          d                               U|	j        dk    r9|                    t9          dt?          d| j                                        |	j        dk    r>d|d         v r|                    t9          dtC          d                               |	j        dk    r)|                    t9          d|	j"                             ||_        | 	                    |           dS )zM
        Handle CreateFile request

        See [MS-SMB2] 3.3.5.9 ()
        NzOpened: r   r   i   r  )OplockLevelr  SMB2_CREATESTATUS_OBJECT_NAME_NOT_FOUNDc              3   D   K   | ]}|j         d k    |j        j        V  dS )s   DH2CN)NameDatar  r   s     r   ru  z7SMB_Server.send_create_file_response.<locals>.<genexpr>X  s?       * *6W,, ,,,,* *r   )r  )r     STATUS_ACCESS_DENIEDT)r  r  r  r   s   QFidl   Mst )
DiskFileIdVolumeId)r  r  s   MxAc)QueryStatusr  s   DH2Qr  r  i  )Timeouts   RqLsr   )#r"  r9   NameLenr  r   rq  PIPES_TABLEr   r_  r   r!  r   r:   RequestedOplockLevelr>   r#  r$  CreateContextsLenrv  CreateContextsrw  r  r  CreateDispositionr   CreateOptionsr  r   r5   r8   r  r7   r   r6   r  )
r   r   r  FILE_IDr  r3  r  r  r  elts
             r   send_create_file_responsez$SMB_Server.send_create_file_response&  s*    	c""""#+ 	+,1EEE 	,KK
U*+++&((&**5$77G  $%&'%&"#!"&*  1$W- 		O((*** $'$<&        ++--0C0E0EE,<		$F "N&'9 %) * *!$%8!9!H* * * & &NN
 %   D))%)OO$   *+= B   } #33558K8M8MM'4&<		$ "&!1!1!+9#'*-.A*B*P	 "2 " "  ?//114G4I4IID#0DL"@DKIIdOOOFF 6 &&v...(03E?'')),@ -4- - - - D &'9 15!# 23B + +Cx7**&--/%,%A/3/@/@/G/G-7&" &" &"      W,,&--/%,%N01262J&" &" &"      W,,5?O9PPP$&--/%,%K,2&" &" &"      W,, '--/%,%(X     '5#		$s,   )E/ /
E<;E< F A0JA5JJc                 f    t           |v r'|                                                     |          d S r   )r1   rd  r   r   s     r   receive_change_notify_infoz%SMB_Server.receive_change_notify_info  s1    %,,,,..223777 -,r   c                     |                      |           | j                                        t                      z  }d|_        d|_        |                     |           d S )NSMB2_CHANGE_NOTIFYr  )r"  r!  r   r>   r#  r$  r   r  s      r    send_change_notify_info_responsez+SMB_Server.send_change_notify_info_response  sX    
 	c"""##%%(;(=(==+,		$r   c                 f    t           |v r'|                                                     |          d S r   )rJ   rd  r   r   s     r   receive_query_directory_infoz'SMB_Server.receive_query_directory_info  1    '3..,,..223777 /.r   c           	      ~   |                      |           |j        sd S |j        }|                     |          }|j        dvrM| j                                        t                      z  }d|_        d|_	        | 
                    |           d S |t                   j        j        r
d| j        |<   	 |                     ||| j        |         t           t"          t$          d|j                           }n\# t&          $ rO | j                                        t                      z  }d|_        d|_	        | 
                    |           Y d S w xY w|sWd| j        |<   | j                                        t                      z  }d|_        d|_	        | 
                    |           d S |t                   j        j        r
|d d         }| j        |xx         t+          |          z  cc<   t-          |          }| 
                    | j                                        t/          d	|fg
          z             d S )N)r  r   %   SMB2_QUERY_DIRECTORYSTATUS_INVALID_INFO_CLASSr   STATUS_INVALID_PARAMETERSTATUS_NO_MORE_FILESr   )filesr  r  )r"  FileNameLenr  r  FileInformationClassr!  r   r>   r#  r$  r   rJ   r   SMB2_RESTART_SCANSr`  r   r   r   r    r  SMB2_RETURN_SINGLE_ENTRYlenr)   rK   )r   r   queryr  r3  r&  fileinfos          r   send_query_directory_responsez(SMB_Server.send_query_directory_response  sc   c""" 	Fs##
 #+===?'')),?,A,AAD1DL5DKIIdOOOF+,2E 	*()D %	&&$S)336  *	,		 	EE " 	 	 	?'')),?,A,AAD1DL4DKIIdOOOFF	  	()D %?'')),?,A,AAD1DL0DKIIdOOOF+,2K 	"1"IES!!!SZZ/!!!1
 
 
 			O  ""+Xx4H3IJJJK	
 	
 	
 	
 	
s   3AC5 5AEEc                 f    t           |v r'|                                                     |          d S r   )rL   rd  r   r   s     r   receive_query_infozSMB_Server.receive_query_info  s1    "c)),,..223777 *)r   c           
      L   |                      |           |                     |          }|j        dk    r|j        dk    r2| j        |         d         }t          |d         |d                   }np|j        dk    r5| j        |         d         }t          t          |          dz  	          }n0|j        d
k    rt                      }n|j        dk    rq| j        |         d         }t          t          |d         |d         |d         |d         |d                   t          |d         |d                             }n|j        dk    r*| j        |         d         }t          |j                  }nd|j        dk    r2| j        |         d         }t          |d         |d                   }n'|j        dk    r!| j        |         d         }t          d&i |}n|j        dk    r*| j        |         d         }t          |j                  }nt!          j        d|t$                                       d          z             d S |j        dk    r|j        dk    rt)                      }ni|j        dk    rt+                      }nN|j        dk    rt-          d          }n1|j        d
k    rt                      }nt!          j        d|t$                                       d          z             d S |j        dk    rt/                      }|j        j        r	 |j        j        r	 |j        j        r	 |j        j        r	 |j        j        s$|j        j        s|j        j        s|j        j        rO| j                                        t?          d           z  }d!|_         d"|_!        | "                    |           d S |j        j#        rd#|_$        | "                    | j                                        tK          d$|fg%          z             d S )'Nr   r  r  r  )r  r     r   r  )IndexNumber      r  r  r  r  r  )r  r  r  r  r  )BasicInformationStandardInformation   r     )
StreamSizeStreamAllocationSize"   0   zUnimplemented: %sz%InfoType% %FileInfoClass%r  r   i  )FileSystemAttributesrg  rh  r	  SMB2_QUERY_INFOi   r  r'  r   )&r"  r  InfoTypeFileInfoClassr_  r,   r*   r  r%   r"   r$   r#   r|   r-   r+   r!   r   r   rL   sprintfr(   r'   r&   r/   AdditionalInformationOWNER_SECURITY_INFORMATIONGROUP_SECURITY_INFORMATIONDACL_SECURITY_INFORMATIONSACL_SECURITY_INFORMATIONr!  r   r>   r$  r#  r   ATTRIBUTE_SECURITY_INFORMATIONControlrM   )r   r   r  r  r.  pths         r   send_query_info_responsez#SMB_Server.send_query_info_response  s   c"""s##<4 D((,S1!42#K0#()9#:   "d***3/22 $S		,> >   "d**,.."d**,S1!4-%9%*>%:',-='>&+O&<#(#6',-='>& & & )@"'"4',-='>) ) )   "d***3/27 X   "d**,S1!40$[1)./?)@   "d**,S1!45    "d***3/20 X   #'12::;WXXY   \T!! D((244"d**022"d**5)1   "d**,..#'12::;WXXY   \T!!*,,H(C (C (B (B  )D
,F
 ,G
 ,F	
 o**,,/BW/U/U/UU3
/		#(G *#) 		O  ""&(/C.DEEEF	
 	
 	
 	
 	
r   c                 f    t           |v r'|                                                     |          d S r   )rT   rd  r   r   s     r   receive_set_info_requestz#SMB_Server.receive_set_info_request  s1     C'',,..223777 ('r   c                     |                      |           |                     | j                                        t	                      z             d S r   )r"  r   r!  r   rU   r   s     r   send_set_info_responsez!SMB_Server.send_set_info_response  sH    c"""		$/&&((+A+C+CCDDDDDr   c                 f    t           |v r'|                                                     |          d S r   )r[   rd  r   r   s     r   receive_write_requestz SMB_Server.receive_write_request  r  r   c                 V   |                      |           t          t          |j                            }|                     |          }|                                 dk    r;|| j                                        v r| j        	                    |j                   n| j
        rt                      }d|_        d|_        n| j        |         \  }}|t                   j        }|t                   j        }|                     d|d|           t'          |d          5 }|                    |           |                    |t                   j                  |_        d d d            n# 1 swxY w Y   |                     | j                                        |z             d S )N)Countr   
SMB2_WRITEERROR_FILE_READ_ONLYzWriting 
 bytes at zr+b)r"  r\   r,  r  r  rq  r  valuesr   r  r   r>   r#  r$  r_  r[   DataLenOffsetr   openseekwriterT  r   r!  r   )	r   r   r3  r  rK  r  lengthofffds	            r   send_write_responsezSMB_Server.send_write_response  s   c""""SX777s##&((d&--////$$SX...} H*,,+4 -c2Q/08,-4DEEE#u%% HGGCLLL!##.@*A*F!G!GDJH H H H H H H H H H H H H H H 			$/&&((4/00000s   #A E//E36E3c                 f    t           |v r'|                                                     |          d S r   )rN   rd  r   r   s     r   receive_read_requestzSMB_Server.receive_read_request  1    ##,,..223777 $#r   c                    |                      |           t                      }|                     |          }|                                 dk    r.| j                                        }t          |          |_        n| j        |         \  }}|t                   j
        }|t                   j        }|                     d|d|           t          |d          5 }	|	                    |           |	                    |          |_        d d d            n# 1 swxY w Y   |                     | j                                        |z             d S )Nr   zReading rW  rb)r"  rO   r  rq  r   r  r,  r  r_  rN   LengthrZ  r   r[  r\  readr   r!  r   )
r   r   r3  r  rrK  r  r^  r_  r`  s
             r   send_read_responsezSMB_Server.send_read_response  sh   c"""!##s##&((,,..AaDII )#.FC*+2F'(/CKKKFFFCC@AAAc4 ,BGGFOO	, , , , , , , , , , , , , , , 			$/&&((4/00000s   0DD!Dc                 f    t           |v r'|                                                     |          d S r   )r3   rd  r   r   s     r   receive_close_requestz SMB_Server.receive_close_request  r  r   c           	      (   |                      |           |                                 dk    r|                     |          }| j        |         \  }}|r%|                     dt          |          z              | j        |= | j        |= |                     | j        	                                t          dd|t                   j        i|z             d S |                     | j        	                                t                      z             d S )Nr   zClosed: r   r   )r"  rq  r  r_  r   r   r`  r   r!  r   r4   r3   r   )r   r   r  rK  r  s        r   send_close_responsezSMB_Server.send_close_response  s!   c"""&((""3''C-c2JC 3JS1222$S)$S)II$$&&%  017      IIdo**,,/B/D/DDEEEEEr   c                 f    t           |v r'|                                                     |          d S r   )rY   rd  r   r   s     r   receive_tree_disconnect_requestz*SMB_Server.receive_tree_disconnect_request  r  r   c                 ^   |                      |           	 | j        | j        j        = | j                                        t                      z  }nF# t          $ r9 | j                                        t                      z  }d|_        d|_	        Y nw xY w| 
                    |           d S )NSMB2_TREE_DISCONNECTSTATUS_NETWORK_NAME_DELETED)r"  r^  r!  r   r   rZ   KeyErrorr>   r#  r$  r   r  s      r   send_tree_disconnect_responsez(SMB_Server.send_tree_disconnect_response  s    c"""	8"4?#67?'')),I,K,KKDD 	8 	8 	8?'')),?,A,AAD1DL7DKKK	8 			$s   :A A BBc                 f    t           |v r'|                                                     |          d S r   )r0   rd  r   r   s     r   receive_cancel_requestz!SMB_Server.receive_cancel_request  r  r   c                     |                      |           | j                                        t                      z  }d|_        |                     |           d S )NSTATUS_CANCELLED)r"  r!  r   r2   r$  r   r  s      r   send_notify_cancel_responsez&SMB_Server.send_notify_cancel_response  sO    c"""##%%(C(E(EE(		$r   c                 f    t           |v r'|                                                     |          d S r   )r;   rd  r   r   s     r   receive_echo_requestzSMB_Server.receive_echo_request  rd  r   c                     |                      |           |                     | j                                        t	                      z             d S r   )r"  r   r!  r   r<   r   s     r   send_echo_replyzSMB_Server.send_echo_reply  sH    c"""		$/&&((+=+?+??@@@@@r   )rq   )r  )NFN)Nr   r   r   r   r   pkt_clsr]   	socketclsr   propertyr   r   r   r   stater   receive_conditionr   r   actionr   r   r   r"  r>  r@  rE  rC  rW  	conditionrZ  rY  re  rk  ro  rq  ry  rd  r|  r~  r  r  r  r  r  r  r  r?   r  r  rb  r  r  r  r  r   r  r  r  r  r/  r1  rL  rN  rP  rR  ra  rc  rj  rl  rn  rp  ru  rw  rz  r|  r~  __classcell__r   s   @r   r   r      s$	        & GI d j
 j
 j
 j
X ! ! X!" " " "O O O O O TZ# # # TE""; ; #"; TE""; ; #";
 T[.//  0/ T[#$$n n %$n` TZ\\  \& & &8 TJ''; ; ('; T[())  *) TJ''V V ('V$ TZ\\  \ T[+,,L L -,L\ T^/00$ $ 10$ TZ\\  \ T^M***  +*    TZa  
7 7 7	2 	2 	2 TZ\\  \ TG$$; ; %$; T['((K K )(K TG$$- - %$- TG$$  %$ TG$$C C %$C
 T[%&&
 
 '&
< TG$$8 8 %$8 T[i= i=  i=V TG$$8 8 %$8
 +MMM+MMMK<,OOO K +%0B  K
 
 
? ? ?A A A AF' ' '  " " "H T[$%%Q Q &%Qf TG$$8 8 %$8 T[+,,	 	 -,	 TG$$8 8 %$8 T[-..;
 ;
 /.;
z TG$$8 8 %$8 T[#$$k
 k
 %$k
Z TG$$8 8 %$8 T[)**E E +*E TG$$8 8 %$8 T[&''1 1 ('12 TG$$8 8 %$8 T[%&&1 1 '&1& TG$$8 8 %$8 T[&''F F ('F& TG$$8 8 %$8 T[011	 	 21	 TG$$8 8 %$8 T['((  )( TG$$8 8 %$8 T[%&&A A '&A A A A Ar   r   c                        e Zd ZdZ fdZ ej        e          d             Z ej        e	          d             Z
 ej        e          d             Z ej        e          d             Z xZS )r   zG
    DCE/RPC server than handles the minimum RPCs for SMB to work:
    c                 |    |                     d          | _         t          t          |           j        |i | d S )Nr   )r   r   r   r   r   )r   r   r   r   s      r   r   zSMB_DCERPC_Server.__init__  s?    jj**/&&/@@@@@@r   c                     t          | j                  }t          t          dt	          dt          d | j        D             |                              || j                  S )zq
        NetrShareEnum [MS-SRVS]
        "retrieves information about each shared resource on a server."
        r   c                 P    g | ]#}t          |j        |j        |j                   $S )shi1_netname	shi1_typeshi1_remark)rc   r|   r}   r~   r   s     r   r   z5SMB_DCERPC_Server.netr_share_enum.<locals>.<listcomp>  sH           !" +-.V*+&,-H       r   )r  EntriesReadtagvalue)Level	ShareInfo)
InfoStructTotalEntriesndr64)r,  r   rg   rb   r   rj   r  )r   req	nbEntriess      r   netr_share_enumz!SMB_DCERPC_Server.netr_share_enum  s     $$	%*"0    &*[      %.      $ #*)
 
 
 	
r   c           	      j    t          t          dt          dd                    | j                  S )zt
        NetrWkstaGetInfo [MS-SRVS]
        "returns information about the configuration of a workstation."
        d     r  )wki100_platform_idwki100_ver_majorr  )	WkstaInfor  )rm   r   rk   r  r   r  s     r   netr_wksta_getinfoz$SMB_DCERPC_Server.netr_wksta_getinfo.  sO     )&'*%&     *	
 	
 	
 		
r   c                     t          t          dt          d|j        j        j        d         j        ddd                    | j                  S )	z
        NetrServerGetInfo [MS-WKST]
        "retrieves current configuration information for CIFS and
        SMB Version 1.0 servers."
        e   r  r   r3  r   )sv101_platform_id
sv101_namesv101_version_majorsv101_version_minor
sv101_typer  )
ServerInfor  )re   r   ra   
ServerNamer  r  r  s     r   netr_server_getinfoz%SMB_DCERPC_Server.netr_server_getinfo?  sh     *'&)"~39!<B()()   	 	 	 *
 
 
 	
r   c           
          t          t          dt          |j        j        d         j        dd                    | j                  S )z|
        NetrShareGetInfo [MS-SRVS]
        "retrieves information about a particular shared resource on a server."
        r   r   r   r  r  )r  r  )ri   r   rc   NetNamer  r  r  s     r   netr_share_getinfoz$SMB_DCERPC_Server.netr_share_getinfoT  s_     )$!$!21!5!; #     *

 

 

 
	
r   )r   r   r   r   r   r   answerrf   r  rl   r  rd   r  rh   r  r  r  s   @r   r   r     s         A A A A A ]/00
 
 10
: ]233
 
 43
  ]344
 
 54
( ]233
 
 43
 
 
 
 
r   r   c            	       >    e Zd ZdZ	 	 	 	 	 	 ddededed	efd
Zd ZdS )	smbserveras  
    Spawns a simple smbserver

    smbserver parameters:

        :param shares: the list of shares to announce. Note that IPC$ is appended.
                       By default, a 'Scapy' share on './'
        :param port:  (optional) the port to bind on, default 445
        :param iface:  (optional) the interface to bind on, default conf.iface
        :param readonly: (optional) whether the server is read-only or not. default True
        :param ssp: (optional) the SSP to use. See the examples below.
                    Default NTLM with guest

    Many more SMB-specific parameters are available in help(SMB_Server)
    N  r  Tr   portr   r   c                 T   |t          ddd          g}|dk    rt          j        dt          j        z             t          j        dt          j                            |pd          d	|rt          j                            d
          nt          j                            dd          dt          j                            t          |                    d           |D ]}t          j        d|z             t          j        d||pt          j        ||||d|| _        d S )NScapyrp   z Scapy's SMB server default share)r|   r{   r~   r  z-- Scapy %s SMB Server --zSSP: zNTLM (guest)z. Read-Only: YESNOzbg_red+whitez
. Serving z shares:z * %s)r  r   r   r   r   r   r   )ro   r   r   r   versioncolor_themeyellowformatredr,  r   spawnloopback_namesrv)	r   r   r   r  r   r   r   r   shares	            r   r   zsmbserver.__init__{  s`    > s3U  F 19984<GHHH $++C,A>BBBB $K(//666!-44T>JJK K $((V5555	     2 2 51111# 
-4-
 
 
 
r   c                     | j         rQ	 | j                             t          j                   n# t          $ r Y nw xY w| j                                          dS dS )zM
        Close the smbserver if started in background mode (bg=True)
        N)r  shutdownsocket	SHUT_RDWROSErrorcloser   s    r   r  zsmbserver.close  sq     8 	!!&"23333   HNN	 	s   $. 
;;)NNr  r  TN)	r   r   r   r   r   r:  r   r   r  r   r   r   r  r  j  s         $ /
 /
 /
 	/

 /
 /
 /
 /
 /
b	 	 	 	 	r   r  __main__)AutoArgparse)r   r  rx   r  r  r%  
scapy.archr   scapy.automatonr   r   scapy.configr   scapy.errorr   r   scapy.volatiler	   scapy.layers.dcerpcr
   r   scapy.layers.gssapir   r   r   scapy.layers.msrpce.rpcserverr   scapy.layers.ntlmr   scapy.layers.smbr   r   r   r   r   r   r   r   r   r   scapy.layers.smb2r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   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   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   scapy.layers.spnegor`   scapy.layers.msrpce.raw.ms_srvsra   rb   rc   rd   re   rf   rg   rh   ri   rj   scapy.layers.msrpce.raw.ms_wkstrk   rl   rm   ro   r   r   r  r   scapy.utilsr  r   r   r   <module>r     s         " " " " " " + + + + + + + +       4 4 4 4 4 4 4 4 # # # # # #                
 8 7 7 7 7 7                            F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FN * ) ) ) ) )                                $
 $
 $
 $
 $
 $
 $
 $
TAA AA AA AA AA AA AA AAN*]
 ]
 ]
 ]
 ]
 ]
 ]
 ]
FK K K K K K K K\ z((((((L r   