a
    kÄ#dO  ã                   @   sÚ   d Z ddlZddlmZmZ ddl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 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&m'Z'm(Z( G d
d„ deeƒZ)dS )z
SMB 1 / 2 Server Automaton
é    N)ÚATMTÚ	Automaton)ÚNTLM_CHALLENGEÚNTLM_Server)ÚRandUUID)Ú
NBTSession)ÚGSSAPI_BLOBÚSPNEGO_MechListMICÚSPNEGO_MechTypeÚSPNEGO_TokenÚSPNEGO_negTokenÚSPNEGO_negTokenInitÚSPNEGO_negTokenResp)
Ú
SMB_HeaderÚSMBNegotiate_RequestÚSMBNegotiate_Response_SecurityÚ'SMBNegotiate_Response_Extended_SecurityÚSMBSession_NullÚSMBSession_Setup_AndX_RequestÚ/SMBSession_Setup_AndX_Request_Extended_SecurityÚSMBSession_Setup_AndX_ResponseÚ0SMBSession_Setup_AndX_Response_Extended_SecurityÚSMBTree_Connect_AndX)	ÚSMB2_HeaderÚSMB2_IOCTL_ResponseÚ+SMB2_IOCTL_Validate_Negotiate_Info_ResponseÚSMB2_Negotiate_Protocol_RequestÚ SMB2_Negotiate_Protocol_ResponseÚSMB2_Session_Setup_RequestÚSMB2_Session_Setup_ResponseÚSMB2_IOCTL_RequestÚSMB2_Error_Responsec                       sz  e Zd ZdZeZ‡ fdd„Z‡ fdd„Zej	dd�dd	„ ƒZ
e e
¡d
d„ ƒZe e
¡dd„ ƒZe e¡dd„ ƒZe e¡dd„ ƒZe 	¡ dd„ ƒZdd„ Ze e¡dd„ ƒZe e¡dd„ ƒZe e¡dd„ ƒZe 	¡ dd„ ƒZe e¡dd„ ƒZe e¡d d!„ ƒZe 	¡ d"d#„ ƒZejedd$�d%d&„ ƒZejed'd$�d(d)„ ƒZd2d+d,„Ze e¡d-d.„ ƒZej	dd/�d0d1„ ƒZ‡  Z S )3ÚNTLM_SMB_Serveri½  c                    s¾   |  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  dd¡| _|  d	d¡| _|  d
d¡| _|  dd ¡| _	| js’| j	s’J dƒ‚d| _
d | _d| _tt| ƒj|i |¤Ž d S )NÚCLIENT_PROVIDES_NEGOEXFÚECHOÚANONYMOUS_LOGINÚGUEST_LOGINÚPASS_NEGOEXÚEXTENDED_SECURITYTÚ
ALLOW_SMB2ÚREQUIRE_SIGNATUREÚREAL_HOSTNAMEzSMB1 requires REAL_HOSTNAME !)Úpopr#   r$   r%   r&   r'   r(   r)   r*   r+   ÚSMB2ÚDialectÚGUIDÚsuperr"   Ú__init__)ÚselfÚargsÚkwargs©Ú	__class__© úM/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/smbserver.pyr1   :   s     ÿzNTLM_SMB_Server.__init__c                    sN   | j r>| jr>t|jtƒr>|t }| jd7  _| | j | j¡ tt| ƒ 	|¡S )NZSMB2_FLAGS_SIGNED)
r.   ÚSigningSessionKeyÚ
isinstanceÚpayloadr   ÚFlagsÚsignr0   r"   Úsend)r2   ÚpktÚsmbr5   r7   r8   r>   M   s    zNTLM_SMB_Server.sendé   )Úinitialc                 C   s   d| _ | jr| jsJ dƒ‚d S )NFz-Cannot use ECHO without binding to a client !)Úauthenticatedr$   Úcli_atmt©r2   r7   r7   r8   ÚBEGINV   s    ÿÿþzNTLM_SMB_Server.BEGINc                 C   s(   t |v r$| jr|  ¡  |  ¡  |¡‚d S ©N)r   rD   Ústart_clientÚ
NEGOTIATEDÚaction_parameters©r2   r?   r7   r7   r8   Úreceived_negotiate]   s    z"NTLM_SMB_Server.received_negotiatec                 C   s:   t |v r6d| _| jr(| jdd|jid� |  ¡  |¡‚d S )NTÚ
ClientGUID)ZCONTINUE_SMB2ZSMB2_INIT_PARAMS)r   r-   rD   rH   rM   rI   rJ   rK   r7   r7   r8   Úreceived_negotiate_smb2_begind   s    
ÿz-NTLM_SMB_Server.received_negotiate_smb2_beginc                 C   s   |   |¡ d S rG   ©Úon_negotiaterK   r7   r7   r8   Úon_negotiate_smb2_beginn   s    z'NTLM_SMB_Server.on_negotiate_smb2_beginc              
   C   s  | j r| jdd�\}}}}nd }| js8|  dd¡s8d| _d }d }t|v rt|t j}| ¡  |d }|dkrätdƒ‚npdd	„ |t	 jD ƒ}| j
rÚd
D ]:\}}	z| |¡}|	}d| _W  qäW q’ tyÊ   Y q’0 q’| d¡}n
| d¡}|rú|d@ dkrú|| _d }
| j�rRt}
tƒ tddd� | _t|v �rˆ|j| j_|j| j_|j| j_|j| j_n6tƒ tdd|j|j|j|jd� | _| j�r„t}
nt}
| j�rÜ| j ¡ |
|| j�r¨dn|  dt| jƒ¡|  dt ¡ d ¡ddddd� }nX| j ¡ |
|d| j�rödn|  dt| jƒ¡|  d¡|  d¡d� }| j�r4| jd7  _| j�sD| j�r´t t!t"t#dd�gd�d�d �|_$|  dt%ƒ  &¡ ¡ | _'|_'| j(�ræ|j$j)j*j+ ,dt#d!d�¡ t-|d"�|j$j)j*_.n2|  d#¡|_/|  d$¡|_0|  d%¡|_1| j2d8  _2| j�s|t j2d& d' |t _2|  3|¡ d S )(NT)Znegoexr/   r   Fi   z0SMB client requires SMB3 which is unimplemented.c                 S   s   g | ]
}|j ‘qS r7   )ZDialectString)Ú.0Úxr7   r7   r8   Ú
<listcomp>…   s   z0NTLM_SMB_Server.on_negotiate.<locals>.<listcomp>))s	   SMB 2.???iÿ  )s	   SMB 2.002i  s
   NT LM 0.12éÿ   rA   )ZCreditsRequestedZCreditChargez*REPLY+CASE_INSENSITIVE+CANONICALIZED_PATHSzILONG_NAMES+EAS+NT_STATUS+SMB_SECURITY_SIGNATURE+UNICODE+EXTENDED_SECURITY)r<   ÚFlags2ÚTIDÚMIDÚUIDÚPIDLowé   ÚSecurityModeÚ
ServerTimel    !l
 i   )ÚDialectRevisionr\   r]   ZServerStartTimeZMaxTransactionSizeZMaxReadSizeZMaxWriteSizezŒUNICODE+LARGE_FILES+NT_SMBS+RPC_REMOTE_APIS+STATUS32+LEVEL_II_OPLOCKS+LOCK_AND_READ+NT_FIND+LWIO+INFOLEVEL_PASSTHRU+LARGE_READX+LARGE_WRITEXÚServerTimeZone)ÚDialectIndexÚServerCapabilitiesr\   r]   r_   r(   ú1.3.6.1.4.1.311.2.2.10©Úoid)Ú	mechTypes©Útoken)ÚinnerContextTokenz1.3.6.1.4.1.311.2.2.30©ÚvalueÚ	ChallengeÚ
DomainNameÚ
ServerNameZSMB_SECURITY_SIGNATUREz,SMB_SECURITY_SIGNATURE_REQUIRED+IS_LONG_NAME)4r#   Ú	get_tokenr-   Úgetr(   r   ZDialectsÚsortÚ
ValueErrorr   r)   Úindexr.   r   r   r   Ú
smb_headerrX   rW   ÚAsyncIdÚ	SessionIdr   rY   rZ   r   r   Úcopyr*   ÚboolÚ
IDENTITIESÚtimera   r   r   r   r
   ÚSecurityBlobr   Ú_fixr/   r'   rh   rg   re   Úinsertr   Z	mechTokenrk   rl   rm   rV   r>   )r2   r?   Znegoex_tokenÚ_r`   r^   ZDialectRevisionsZDialectIndexesÚkeyÚrevÚclsÚrespr7   r7   r8   rP   r   sÒ    

ÿ


þ




÷

ÿ÷

ÿóýÿÿÿýÿÿþÿzNTLM_SMB_Server.on_negotiatec                 C   s   d S rG   r7   rE   r7   r7   r8   rI     s    zNTLM_SMB_Server.NEGOTIATEDc                 C   s"   |j | j_ |j| j_|j| j_d S rG   )rW   rs   rX   ZPIDrK   r7   r7   r8   Úupdate_smbheader  s    

z NTLM_SMB_Server.update_smbheaderc                 C   s   t |v r|  ¡  |¡‚d S rG   )r   rI   rJ   rK   r7   r7   r8   Úreceived_negotiate_smb2  s    z'NTLM_SMB_Server.received_negotiate_smb2c                 C   s   |   |¡ d S rG   rO   rK   r7   r7   r8   Úon_negotiate_smb2  s    z!NTLM_SMB_Server.on_negotiate_smb2c                 C   sT  t |v st|v rÎt |v r&|  |j¡}nH|  d|j¡ |  d|j¡ |  d|j¡ |  d|j¡ |  |t j	¡}|  d|j
¡ |  d|j¡ |  d|j¡ |  d|j¡ |  d	|j¡ |  |¡ |  ¡  |¡‚n‚t|v �rP|  |j¡}|  d|j¡ |  d|j¡ |  d	|j¡ |  d
|j¡ |  d|j¡ |  d|j¡ |  |¡ |  ¡  |¡‚d S )NÚAccountNameÚPrimaryDomainÚPathÚServiceÚVCNumberÚSecuritySignaturerY   rX   rW   rt   ru   r\   )r   r   Z
_get_tokenrz   Zset_clir…   r†   r‡   rˆ   ZUnicodePasswordr‰   rŠ   rY   rX   rW   Zreceived_ntlm_tokenÚRECEIVED_SETUP_ANDX_REQUESTrJ   r   rt   ru   r\   )r2   r?   Ú
ntlm_tupler7   r7   r8   Úreceive_setup_andx_request  s<    ÿþÿ


z*NTLM_SMB_Server.receive_setup_andx_requestc                 C   s   d S rG   r7   rE   r7   r7   r8   r‹   :  s    z+NTLM_SMB_Server.RECEIVED_SETUP_ANDX_REQUESTc                 C   s^  |   ¡  \}}}}}t|v s.t|v s.t|v �rPt|v r’|  d| jjd ¡| j_|  d| jj¡| j_| jjj	r€|  d| jj
¡| j_
|  dd¡| j_n*|  d¡| j_|  d¡| j_|  d¡| j_|dk�rt|v rà| j ¡ tƒ  }n| j ¡ tƒ  }|  d	d
¡|_�nNt|v �st|v �r
t|v �rN| j ¡ tƒ  }| j�r>d|_| j�r~d|_n0| j ¡ t|  d¡|  d¡d� }| j�r~d|_|�sÆtt|d�d�|_|�r´| j�s´t|d�|jj_|dk�rd| _nBt|tƒ�r|�stt|�pädt dd�t!|d�d�d�|_n||_n,t|v �r6| j ¡ t"|  d¡|  d¡d� }|  d	| j�rHdnd¡|_|  #|¡ d S )NrX   rA   rW   rt   ru   l         rY   )NNNNÚStatusl   m    ZIS_GUESTZIS_NULLÚNativeOSÚNativeLanMan)r�   r�   ZSMB_SETUP_GUEST)Ú	negResultrf   ri   r   Trb   rc   )r‘   ZsupportedMechZresponseTokenl       )$rn   r   r   r   ro   rs   rX   rW   r<   ZSMB2_FLAGS_ASYNC_COMMANDrt   ru   rY   rv   r   r   rŽ   r&   ZSessionFlagsr%   r   ÚActionr   r   rz   ZDROP_MICr	   rg   ZmechListMICrC   r:   r   r
   r   r   r>   )r2   r?   Z
ntlm_tokenr‘   ZMICZrawTokenrŒ   r�   r7   r7   r8   Úon_setup_andx_request>  s”    ÿþý
ÿ
ÿþ
þÿÿÿÿÿ
þúÿ


þÿz%NTLM_SMB_Server.on_setup_andx_requestc                 C   s   | j r|  ¡ ‚n|  ¡ ‚d S rG   )rC   ÚAUTHENTICATEDrI   rE   r7   r7   r8   Úwait_for_next_requestŸ  s    
z%NTLM_SMB_Server.wait_for_next_requestc                 C   s   dS )zDev: overload thisNr7   rE   r7   r7   r8   r”   ¦  s    zNTLM_SMB_Server.AUTHENTICATED)Úprioc                 C   s   | j s|  ¡ ‚d S rG   )r$   ÚENDrE   r7   r7   r8   Ú
should_end«  s    zNTLM_SMB_Server.should_endé   c                 C   s   | j r|  ¡  |¡‚d S rG   )r$   r”   rJ   rK   r7   r7   r8   Úreceive_packet_echo±  s    z#NTLM_SMB_Server.receive_packet_echoÚSTATUS_NOT_SUPPORTEDc                 C   s.   | j  ¡ tdd� }||_d|_|  |¡ d S )Nó   ÿ)Z	ErrorDataZ
SMB2_IOCTL)rs   rv   r!   rŽ   ÚCommandr>   )r2   rŽ   r?   r7   r7   r8   Ú_ioctl_error¶  s    zNTLM_SMB_Server._ioctl_errorc                 C   sâ   |  ¡  | jsPt|v rÔ| jrÔd |_d |_d| j |jdd …  dd¡d  |_n„| j j	d7  _	t
|v rÔ|jdkrÔ| jrÄ| j ¡ td|t
 jdt| j| j| jr¢dn|  dt| jƒ¡d	�fgd
� }n| jdd� d S |  |¡ d S )Nz\\%s\r™   ú\rA   i ÚOutputr[   r\   )r/   r^   r\   )ÚCtlCodeÚFileIdZBufferZSTATUS_FILE_CLOSED)rŽ   )Úshowr-   r   r+   ZLENGTHZ	ByteCountr‡   Úsplitrs   rX   r    r¡   r9   rv   r   r¢   r   r/   r.   r*   ro   rw   rx   rž   ZechorK   r7   r7   r8   Úpass_packet¼  s:    "ÿ
ÿ
ÿûþÿý
zNTLM_SMB_Server.pass_packet)Úfinalc                 C   s   |   ¡  d S rG   )ÚendrE   r7   r7   r8   r—   õ  s    zNTLM_SMB_Server.END)r›   )!Ú__name__Ú
__module__Ú__qualname__Úportr   r€   r1   r>   r   ÚstaterF   Zreceive_conditionrL   rN   ÚactionrQ   rP   rI   r‚   rƒ   r„   r�   r‹   r“   Ú	conditionr•   r”   r˜   rš   rž   r¥   r—   Ú__classcell__r7   r7   r5   r8   r"   6   sR   	



	

 



%

`





8
r"   )*Ú__doc__ry   Zscapy.automatonr   r   Zscapy.layers.ntlmr   r   Zscapy.volatiler   Zscapy.layers.netbiosr   Zscapy.layers.gssapir   r	   r
   r   r   r   r   Zscapy.layers.smbr   r   r   r   r   r   r   r   r   r   Zscapy.layers.smb2r   r   r   r   r   r   r   r    r!   r"   r7   r7   r7   r8   Ú<module>   s   $	0,