o
    àý°j¬y ã                   @   sÞ  d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZ d d
lT 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' d dl(m)Z) d dl*Z*d dl+Z+d dl,Z,ze -¡ Z.W n e/y•   eZ.Y nw dd d ddddd dœZ0g dd d dœZ1i dd“dd “dd “dd “dd“dd“dd“dd “dd “dg “dd“dd“dd“dd “d d“d!d“d"d“Z2ddd d#œZ3dd d$œZ4i d%d&“d'd&“d(d)“d*d+“d,d-“d.d/“d0d1“d2d3“d4d5“d6d7“d8d9“d:d;“d<d=“d>d=“d?d=“d@dA“dBdC“i dDdE“dFdG“dHdI“dJdK“dLdM“dNdO“dPdQ“dRdQ“dSdT“dUdQ“dVdT“dWdT“dXdY“dZdY“d[dY“d\dY“d]dY“¥dQdQdQd^d_d_d_d^d`daœ	¥Z5G dbdc„ dce6ƒZ7G ddde„ deƒZ8dS )fé    )Údivision)Úprint_functionN)Ú
indexbytesÚb)Úa2b_hex)Úcontextmanager)ÚnoValue)ÚAES)ÚnmbÚntlmÚuuidÚcrypto)Ú*)ÚSTATUS_SUCCESSÚSTATUS_MORE_PROCESSING_REQUIREDÚSTATUS_INVALID_PARAMETERÚSTATUS_NO_MORE_FILESÚSTATUS_PENDINGÚSTATUS_NOT_IMPLEMENTEDÚERROR_MESSAGES)ÚSPNEGO_NegTokenInitÚ	TypesMechÚSPNEGO_NegTokenRespÚASN1_OIDÚ
asn1encodeÚASN1_AID)ÚKRB5_AP_REQÚ F)Ú	ShareNameÚTreeConnectIdÚSessionÚ
IsDfsShareÚ	IsCAShareÚEncryptDataÚIsScaleoutShareÚNumberOfUses)Ú	OpenTableÚLeaseKeyÚ
LeaseStateÚ
LeaseEpochÚFileIDÚTreeConnectÚ
ConnectionÚOplocklevelÚDurableÚFileNameÚResilientHandleÚLastDisconnectTimeÚResilientTimeoutÚOperationBucketsÚ
CreateGuidÚIsPersistentÚDesiredAccessÚ	ShareModeÚCreateOptionÚFileAttributesÚCreateDisposition)ÚCancelIDÚMessageÚ	Timestamp)Ú
SigningKeyr,   éf   zWindows 3.1ég   é™   zWindows 3.2i,  zWindows 3.11i  zWindows NT 3.1 SP3i'  zWindows NT 3.5i¶  z
Windows 95i!  zWindows NT 3.51ie  zWindows NT 4.0iÎ  z
Windows 98i“  zWindows 2000i®  zWindows 98 Second Editioni(
  z
Windows XPiŒ
  i–
  i¸  z
Windows MeiÎ  z)Windows XP / Server 2003 / Server 2003 R2ir  zWindows Vistais  zWindows Server 2008i±  zWindows 7 / Server 2008 R2iÐ   zWindows Home Server 2011ið#  zWindows 8 / Server 2012i€%  zWindows 8.1 / Server 2012 R2i (  z
Windows 10iZ)  i98  zWindows 10 / Server 2016i×:  i«?  iîB  icE  zWindows 10 / Server 2019iºG  i»G  iaJ  ibJ  zWindows Server 2022z
Windows 11zWindows 11 / Server 2025)	icJ  idJ  ieJ  i|O  iðU  i]X  igX  i6c  iôe  c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚSessionErrorr   c                 C   s   t  | ¡ || _|| _d S ©N)Ú	ExceptionÚ__init__ÚerrorÚpacket)ÚselfrF   rG   © rI   ú€/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/smb3.pyrE   «   s   

zSessionError.__init__c                 C   ó   | j S rC   )rF   ©rH   rI   rI   rJ   Úget_error_code°   ó   zSessionError.get_error_codec                 C   rK   rC   )rG   rL   rI   rI   rJ   Úget_error_packet³   rN   zSessionError.get_error_packetc                 C   s   dt | j  S )NzSMB SessionError: %s(%s))r   rF   rL   rI   rI   rJ   Ú__str__¶   ó   zSessionError.__str__N)r   r   )Ú__name__Ú
__module__Ú__qualname__rE   rM   rO   rP   rI   rI   rI   rJ   rB   ª   s
    
rB   c                   @   s6  e Zd ZG dd„ deƒZdejddddddfdd„Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zed-d.„ ƒZd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd d7d8„Z d¡d9d:„Z!d;d<„ Z"d¢d?d@„Z#d£dAdB„Z$dCdD„ Z%dEdF„ Z&e'de(dfdGdH„Z)dIdJ„ Z*d¤dLdM„Z+d¤dNdO„Z,dPde-dd>d>fdQdR„Z.dSdT„ Z/dUdV„ Z0d¥dYdZ„Z1d[d\„ Z2d¦d]d^„Z3d_d`„ Z4d=e5e6ddfdadb„Z7d=e5e6dfdcdd„Z8dedf„ Z9dgdh„ Z:didj„ Z;d¦dkdl„Z<dmdn„ Z=dodp„ Z>d dqdr„Z?d dsdt„Z@d dudv„ZAd dwdx„ZBeCddeDfdydz„ZEeFddeDfd{d|„ZGd§d~d„ZHd€d�„ ZIeZJeZKeZLeZMeZNeZOeZPeZQeZReZSeZTeZUe%ZVe%ZWe%ZXe&ZYeZZeZ[eGZ\eEZ]e?Z^d‚dƒ„ Z_d„d…„ Z`d†d‡„ Zadˆd‰„ Zbd¡dŠd‹„ZcdŒd�„ Zdd¨dŽd�„Zed©d�d‘„Zfd’d“„ Zgdªd”d•„Zhd–d—„ Zid˜d™„ Zjdšd›„ Zkdœd�„ ZldždŸ„ ZmdS )«ÚSMB3c                   @   s   e Zd ZdS )z SMB3.HostnameValidationExceptionN)rR   rS   rT   rI   rI   rI   rJ   ÚHostnameValidationException»   s    rV   Né½  é<   r   c                 C   s´  d| _ i | _i | _d dd„ tdƒD ƒ¡| _dg| _g | _d| _i di “di “d	d
“dd“dd
“dd
“dd
“dd“dd“dd“dd
“dd“dd“dd“dd“dd“dd“d
d
d
d
ddi d
t	dƒd
dœ
¥| _
i dd
“di “dd“dd“d d
“d!d“d"i “d#g “d$d
“d%d&“d'd“d(d“d)d“d*d“d+d
“dd“d,d“ddddt	dƒd&d-œ¥| _t| _|| _|| j
d.< d | _|| _d| _d| _d&| _d| _d| _d| _d| _d| _d| _d| _d| _d | _d | _|d/krì|d0krì|| j
d< n|| j
d< |d u rûd| j
d1< n|| j
d1< |	d u �rF|�st ¡ }|  d2¡}|d3k�r|d |… }|�r0t! "|| j
d |||| j¡| _d S t! #|| j
d |||| j¡| _|  $|¡ d S |	| _| j
d	  d47  < |  $||
¡ d S )5NFr   c                 S   ó   g | ]}t  tj¡‘qS rI   )ÚrandomÚchoiceÚstringÚascii_letters)Ú.0ÚirI   rI   rJ   Ú
<listcomp>Å   ó    z!SMB3.__init__.<locals>.<listcomp>é   zAES-CCMÚOutstandingRequestsÚOutstandingResponsesÚSequenceWindowr   ÚGSSNegotiateTokenÚMaxTransactSizeÚMaxReadSizeÚMaxWriteSizeÚ
ServerGuidÚRequireSigningÚ
ServerNameÚDialectÚSupportsFileLeasingÚSupportsMultiCreditÚSupportsDirectoryLeasingÚSupportsMultiChannelÚSupportsPersistentHandlesÚSupportsEncryptionó€   00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000)
ÚClientCapabilitiesÚServerCapabilitiesÚClientSecurityModeÚServerSecurityModeÚServerIPÚ
ClientNameÚ
GSSoptionsÚPreauthIntegrityHashIdÚPreauthIntegrityHashValueÚCipherIdÚ	SessionIDÚTreeConnectTableÚ
SessionKeyó    ÚSigningRequiredr,   ÚUserCredentialsr&   ÚChannelListÚChannelSequencer#   TÚEncryptionKeyÚDecryptionKeyr>   ÚApplicationKeyÚSessionFlagsÚServerDomain)ÚServerDNSDomainNameÚServerDNSHostNameÚServerOSÚSigningActivatedr}   ÚCalculatePreAuthHashry   rW   z
*SMBSERVERrz   Ú.éÿÿÿÿé   )%ÚRequireMessageSigningÚConnectionTableÚGlobalFileTableÚjoinÚrangeÚ
ClientGuidÚEncryptionAlgorithmListÚ
MaxDialectÚRequireSecureNegotiater   Ú_ConnectionÚ_SessionÚ
SMB2PacketÚ
SMB_PACKETÚ_timeoutÚ_NetBIOSSessionÚ_preferredDialectÚ_doKerberosÚ_strict_hostname_validationÚ_validation_allow_absentÚ_accepted_hostnameÚ_SMB3__userNameÚ_SMB3__passwordÚ_SMB3__domainÚ_SMB3__lmhashÚ_SMB3__nthashÚ
_SMB3__kdcÚ_SMB3__aesKeyÚ
_SMB3__TGTÚ
_SMB3__TGSÚsocketÚgethostnameÚfindr
   ÚNetBIOSUDPSessionÚNetBIOSTCPSessionÚnegotiateSession)rH   Úremote_nameÚremote_hostÚmy_nameÚ	host_typeÚ	sess_portÚtimeoutÚUDPÚpreferredDialectÚsessionÚnegSessionResponser_   rI   rI   rJ   rE   ¾   s  üûúùø	÷
öõôóðïîëêéè
Ú)ÿþýüûúù
öõóòñðïíìë
å





"zSMB3.__init__c                 C   sZ   t dƒ t| j ¡ ƒD ]}t d| ƒ qt ƒ  t dƒ t| j ¡ ƒD ]}t d| ƒ q"d S )NÚ
CONNECTIONz
%-40s : %sÚSESSION)ÚprintÚlistr�   Úitemsrž   )rH   r_   rI   rI   rJ   ÚprintStatusJ  s   ÿzSMB3.printStatusc                 C   ó@   ddl m} | ¡ }| | jd ¡ | |¡ | ¡ | jd< d S ©Nr   )ÚSHA512r}   )ÚCryptodome.HashrÉ   ÚnewÚupdater�   Údigest©rH   ÚdatarÉ   ÚcalculatedHashrI   rI   rJ   Ú__UpdateConnectionPreAuthHashS  ó
   
z"SMB3.__UpdateConnectionPreAuthHashc                 C   rÇ   rÈ   )rÊ   rÉ   rË   rÌ   rž   rÍ   rÎ   rI   rI   rJ   Ú__UpdatePreAuthHashZ  rÒ   zSMB3.__UpdatePreAuthHashc                 C   rK   rC   )r¤   rL   rI   rI   rJ   ÚgetKerberosa  rN   zSMB3.getKerberosc                 C   ó
   | j d S )Nrl   ©rž   rL   rI   rI   rJ   ÚgetServerNamed  ó   
zSMB3.getServerNamec                 C   rÕ   )Nrz   rÖ   rL   rI   rI   rJ   ÚgetClientNameg  rØ   zSMB3.getClientNamec                 C   s"   | j d dkr| jd S | j d S )Nrl   r   )rž   r�   rL   rI   rI   rJ   ÚgetRemoteNamej  s   

zSMB3.getRemoteNamec                 C   s   || j d< dS )Nrl   TrÖ   )rH   ÚnamerI   rI   rJ   ÚsetRemoteNameo  s   
zSMB3.setRemoteNamec                 C   rÕ   )Nry   ©r�   rL   rI   rI   rJ   ÚgetServerIPs  rØ   zSMB3.getServerIPc                 C   rÕ   )Nr‹   rÖ   rL   rI   rI   rJ   ÚgetServerDomainv  rØ   zSMB3.getServerDomainc                 C   rÕ   )NrŒ   rÖ   rL   rI   rI   rJ   ÚgetServerDNSDomainNamey  rØ   zSMB3.getServerDNSDomainNamec                 C   rÕ   )Nr�   rÖ   rL   rI   rI   rJ   ÚgetServerDNSHostName|  rØ   zSMB3.getServerDNSHostNamec                 C   rÕ   )NrŽ   rÖ   rL   rI   rI   rJ   ÚgetServerOS  rØ   zSMB3.getServerOSc                 C   rÕ   )NÚServerOSMajorrÖ   rL   rI   rI   rJ   ÚgetServerOSMajor‚  rØ   zSMB3.getServerOSMajorc                 C   rÕ   )NÚServerOSMinorrÖ   rL   rI   rI   rJ   ÚgetServerOSMinor…  rØ   zSMB3.getServerOSMinorc                 C   rÕ   )NÚServerOSBuildrÖ   rL   rI   rI   rJ   ÚgetServerOSBuildˆ  rØ   zSMB3.getServerOSBuildc                 C   s   | j d t@ S )NrŠ   )rž   ÚSMB2_SESSION_FLAG_IS_GUESTrL   rI   rI   rJ   ÚisGuestSession‹  rQ   zSMB3.isGuestSessionc                 C   s
   || _ d S rC   )r¡   )rH   r¼   rI   rI   rJ   Ú
setTimeoutŽ  rØ   zSMB3.setTimeoutc              	   c   s0   � |   |¡}zd V  W |  |¡ d S |  |¡ w rC   )Ú
getTimeoutrë   )rH   r¼   Úprev_timeoutrI   rI   rJ   Ú
useTimeout‘  s
   €
zSMB3.useTimeoutc                 C   rÕ   )Nrm   rÝ   rL   rI   rI   rJ   Ú
getDialect™  rØ   zSMB3.getDialectc           	      C   sò   d}|dkrwt ||d … ƒ}|d tkr(t|d ƒ}t d|d ¡d | jd< n3|d tkrMt|d ƒ}t d|d ¡d }|| jd< |dkrLd	| jd
< n|d tkrTn|d t	kr[	 d|d d  d }d|d  | }|d8 }|dksd S d S )Nr   ÚContextTypeÚDataú<HÚHashAlgorithmsr|   ÚCiphersr~   Trs   é   Ú
DataLengthr“   )
ÚSMB2NegotiateContextÚ#SMB2_PREAUTH_INTEGRITY_CAPABILITIESÚ SMB2PreAuthIntegrityCapabilitiesÚstructÚunpackr�   ÚSMB2_ENCRYPTION_CAPABILITIESÚSMB2EncryptionCapabilitiesÚSMB2_COMPRESSION_CAPABILITIESÚ!SMB2_NETNAME_NEGOTIATE_CONTEXT_ID)	rH   ÚcontextCountÚcontextListÚoffsetÚcontextÚcontextPreAuthÚcontextEncryptionÚcipherIdÚpaddingrI   rI   rJ   ÚprocessContextListœ  s*   

€îzSMB3.processContextListc                 C   s®   d|d< | j d tks| j d tkr6t| jd ƒdkr4t | jd | ¡ tj	¡ 
¡ }|d d… |d< d S d S t| jd ƒdkrU| ¡ }t | jd |t|ƒ¡}||d< d S d S )Nz                Ú	Signaturerm   r�   r   rb   r>   )r�   ÚSMB2_DIALECT_21ÚSMB2_DIALECT_002Úlenrž   ÚhmacrË   ÚgetDataÚhashlibÚsha256rÍ   r   ÚAES_CMAC)rH   rG   Ú	signatureÚprI   rI   rJ   ÚsignSMB²  s   þýzSMB3.signSMBc                 C   sR  |d t ur| jd |d< | jd  d7  < | jd |d< d|jv du r(d|d< | jd dkr3d	|d
< |d }| jd du r|| jd dkr||d dkrm|d | jd v du rm| jd |d  d du rlt|d< |  |¡ n|d dkr|t|d< |  |¡ |d tu r�| ¡ }|  |¡ d| jd< |d t	u r›d| jd< | jd t
@ s·|d dk�r| jd |d  d du �r| ¡ }tƒ }d dd„ tdƒD ƒ¡|d< t|ƒ|d< t|d< | jd |d< t | jd tjt|d ƒ¡}| | ¡ dd … ¡ | |¡}| ¡ |d< | ¡ | }| j |¡ |S | ¡ }| jd du �r!|  |¡ | j |¡ |S )NÚCommandre   Ú	MessageIDr“   r   ÚCreditChargeFé   é   ÚCreditRequestResponser�   Té   ÚTreeIDr   r€   r#   ÚFlagsr�   rŠ   r   c                 S   rY   rI   ©Úrandr[   r\   r]   ©r^   Ú_rI   rI   rJ   r`   ê  ra   z SMB3.sendSMB.<locals>.<listcomp>é   ÚNonceÚOriginalMessageSizeÚEncryptionAlgorithmr‡   é   r	  )ÚSMB2_CANCELr�   rž   ÚfieldsÚSMB2_FLAGS_SIGNEDr  ÚSMB2_NEGOTIATEr  Ú"_SMB3__UpdateConnectionPreAuthHashÚSMB2_SESSION_SETUPÚSMB2_SESSION_FLAG_ENCRYPT_DATAÚSMB2_TRANSFORM_HEADERr—   r˜   r  ÚSMB2_ENCRYPTION_AES128_CCMr	   rË   ÚMODE_CCMr   rÌ   ÚencryptrÍ   r¢   Úsend_packetÚ_SMB3__UpdatePreAuthHash)rH   rG   Ú	messageIdrÏ   Ú	plainTextÚtransformHeaderÚcipherÚ
cipherTextrI   rI   rJ   ÚsendSMB¾  sV   	"
€



8
ú
zSMB3.sendSMBc                 C   sÆ  || j d v r| j d  |¡S | j | j¡}| ¡  d¡rRt| ¡ ƒ}t 	| j
d tj|d d d… ¡}| | ¡ dd … ¡ | | ¡ ttƒ ƒd … ¡}t|ƒ}nt| ¡ ƒ}|d tkrµt}|tkrµ| j | j¡}| ¡  d¡ryt| ¡ ƒ}n4t| ¡ ƒ}t 	| j
d tj|d d d… ¡}| | ¡ dd … ¡ | | ¡ ttƒ ƒd … ¡}t|ƒ}|d }|tksd|d	 |ks¿|d u rÕ| j d
 tkrÓ| j d  |d d 7  < |S || j d |d	 < |  |¡S )Nrd   s   ýSMBrˆ   r#  r"  r&  ÚStatuss   þSMBr  rm   re   r  r“   )r�   Úpopr¢   Úrecv_packetr¡   Úget_trailerÚ
startswithr.  r	   rË   rž   r0  rÌ   r  Údecryptr  rŸ   r   r  ÚrecvSMB)rH   ÚpacketIDrÏ   r6  r7  r5  rG   ÚstatusrI   rI   rJ   r@  þ  s:   "
"ô
zSMB3.recvSMBc                 C   s  t | jd< | jdu r| jd  tO  < t| jd< t}|d ur(t|d ƒ}|d }|tk�r2|  ¡ }t|d< t	ƒ }| jd |d< | jd |d< | j
|d< |d urU|g|d	< n	tttttg|d	< t|d	 ƒ|d
< t|d	 v �rtƒ }t|d	 ƒdkr}d|d< nd|d< d|d< tƒ }t|d< tƒ }	d|	d< d|	d< d|	d< d dd„ t|	d ƒD ƒ¡|	d< |	 ¡ |d< t|d ƒ|d< |d  d7  < dd|d d  d  }
tƒ }t|d< tƒ }d|d< d|d< | ¡ |d< t|d ƒ|d< |d  d7  < | ¡ |d < d!|d"< | ¡ |
 | ¡  |d#< ||d< |  |¡}|  |¡}| t¡�r2t|d ƒ}|d tk�r2|  |j¡ t d$|d% ƒ| jd%< t d$|d& ƒ| jd&< t d$|d' ƒ| jd'< |d( | jd(< |d) | jd*< |d | jd+< |d t@ tk�sv| jd+ tk�r{d| jd,< | jd+ tk�r™d| jd,< |d }|dk�r™|  !||d# ¡ |d t"@ t"k�r§d| jd-< |d t#@ t#k�rµd| jd.< | jd+ tk�rt$| _|d t%@ t%k�rÎd| jd/< |d t&@ t&k�rÜd| jd0< |d t'@ t'k�rêd| jd1< |d t@ tk�rød| jd2< |d | jd3< |d | jd4< d S d S )5Nrw   TÚCapabilitiesrñ   ÚDialectRevisionr  ÚSecurityModer™   ÚDialectsÚDialectCountr“   ép   ÚNegotiateContextOffsetéh   r   ÚNegotiateContextCountrð   ÚHashAlgorithmCounté    Ú
SaltLengths    ró   r   c                 S   rY   rI   r  r   rI   rI   rJ   r`   c  ra   z)SMB3.negotiateSession.<locals>.<listcomp>ÚSaltrö   ó   ÿrõ   ÚCipherCountrô   ÚClientStartTimes   ÿÿÚPaddingÚNegotiateContextListi   rg   rh   ri   rj   ÚBufferrf   rm   rk   rn   ro   rp   rq   rr   rs   rv   rx   )(ÚSMB2_NEGOTIATE_SIGNING_ENABLEDr�   r”   ÚSMB2_NEGOTIATE_SIGNING_REQUIREDÚSMB2_GLOBAL_CAP_ENCRYPTIONÚSMB2_DIALECT_WILDCARDÚSMB2Negotiate_Responser    r*  ÚSMB2Negotiater™   r  r
  ÚSMB2_DIALECT_30ÚSMB2_DIALECT_302ÚSMB2_DIALECT_311r  ÚSMB311ContextDatar÷   rø   rù   r—   r˜   r  rü   rý   r9  r@  ÚisValidAnswerr   r+  ÚrawDataÚminr  ÚSMB2_GLOBAL_CAP_LEASINGÚSMB2_GLOBAL_CAP_LARGE_MTUÚ
SMB3PacketÚ!SMB2_GLOBAL_CAP_DIRECTORY_LEASINGÚSMB2_GLOBAL_CAP_MULTI_CHANNELÚ"SMB2_GLOBAL_CAP_PERSISTENT_HANDLES)rH   r¾   rÀ   ÚcurrentDialectÚnegResprG   Ú
negSessionÚcontextDataÚnegotiateContextÚpreAuthIntegrityCapabilitiesÚpadÚnegotiateContext2ÚencryptionCapabilitiesrA  ÚansÚnegContextCountrI   rI   rJ   r¶   0  s®   







ÿ










ózSMB3.negotiateSessionc                 C   s$   | j | j| j| j| j| j| j| jfS rC   )r¨   r©   rª   r«   r¬   r®   r¯   r°   rL   rI   rI   rJ   ÚgetCredentials±  s   øzSMB3.getCredentialsr   Fc           9      C   sö  |dks|dkr+t |ƒd rd| }t |ƒd rd| }z
t|ƒ}t|ƒ}W n   Y || _|| _|| _|| _|| _|| _|| _|| _	|	| _
d| _tƒ }| jdu rVt|d< nt|d< d|d< ddlm}m}m}m} dd	lm}m} dd
lm} ddlm}m}m} ddlm}m } dd l!}|||j"j#j$d�}|d u r®|	d u r­||||||||ƒ\}}}}n|d }|d }|d }|	d u rÚ|d| j%d  |j"j&j$d�}|||||||ƒ\}}}}n|	d }|	d }|	d }t'ƒ } t(d g| d< |j)||ƒ d�d }|ƒ }!|! *|d ¡ |ƒ }"d|"d< t+|j,jj$ƒ|"d< t-ƒ }#|
dk�r*ddl.m/}$ |# 0|j/j1j$¡ | 2|#¡|"d< ||"d|!j3ƒ |ƒ }%d|%d< ||%d< ||%d|j4ƒ |j! 5|j6j7¡}&|&j8|%d< | 3|&¡|%d < | 9|%¡}'| :|d!|'d ¡}(t;|"d"< |j<|"d" d#< |(|"d" d< t= >d$t?¡t@t= >d$tA¡t@t(d% ƒ tB | 9|"¡ ƒ | d&< t | ƒ|d'< |  C¡ |d(< |  D¡ })tE|)d)< ||)d*< | j%d+ | jFd+< |  G|)¡}*|  H|*¡}+|+ ItJ¡�rH|+d, | jFd,< | j%d- | jFd.< |||||f| jFd/< | jK L¡ | jFd0< |
dk�rddd1lmM},mN}- dd2lOmP}.mQ}/ tR|+d* ƒ}0tS|0d( ƒ}1|j)|1d3 d4d … |,ƒ d�d }2|j<|2d5 d# k�r)tTd6ƒ‚|2d5 d }3| U|d7|3¡}4|j)|4|-ƒ d�d }5|/t+|5d8 d9 ƒ ƒ }6|.|6j<|5d8 d:  V¡ ƒ}7t+|5d; ƒ}8|7jW| jFd<< n
|jWd d4… | jFd<< | jFd. du �r¦| j%d= tXk�r¦| j%d= tYk�r˜tZ [| jFd< d>| jFd+ d?¡| jFd@< ntZ [| jFd< dAdBd?¡| jFd@< |dk�s°|  \¡ �rµdC| j%dD< | jFd. du �rÂd| jFdE< | j%d= tXk�rA| j%dD du �rA| jFdF  t]O  < | j%d= tYk�rtZ [| jFd< dG| jFd+ d?¡| jFdH< tZ [| jFd< dI| jFd+ d?¡| jFdJ< tZ [| jFd< dK| jFd+ d?¡| jFdL< n*tZ [| jFd< dMdNd?¡| jFdH< tZ [| jFd< dOdPd?¡| jFdJ< tZ [| jFd< dOdQd?¡| jFdL< dC| jFdR< dS d| jFd/< d| jFd0< d| jFd,< dC| jFd.< d| jFd@< d| jFd<< dC| jFdE< dC| jFdR< tdSƒ| jFd+< tTdTƒ‚)UNr   r  ú0%sTrE  r   r  )ÚAP_REQÚAuthenticatorÚTGS_REPÚseq_set)ÚgetKerberosTGTÚgetKerberosTGS)Ú	constants)Ú	PrincipalÚKerberosTimeÚTicket)ÚdecoderÚencoder)ÚtypeÚKDC_REPr7  Ú
sessionKeyzcifs/%srl   zMS KRB5 - Microsoft Kerberos 5Ú	MechTypes)Úasn1SpecÚticketé   Úpvnozmsg-type)Ú	APOptionsz
ap-optionszauthenticator-vnoÚcrealmÚcnameÚcusecÚctimer"  ÚauthenticatorÚetypeÚBzKRB5 - Kerberos 5Ú	MechTokenÚSecurityBufferLengthrU  r  rñ   r}   r   rk   rƒ   r„   r,   )ÚAP_REPÚEncAPRepPart)ÚKeyÚ_enctype_tableÚResponseTokenrb   zenc-partz?Unable to decrypt AP_REP: cipher does not match TGS session keyé   ÚsubkeyÚkeytypeÚkeyvaluez
seq-numberr�   rm   ó   SMBSigningKey é€   r>   ó   SMB2AESCMAC ó   SmbSign Frs   r�   rŠ   ó
   SMBAppKey r‰   ó   SMBC2SCipherKey r‡   ó   SMBS2CCipherKey rˆ   ó   SMB2APP ó   SmbRpc ó   SMB2AESCCM ó
   ServerIn  ó
   ServerOut r�   rt   zUnsuccessful Login)^r  r   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   r¤   ÚSMB2SessionSetupr”   rW  rV  Úimpacket.krb5.asn1rv  rw  rx  ry  Úimpacket.krb5.kerberosv5rz  r{  Úimpacket.krb5r|  Úimpacket.krb5.typesr}  r~  r  Úpyasn1.codec.derr€  r�  ÚdatetimeÚPrincipalNameTypeÚNT_PRINCIPALÚvaluer�   ÚNT_SRV_INSTr   r   ÚdecodeÚ	from_asn1ÚintÚApplicationTagNumbersrÄ   Úimpacket.krb5.constantsrŠ  ÚappendÚmutual_requiredÚencodeFlagsÚto_asn1Úcomponents_to_asn1ÚnowÚtimezoneÚutcÚmicrosecondÚencoder1  r   Úenctyperú   Úpackr   r   r   r   r  r    r,  rž   r9  r@  r`  r   r¢   Ú
get_socketr”  r•  Úimpacket.krb5.cryptor–  r—  ÚSMB2SessionSetup_Responser   rD   r?  ÚasOctetsÚcontentsr\  r^  r   ÚKDF_CounterModerê   r-  )9rH   ÚuserÚpasswordÚdomainÚlmhashÚnthashÚaesKeyÚkdcHostÚTGTÚTGSÚ
mutualAuthÚsessionSetuprv  rw  rx  ry  rz  r{  r|  r}  r~  r  r€  r�  r¯  ÚuserNameÚtgtr7  ÚoldSessionKeyr„  Ú
serverNameÚtgsÚblobr‡  ÚapReqÚoptsrŠ  r�  r¾  ÚencodedAuthenticatorÚencryptedEncodedAuthenticatorrG   rA  rr  r”  r•  r–  r—  ÚsmbSessSetupRespÚnegTokenRespÚap_repr8  r5  ÚencAPRepPartÚapCipherÚapSessionKeyÚsequenceNumberrI   rI   rJ   ÚkerberosLogin¼  s,  

€


ÿÿÿ



  
ÿ
ÿ

 

ÿ

ÿ
ÿ
ÿ
ÿ
ÿ








zSMB3.kerberosLoginc              	   C   s–  |dks|dkr+t |ƒd rd| }t |ƒd rd| }z
t|ƒ}t|ƒ}W n   Y || _|| _|| _|| _|| _d| _d | _d | _	t
ƒ }| jdu rPt|d< nt|d< d|d< tƒ }td g|d	< t | jd
 || jd ¡}| ¡ |d< t |ƒ|d< | ¡ |d< |  ¡ }	t|	d< ||	d< | jd | jd< |  |	¡}
|  |
¡}| jd tkr¬|  |j¡ | t¡�rI|d | jd< | jd | jd< |||||f| jd< | j ¡ | jd< t |d ƒ}t!|d ƒ}t "|d ¡}|d dk�rýt #|d d |d … ¡}|tj$ d u�rz|tj$ d  %d¡| jd< W n   Y |tj& d u�rBz| jd |tj& d  %d¡k�r<|tj& d  %d¡| jd< W n   Y |tj' d u�r^z|tj' d  %d¡| jd< W n   Y |tj( d u�rzz|tj( d  %d¡| jd< W n   Y | j)�r‚|  *¡  d |j+v �rý|d  }t |ƒd!k�rýt, -d"|dd!… ¡d t. /¡ v �rÄt.t, -d"|dd!… ¡d  d#t, -d"|dd!… ¡d   | jd$< nd%t0|dƒt0|dƒt, -d"|dd!… ¡d f | jd$< t0|dƒ| jd&< t0|dƒ| jd'< t, -d"|dd!… ¡d | jd(< t 1||d |||||¡\}}t!ƒ }| ¡ |d< t |ƒ|d< | ¡ |d< |  |	¡}
|  |
¡}	|d u�rg|| jd)< | jd du �rg| jd t2k�rg| jd tk�r\t3 4|d*| jd d+¡| jd,< nt3 4|d-d.d+¡| jd,< z®|	 t5¡�rt |	d ƒ}|d/ | jd/< |	d | jd< |dk�sŒ|  6¡ �r‘d0| jd1< | jd du �ržd| jd2< | jd t2k�r| jd1 du �r| jd/  t7O  < | jd tk�rêt3 4|d3| jd d+¡| jd4< t3 4|d5| jd d+¡| jd6< t3 4|d7| jd d+¡| jd8< n!t3 4|d9d:d+¡| jd4< t3 4|d;d<d+¡| jd6< t3 4|d;d=d+¡| jd8< d0| jd>< W dS W d S    d| jd< d| jd< d| jd< d0| jd< d| jd,< d| jd)< d0| jd2< d0| jd>< td?ƒ| jd< ‚ d S )@Nr   r  ru  TrE  r   r  z2NTLMSSP - Microsoft NTLM Security Support Providerr…  rz   rk   r’  r“  rU  r  rñ   r}   rm   r   rƒ   r„   r,   r˜  ÚTargetInfoFields_lenÚTargetInfoFieldsr“   úutf-16lerl   r‹   rŒ   r�   ÚVersioné   rò   z	 Build %drŽ   zWindows %d.%d Build %drã   rå   rç   r�   r�  rž  r>   rŸ  r   rŠ   Frs   r�   r¡  r‰   r¢  r‡   r£  rˆ   r¤  r¥  r¦  r§  r¨  r�   rt   )8r  r   r¨   r©   rª   r«   r¬   r®   r¯   r°   r©  r”   rW  rV  r   r   r   ÚgetNTLMSSPType1r�   r  r    r,  rž   r9  r@  r^  r3  ra  r`  r   r¢   rÅ  rÇ  r   ÚNTLMAuthChallengeÚAV_PAIRSÚNTLMSSP_AV_HOSTNAMEr´  ÚNTLMSSP_AV_DOMAINNAMEÚNTLMSSP_AV_DNS_DOMAINNAMEÚNTLMSSP_AV_DNS_HOSTNAMEr¥   Úperform_hostname_validationr(  rú   rû   ÚWIN_VERSIONSÚkeysr   ÚgetNTLMSSPType3r\  r   rÊ  r   rê   r-  )rH   rË  rÌ  rÍ  rÎ  rÏ  rÕ  rÛ  ÚauthrG   rA  rr  ÚsessionSetupResponseÚ	respTokenÚntlmChallengeÚav_pairsÚversionÚtype3ÚexportedSessionKeyÚ
respToken2rI   rI   rJ   Úlogin¹  s  




 €"@4



 ý
ÿ

 

ÿ

ÿ
ÿ
ÿ
ÿ
ÿ
Ô-







 �òz
SMB3.loginc                 C   s   |  d¡d }|| jd v r0| jd | }|d  d7  < | jd |d  d  d7  < |d S zt | jd dd	d	tj¡d	 \}}}}}|d	 }W n	   | jd }Y d
| d | }tƒ }| d¡|d< t|d ƒ|d< |  	¡ }t
|d< ||d< |  |¡}	|  |	¡}| t¡rþt|d ƒ}
t t¡}||d< |d |d< |d |d< |d  d7  < |
d t@ tkr¸d|d< |
d t@ tkrÄd|d< | jd tkrê| jd du rÞ|
d t@ tkrÞd|d< |
d t@ tkrêd|d< || jd |d < || jd |< |d S d S )Nú\r’   r€   r%   r“   r   ry   éP   r   ú\\rê  rU  Ú
PathLengthr  rñ   r   r  r   r    rC  Tr!   r"   rm   rs   Ú
ShareFlagsr#   r$   )Úsplitrž   r±   Úgetaddrinfor�   ÚIPPROTO_TCPÚSMB2TreeConnectrÂ  r  r    ÚSMB2_TREE_CONNECTr9  r@  r`  r   ÚSMB2TreeConnect_ResponseÚcopyÚdeepcopyÚTREE_CONNECTÚSMB2_SHARE_CAP_DFSÚ&SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITYr\  ÚSMB2_SHAREFLAG_ENCRYPT_DATAÚSMB2_SHARE_CAP_SCALEOUT)rH   ÚshareÚ	treeEntryr!  ÚsockaddrÚ
remoteHostÚpathÚtreeConnectrG   rA  ÚtreeConnectResponserI   rI   rJ   ÚconnectTree†  sP   (



çzSMB3.connectTreec           
      C   sF  || j d v du rttƒ‚|| j d v r?| j d | d dkr?| j d | }|d  d8  < | j d |d  d  d8  < dS |  ¡ }t|d< ||d< tƒ }||d	< |  |¡}|  |¡}| t	¡r¡| j d | d }| j d |= | j d |= g }t
| j d
  ¡ ƒD ]}| j d
 | d |kr“| |¡ q�|D ]}	| j d
 |	= q–dS d S )Nr€   Fr%   r“   r   Tr  r  rñ   r&   r+   )rž   rB   r   r    ÚSMB2_TREE_DISCONNECTÚSMB2TreeDisconnectr9  r@  r`  r   rÄ   rö  r¹  )
rH   ÚtreeIdr  rG   ÚtreeDisconnectrA  Ú	shareNameÚfilesIDToBeRemovedÚfileIDÚfileIDToBeRemovedrI   rI   rJ   ÚdisconnectTreeÀ  s8   



€özSMB3.disconnectTreec                 C   s`  || j d v du rttƒ‚| dd¡}t|ƒdkr*t |¡}|d dkr*|dd … }| j d | d du r8|}nd	| jd
  d | }t 	t
¡}t ¡ |d< t|d< || j|< | jd tkr�| jd du r�t| d¡ƒdkrst |¡}|| jv r|tdƒ‚t 	t
¡}t ¡ |d< t|d< || j|< |  ¡ }t|d< ||d< | j d | d du r«t|d< tƒ }d|d< |
|d< ||d< ||d< ||d< ||d< ||d< ||d< t| d¡ƒ|d< |dkrã| d¡|d< nd |d< |d u�r<d! d"d#„ |D ƒ¡}ttƒ ƒtj t|d ƒ |d$< |d$ d% �r-|d  d d%|d$ d%   7  < ttƒ ƒtj t|d ƒ |d$< t|ƒ|d&< |d  |7  < nd|d$< d|d&< ||d'< |  |¡}|  |¡}| t¡�r®t|d' ƒ}t 	t ¡}|d( |d(< ||d)< |
|d*< d|d+< d|d,< d|d-< ||d.< | jd tk�r�|
|d< |
|d/< |
|d< |
|d< |
|d< || j d0 |d(  !¡ < |d(  !¡ S d S )1Nr€   Fú/r  r   r“   r!   Tr  rl   r'   r(   rm   rp   r  zDon't know what to do now! :-or  r  r  ÚSecurityFlagsÚRequestedOplockLevelÚImpersonationLevelr6   r9   ÚShareAccessr:   ÚCreateOptionsrê  Ú
NameLengthr   rU  ó    r‚   c                 s   s   � | ]}|  ¡ V  qd S rC   )r  ©r^   ÚxrI   rI   rJ   Ú	<genexpr>  ó   € zSMB3.create.<locals>.<genexpr>ÚCreateContextsOffsetrõ   ÚCreateContextsLengthrñ   r*   r+   r-   r.   r0   r1   r/   r7   r&   )"rž   rB   r   Úreplacer  ÚntpathÚnormpathr�   r  r  ÚFILEr   ÚgenerateÚSMB2_LEASE_NONEr–   r\  r  ÚdirnamerD   r    ÚSMB2_CREATEÚSMB2_FLAGS_DFS_OPERATIONSÚ
SMB2CreaterÂ  r—   rŸ   ÚSIZEr9  r@  r`  r   ÚSMB2Create_ResponseÚOPENr  )rH   r  ÚfileNameÚdesiredAccessÚ	shareModeÚcreationOptionsÚcreationDispositionÚfileAttributesÚimpersonationLevelÚsecurityFlagsÚoplockLevelÚcreateContextsÚpathNameÚ	fileEntryÚ	parentDirÚparentEntryrG   Ú
smb2CreateÚcontextsBufrA  rr  ÚcreateResponseÚopenFilerI   rI   rJ   Úcreateß  s’   







   


æzSMB3.createc                 C   s²   || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< tƒ }d|d< ||d< ||d	< |  |¡}|  |¡}| t	¡rW| j
| j d | d
 = | j d |= dS d S )Nr€   Fr&   r  r  r   r  r*   rñ   r/   T)rž   rB   r   r    Ú
SMB2_CLOSEÚ	SMB2Closer9  r@  r`  r   r–   )rH   r  ÚfileIdrG   ÚsmbCloserA  rr  rI   rI   rJ   ÚcloseD  s$   


ûz
SMB3.closeTc                 C   s<  || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< | jd |k r3| jd }n|}| jd tkrN| jd d	u rNd
|d
 d  |d< ntd|ƒ}tƒ }d|d< ||d< ||d< ||d< ||d< |  	|¡}	|  
|	¡}
|
 t¡rœt|
d ƒ}|d }|d dkrš||  |||t|ƒ |d |¡7 }|S d S )Nr€   Fr&   r  r  rh   rm   ro   Tr“   é   r  r  rS  r*   ÚLengthÚOffsetrñ   rU  ÚDataRemainingr   )rž   rB   r   r    Ú	SMB2_READr�   r  rb  ÚSMB2Readr9  r@  r`  r   ÚSMB2Read_ResponseÚreadr  )rH   r  rU  r  ÚbytesToReadÚ
waitAnswerrG   ÚmaxBytesToReadÚsmbReadrA  rr  ÚreadResponseÚretDatarI   rI   rJ   r_  ^  s8   



"ûz	SMB3.readc              	   C   s\  || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< | jd |k r3| jd }n|}| jd tkrN| jd d	u rNd
|d
 d  |d< ntd|ƒ}tƒ }	||	d< ||	d< ||	d< d|	d< |d |… |	d< |	|d< |  	|¡}
|d	u r�|  
|
¡}n|S | t¡r¬t|d ƒ}|d }||k rª||  ||||d … || || |¡7 }|S d S )Nr€   Fr&   r  r  ri   rm   ro   Tr“   rX  r  r*   rY  rZ  r   ÚWriteChannelInfoOffsetrU  rñ   ÚCount)rž   rB   r   r    Ú
SMB2_WRITEr�   r  rb  Ú	SMB2Writer9  r@  r`  r   ÚSMB2Write_ResponseÚwrite)rH   r  rU  rÏ   r  ÚbytesToWritera  rG   ÚmaxBytesToWriteÚsmbWriterA  rr  ÚwriteResponseÚbytesWrittenrI   rI   rJ   rk  ˆ  s>   


(ûz
SMB3.writer   c	                 C   s   || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }	t|	d< ||	d< tƒ }
||
d< |dkr5t|
d< ||
d	< ||
d
< |d u rF| jd }||
d< | d¡|
d< t	|
d ƒ|
d< |
|	d< | jd t
kru| jd du rud|d d  |	d< |  |	¡}|  |¡}| t¡rŽt|d ƒ}|d S d S )Nr€   Fr&   r  r  ÚFileInformationClassr   r  Ú	FileIndexr*   rh   ÚOutputBufferLengthrê  rU  ÚFileNameLengthrñ   rm   ro   Tr“   rX  r  )rž   rB   r   r    ÚSMB2_QUERY_DIRECTORYÚSMB2QueryDirectoryÚSMB2_INDEX_SPECIFIEDr�   rÂ  r  r  r9  r@  r`  r   ÚSMB2QueryDirectory_Response)rH   r  rU  ÚsearchStringÚresumeIndexÚinformationClassÚmaxBufferSizeÚenumRestartÚsingleEntryrG   ÚqueryDirectoryrA  rr  ÚqueryDirectoryResponserI   rI   rJ   r  ¶  s6   



þzSMB3.queryDirectoryc                 C   sD   |   ¡ }t|d< tƒ }||d< |  |¡}|  |¡}| t¡r dS d S )Nr  rñ   T)r    Ú	SMB2_ECHOÚSMB2Echor9  r@  r`  r   )rH   rG   ÚsmbEchorA  rr  rI   rI   rJ   ÚechoØ  s   


ÿz	SMB3.echoc                 C   s4   |   ¡ }t|d< ||d< tƒ }||d< |  |¡ d S )Nr  r  rñ   )r    r'  Ú
SMB2Cancelr9  )rH   rA  rG   Ú	smbCancelrI   rI   rJ   Úcancelâ  s   zSMB3.cancelr’   r“   c	                 C   s  || j d v du rttƒ‚|d u rd}n|| j d v du r!ttƒ‚|  ¡ }	t|	d< ||	d< tƒ }
||
d< ||
d< ||
d	< ||
d
< t|ƒ|
d< t|ƒdkrUd|
d< d|
d< n||
d< d|
d< ||
d
< ||
d< |
|	d< |  |	¡}|dkrtdS |  |¡}| 	t
¡rˆt|d ƒ}|d S d S )Nr€   Fu    Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿Ã¿r&   r  r  r*   ÚCtlCodeÚMaxInputResponseÚMaxOutputResponseÚ
InputCountr   ÚInputOffsetú rU  ÚOutputOffsetr  rñ   T)rž   rB   r   r    Ú
SMB2_IOCTLÚ	SMB2Ioctlr  r9  r@  r`  r   ÚSMB2Ioctl_Response)rH   r  rU  ÚctlCodeÚflagsÚ	inputBlobÚmaxInputResponseÚmaxOutputResponsera  rG   ÚsmbIoctlrA  rr  ÚsmbIoctlResponserI   rI   rJ   Úioctlì  s>   



þz
SMB3.ioctlc                 C   sˆ   || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< tƒ }||d< ||d< |  |¡}|  |¡}| t	¡rBdS d S )	Nr€   Fr&   r  r  r*   rñ   T)
rž   rB   r   r    Ú
SMB2_FLUSHÚ	SMB2Flushr9  r@  r`  r   )rH   r  rU  rG   ÚsmbFlushrA  rr  rI   rI   rJ   Úflush  s   


ÿz
SMB3.flushc           
      C   sÀ   || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< tƒ }||d< t|ƒ|d< ||d< d	 d
d„ |D ƒ¡|d< ||d< |  |¡}|  	|¡}| 
t¡r^t|d ƒ}	dS d S )Nr€   Fr&   r  r  r*   Ú	LockCountÚLockSequencer   c                 s   s   � | ]}t |ƒV  qd S rC   )Ústrr-  rI   rI   rJ   r/  8  r0  zSMB3.lock.<locals>.<genexpr>ÚLocksrñ   T)rž   rB   r   r    Ú	SMB2_LOCKÚSMB2Lockr  r—   r9  r@  r`  r   ÚSMB2Lock_Response)
rH   r  rU  ÚlocksÚlockSequencerG   ÚsmbLockrA  rr  ÚsmbFlushResponserI   rI   rJ   Úlock*  s&   


þz	SMB3.lockc                 C   sŠ   |   ¡ }t|d< tƒ }||d< |  |¡}|  |¡}| t¡rCd| jd< d| jd< d| jd< d| jd	< d| jd
< d| jd< d| jd< dS d S )Nr  rñ   r   r„   r   r,   r   Frƒ   r>   r�   r�   T)r    ÚSMB2_LOGOFFÚ
SMB2Logoffr9  r@  r`  r   rž   )rH   rG   Ú	smbLogoffrA  rr  rI   rI   rJ   ÚlogoffQ  s    









özSMB3.logoffc                 C   sò   || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< tƒ }	||	d< ||	d< ||	d< d	|	d
< ||	d< t|ƒdkrLd|	d< d|	d< n
t|ƒ|	d< ||	d< ||	d< |	|d< |  |¡}
|  |
¡}| 	t
¡rwt|d ƒ}|d S d S )Nr€   Fr&   r  r  r*   ÚInfoTypeÚFileInfoClasséÿÿ  rs  ÚAdditionalInformationr   ÚInputBufferOffsetr�  rU  ÚInputBufferLengthr  rñ   )rž   rB   r   r    ÚSMB2_QUERY_INFOÚSMB2QueryInfor  r9  r@  r`  r   ÚSMB2QueryInfo_Response)rH   r  rU  r”  ÚinfoTypeÚfileInfoClassÚadditionalInformationr“  rG   Ú	queryInforA  rr  ÚqueryResponserI   rI   rJ   rº  h  s4   



þzSMB3.queryInfoc                 C   s´   || j d v du rttƒ‚|| j d v du rttƒ‚|  ¡ }t|d< ||d< tƒ }||d< ||d< t|ƒ|d< ||d	< ||d
< ||d< ||d< |  |¡}	|  |	¡}
|
 	t
¡rXdS d S )Nr€   Fr&   r  r  r®  r¯  ÚBufferLengthr±  r*   rU  rñ   T)rž   rB   r   r    ÚSMB2_SET_INFOÚSMB2SetInfor  r9  r@  r`  r   )rH   r  rU  r”  r·  r¸  r¹  rG   ÚsetInforA  rr  rI   rI   rJ   r¿  ˆ  s(   


ÿzSMB3.setInfoc                 C   s    |   ¡ tkr| jd S | jd S ©Nr‰   r�   ©rï   r\  rž   rL   rI   rI   rJ   ÚgetSessionKey¡  s   

zSMB3.getSessionKeyc                 C   s(   |   ¡ tkr|| jd< d S || jd< d S rÀ  rÁ  )rH   ÚkeyrI   rI   rJ   ÚsetSessionKey§  s   zSMB3.setSessionKeyc              
   C   s.  |  dd¡}t |¡}t|ƒdkr|d dkr|dd … }|  dd¡}t |¡}t|ƒdkr:|d dkr:|dd … }|  |¡}d }zE|  ||tttB t	B dt
d¡}tƒ }d|d< d|d< | d	¡|d
< t|d
 ƒ|d< | j|||ttd� W |d ur€|  ||¡ |  |¡ dS |d ur‘|  ||¡ |  |¡ w )Nr%  r  r   r“   i    ÚReplaceIfExistsz        ÚRootDirectoryrê  r/   rt  )r·  r¸  T)r3  r4  r5  r  r  rR  ÚMAXIMUM_ALLOWEDÚFILE_SHARE_READÚFILE_SHARE_WRITEÚFILE_SHARE_DELETEÚ	FILE_OPENÚFILE_RENAME_INFORMATION_TYPE_2rÂ  r¿  ÚSMB2_0_INFO_FILEÚSMB2_FILE_RENAME_INFOrW  r$  )rH   r   ÚoldPathÚnewPathr  rU  Ú	renameReqrI   rI   rJ   Úrename°  s2   



üzSMB3.renamec           	      C   sp   d}|}|s4t |ƒdkr	 || S |d | jd … }|| jd d … }|  ||||t |ƒ¡}||7 }|r|| S )NFr   ri   )r  r�   rk  )	rH   r  rU  rÏ   r  ÚfinishedÚwriteOffsetÚ	writeDataÚwrittenrI   rI   rJ   Ú	writeFileÍ  s   üúzSMB3.writeFilec                 C   s   d|v S )Nú@GMT-rI   )rH   r  rI   rI   rJ   ÚisSnapshotRequestÙ  ó   zSMB3.isSnapshotRequestc                 C   sü   ||  d¡|  d¡d … }| |d¡}ddlm} t| |d¡|dddƒ  ¡ ƒ}|d	9 }|d
7 }tƒ }||d< tƒ }d|d< d|d< tdƒ|d< d|d< d|d< d|d< |d  d7  < |d  | 	¡ 7  < | |d¡ dd¡}|dkrz|d7 }||fS )NrØ  é   r   r   )r¯  z@GMT-%Y.%m.%d-%H.%M.%Si²  r“   i€–˜ l     }*{Gír=   ÚNextrb   Ú
NameOffsetÚTWrpr+  Ú
DataOffsetrõ   rö   s   TWrprU  s       r  r  r   )
Úindexr3  r¯  r¶  ÚstrptimeÚtotal_secondsÚSMB2_CREATE_TIMEWARP_TOKENÚSMB2CreateContextr  r  )rH   r  Ú	timestampr¯  ÚfTimeÚtokenÚctxrI   rI   rJ   ÚtimestampForSnapshotÝ  s*    zSMB3.timestampForSnapshotc                 C   sâ  d }|   |¡rg }|  |¡\}}| |¡ | dd¡}t |¡}t|ƒdkr2|d dkr2|dd … }|  |¡}d }z§| j|t 	|¡t
tB ttB tB ttB td|d�}d}g }	ddlm}
 	 zW| j||t |¡d	td
�}d}|dkr³|
 |
jj¡}| |¡ |	 |
 |d |d |d |d |d |d |d |d  d¡|d  d¡¡	¡ |d }||d … }|dksqW n tyÍ } z| ¡ tkrÃ‚ W Y d }~nd }~ww q]W |d urÚ|   ||¡ |  !|¡ |	S |d urë|   ||¡ |  !|¡ w )Nr%  r  r   r“   ©rI  r   ©ÚsmbTr°  )r|  r{  ÚCreationTimeÚLastAccessTimeÚLastWriteTimeÚLastChangeTimeÚ	EndOfFileÚAllocationSizeÚExtFileAttributesr/   rê  ÚNextEntryOffset)"rÙ  ré  r¹  r3  r4  r5  r  r  rR  r9  ÚFILE_READ_ATTRIBUTESÚFILE_READ_DATArÈ  rÉ  rÊ  ÚFILE_DIRECTORY_FILEÚFILE_SYNCHRONOUS_IO_NONALERTrË  Úimpacketrì  r  ÚbasenameÚFILE_FULL_DIRECTORY_INFORMATIONÚSMBFindFileFullDirectoryInfoÚSMBÚFLAGS2_UNICODEÚ
fromStringÚ
SharedFiler´  rB   rM   r   rW  r$  )rH   r   r  rÌ  rI  rè  r  rU  ÚresÚfilesrì  Ú
nextOffsetÚfileInfoÚerI   rI   rJ   ÚlistPathø  sr   



ÿÿ
ýÿ
ü÷€
€ýñ
üzSMB3.listPathc              
   C   s°   |  dd¡}t |¡}t|ƒdkr|d dkr|dd … }|  |¡}d }z#|  ||tttB t	B t
tB td¡}W |d urA|  ||¡ |  |¡ dS |d urR|  ||¡ |  |¡ w ©Nr%  r  r   r“   T)r3  r4  r5  r  r  rR  ÚGENERIC_ALLrÈ  rÉ  rÊ  r÷  rø  ÚFILE_CREATErW  r$  ©rH   r   rJ  rÌ  r  rU  rI   rI   rJ   Úmkdir,  s"   


ÿ
üz
SMB3.mkdirc              
   C   sè   |  dd¡}t |¡}t|ƒdkr|d dkr|dd … }|  |¡}d }z?| j||ttB tB t	t
B tB ttB tdd�}ddlm} | ¡ }d|d< | j|||td	� W |d ur]|  ||¡ |  |¡ dS |d urn|  ||¡ |  |¡ w )
Nr%  r  r   r“   )rA  rB  rC  rD  rE  rë  TÚDeletePending)r”  r¸  )r3  r4  r5  r  r  rR  ÚDELETErõ  ÚSYNCHRONIZErÊ  rÈ  rÉ  r÷  ÚFILE_OPEN_REPARSE_POINTrË  rù  rì  ÚSMBSetFileDispositionInfor¿  ÚSMB2_FILE_DISPOSITION_INFOrW  r$  )rH   r   rJ  rÌ  r  rU  rì  Ú
delete_reqrI   rI   rJ   Úrmdir@  s.   


ý
üz
SMB3.rmdirc              
   C   s¬   |  dd¡}t |¡}t|ƒdkr|d dkr|dd … }|  |¡}d }z!|  ||ttB tt	t
B td¡}W |d ur?|  ||¡ |  |¡ dS |d urP|  ||¡ |  |¡ w r  )r3  r4  r5  r  r  rR  r  rõ  rÊ  ÚFILE_NON_DIRECTORY_FILEÚFILE_DELETE_ON_CLOSErË  rW  r$  r
  rI   rI   rJ   ÚremoveZ  s   

 
üzSMB3.removec              
   C   sŠ  d }|   |¡rg }|  |¡\}}	| |	¡ | dd¡}t |¡}t|ƒdkr2|d dkr2|dd … }|  |¡}
d }ddlm	} zu| j
|
|t|t|d|d�}|  |
|¡}| |¡}|d }|| | jd k rz|| dkry|  |
|||| ¡}||ƒ n)d}|| }||k r£|  |
||| jd ¡}|t|ƒ7 }|t|ƒ7 }||ƒ ||k s„W |d ur®|  |
|¡ |  |
¡ d S |d ur¿|  |
|¡ |  |
¡ w )	Nr%  r  r   r“   rë  rê  rñ  rh   )rÙ  ré  r¹  r3  r4  r5  r  r  rù  rì  rR  rö  r  rº  ÚSMBQueryFileStandardInfor�   r_  rW  r$  )rH   r   r  ÚcallbackÚmoder  rÌ  ÚshareAccessModerI  rè  r  rU  rì  r  r  ÚfileSizerÏ   rÖ  ÚtoBeReadrI   rI   rJ   ÚretrieveFilem  sJ   




€ü€þzSMB3.retrieveFilec              
   C   sî   |  dd¡}t |¡}t|ƒdkr|d dkr|dd … }|  |¡}d }	zB|  ||t|t|d¡}	d}
|}|
sU|| jd ƒ}t|ƒdkrDn|  	||	||t|ƒ¡}||7 }|
r6W |	d ur`|  
||	¡ |  |¡ d S |	d urq|  
||	¡ |  |¡ w )Nr%  r  r   r“   Fri   )r3  r4  r5  r  r  rR  ÚFILE_WRITE_DATAr  r�   rk  rW  r$  )rH   r   r  r  r  r  rÌ  r  r  rU  rÓ  rÔ  rÏ   rÖ  rI   rI   rJ   Ú	storeFile•  s0   

û€þzSMB3.storeFilerˆ  c              	   C   sˆ   t  |¡}|| jd v du rttƒ‚t|ƒdkrttƒ‚tƒ }|d |d< | d¡|d< t|d ƒ|d< d	|d
< | j|d t	t
|ddd�S )Nr€   Fr°  i † ÚTimeoutrê  ÚNamer+  r“   ÚTimeoutSpecifiedr   )r“  r”  r•  r–  )r4  rú  rž   rB   r   r  ÚFSCTL_PIPE_WAIT_STRUCTURErÂ  r™  ÚFSCTL_PIPE_WAITÚSMB2_0_IOCTL_IS_FSCTL)rH   r  Úpipenamer¼   ÚpipeWaitrI   rI   rJ   ÚwaitNamedPipe­  s   
zSMB3.waitNamedPipec                 C   s&   t ƒ }| jd |d< | jd |d< |S )Nrh   ri   )Údictr�   )rH   r  rI   rI   rJ   ÚgetIOCapabilities½  s   zSMB3.getIOCapabilitiesc                 C   s   | j r| j  ¡  d | _ d S d S rC   )r¢   rW  rL   rI   rI   rJ   Úclose_sessionß  s   

þzSMB3.close_sessionc                 C   ó   dS ©NTrI   rL   rI   rI   rJ   ÚdoesSupportNTLMv2ä  ó   zSMB3.doesSupportNTLMv2c                 C   r,  r-  rI   rL   rI   rI   rJ   Úis_login_requiredè  r/  zSMB3.is_login_requiredc                 C   rÕ   )Nrk   rÝ   rL   rI   rI   rJ   Úis_signing_requiredì  rØ   zSMB3.is_signing_requiredc                 C   sÂ   t |ƒdkr|d dkr|dd … }|d urFddlm} |j| ¡ d�}| |d ¡}|  |||d |d |d	 |d
 |d |d |d ¡	S |  ||ttB t	B t
B tB tB tB tB ttB ttd¡S )Nr   r  r“   rë  )rÏ   Ú
ParametersÚ
AccessMaskr)  r*  ÚDispositionr9   ÚImpersonationr&  )r  rù  rì  Ú
SMBCommandr  ÚSMBNtCreateAndX_ParametersrR  rö  r  ÚFILE_APPEND_DATAÚFILE_READ_EAÚFILE_WRITE_EAÚFILE_WRITE_ATTRIBUTESrõ  ÚREAD_CONTROLrÈ  rÉ  r  rË  )rH   r  r@  Ú
smb_packetÚcmdrì  ÚntCreateÚparamsrI   rI   rJ   Únt_create_andxï  s,   þÿÿÿÿýzSMB3.nt_create_andxc                 C   s
   | j  ¡ S rC   )r¢   rÅ  rL   rI   rI   rJ   rÅ    rØ   zSMB3.get_socketc                 C   s   |   ||||t|ƒ¡S rC   )rk  r  )rH   ÚtidÚfidrÏ   r  Úwait_answerÚwrite_pipe_moder=  rI   rI   rJ   Ú
write_andx  s   zSMB3.write_andxc              	   C   s   | j ||tt|d||B d�S )Nr°  )r–  ra  )r™  ÚFSCTL_PIPE_TRANSCEIVEr%  )rH   rB  rC  rÏ   ÚnoAnswerra  r  rI   rI   rJ   ÚTransactNamedPipe	  s   zSMB3.TransactNamedPipec                 C   s*   |   ¡ }| t¡rt|d ƒ}|d S d S )Nrñ   rU  )r@  r`  r   r‘  )rH   rr  r˜  rI   rI   rJ   ÚTransactNamedPipeRecv  s
   
þzSMB3.TransactNamedPipeRecvc                 C   s$   |d u r	| j d }|  |||||¡S )Nrh   )r�   r_  )rH   rB  rC  r  Úmax_sizerD  r=  rI   rI   rJ   Ú	read_andx  s   
zSMB3.read_andxc                 C   s   t tƒ‚rC   )rB   r   rL   rI   rI   rJ   Úlist_shared  rÚ  zSMB3.list_sharedc              	   C   sP   t |ƒdkr|d dkr|dd … }|  ||||t|d¡}|ddddddddf	S )Nr   r  r“   )r  rR  r  )rH   rB  r@  Ú	open_modeÚdesired_accessrU  rI   rI   rJ   Ú	open_andx  s   zSMB3.open_andxc                 C   s"   || j d< d| j d< d| j d< d S )Nr�   Tr�   rƒ   rÖ   )rH   Ú
signingKeyrI   rI   rJ   Úset_session_key&  s   

zSMB3.set_session_keyc                 C   s   || _ || _|| _d S rC   )r¥   r¦   r§   )rH   ÚvalidateÚaccept_emptyÚhostnamerI   rI   rJ   Úset_hostname_validation+  s   
zSMB3.set_hostname_validationc                 C   sˆ   | j d dkr| js|  d¡‚d S | j d  ¡ | j ¡ kr@| j d  ¡ | j ¡ krB|  d| j ¡ | j d  ¡ | j d  ¡ f ¡‚d S d S )Nrl   r   zLHostname was not supplied by target host and absent validation is disallowedr�   z?Supplied hostname %s does not match reported hostnames %s or %s)rž   r¦   rV   Úlowerr§   rL   rI   rI   rJ   rô  0  s   
0"ÿÿz SMB3.perform_hostname_validationrC   )NN)r   r   r   r   r   NNF)r   r   r   )r   r   T)Nr’   r   r   NNr“   )r   )rˆ  )r   r“   FN)r   r“   r   )r   Nr“   N)nrR   rS   rT   rD   rV   r
   ÚTYPE_SERVERrE   rÆ   r+  r3  rÔ   r×   rÙ   rÚ   rÜ   rÞ   rß   rà   rá   râ   rä   ræ   rè   rê   rë   r   rî   rï   r  r  r9  r@  r¶   rt  rç  r  r  r$  ÚSMB2_IL_IMPERSONATIONÚSMB2_OPLOCK_LEVEL_NONErR  rW  r_  rk  ÚFILENAMES_INFORMATIONr  r„  r‡  r™  r�  r©  r­  rÍ  ÚSMB2_FILE_STANDARD_INFOrº  r¿  rÂ  rÄ  rÒ  r×  rÙ  ré  r  r  r  r  rË  rÈ  r  ÚFILE_OVERWRITE_IFr  r(  r*  Úget_server_nameÚget_client_nameÚget_server_domainÚget_server_dns_domain_nameÚget_server_dns_host_nameÚget_remote_nameÚset_remote_nameÚget_remote_hostÚget_server_osÚget_server_os_majorÚget_server_os_minorÚget_server_os_buildÚtree_connect_andxÚtree_connectÚconnect_treeÚdisconnect_treeÚset_timeoutÚuse_timeoutÚ	stor_fileÚ	retr_fileÚ	list_pathr+  r.  r0  r1  rA  rÅ  rF  rI  rJ  rL  rM  rP  rR  rV  rô  rI   rI   rI   rJ   rU   º   sÎ    

ÿ 	

@
2 
 
~ N:e

*."


)
' 	


4

(




rU   )9Ú
__future__r   r   r±   r4  rZ   r\   rú   Úsixr   r   Úbinasciir   Ú
contextlibr   Úpyasn1.type.univr   ÚCryptodome.Cipherr	   rù  r
   r   r   r   Úimpacket.smb3structsÚimpacket.nt_errorsr   r   r   r   r   r   r   Úimpacket.spnegor   r   r   r   r   r   Úimpacket.krb5.gssapir   r  r  r  ÚSystemRandomr  ÚNotImplementedErrorr  r6  r?  ÚREQUESTÚCHANNELrõ  rD   rB   rU   rI   rI   rI   rJ   Ú<module>   sB   $ þõüÿþýüûúùø	÷
öóòñðïîíýþÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Õ/