o
    j                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZmZ d dlmZmZmZ d dlmZ d dlmZmZ d dlmZm Z  d dl!m"Z"m#Z# d dl$m%Z%m&Z&m'Z'm(Z( d d	l$m)Z* d d
l+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV eWeXZYdZZdZ[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd  Zcd!d" Zdd#d$ Zed%d& ZfdWd'd(Zgd)d* Zhd+d, Zide%jjjkfd-d.Zle%jjjkd/fd0d1Zmd2d3 Znd4d5 Zod6d7 ZpG d8d9 d9ZqG d:d; d;ZrG d<d= d=ZsG d>d? d?ZtG d@dA dAZuG dBdC dCZvG dDdE dEe jwZxG dFdG dGe jye jzZ{dHZ|dIZ}d dJl~mZ d dKlmZ d dLlmZmZmZmZmZmZmZ d dMlmZmZ d dNlmZ G dOdP dPeZG dQdR dReZG dSdT dTZG dUdV dVZdS )X    N)	unhexlifyhexlifya2b_hex)epmnrpc	transport)rpcrt)b
ensure_str)configparsersocketserver)encoderdecoder)smbnmbntlmuuid)smb3structs)SPNEGO_NegTokenInit	TypesMech	MechTypesSPNEGO_NegTokenRespASN1_AIDASN1_SUPPORTED_MECH)AP_REPAuthenticatorEncAPRepPartEncTicketPartGSSAPIHeader_KRB5_AP_REQ)	constants)Key_enctype_tableInvalidChecksumgenerate_kerberos_keys)STATUS_NO_MORE_FILESSTATUS_NETWORK_NAME_DELETEDSTATUS_INVALID_PARAMETERSTATUS_FILE_CLOSEDSTATUS_MORE_PROCESSING_REQUIREDSTATUS_OBJECT_PATH_NOT_FOUNDSTATUS_DIRECTORY_NOT_EMPTYSTATUS_FILE_IS_A_DIRECTORYSTATUS_NOT_IMPLEMENTEDSTATUS_INVALID_HANDLESTATUS_OBJECT_NAME_COLLISIONSTATUS_NO_SUCH_FILESTATUS_CANCELLEDSTATUS_OBJECT_NAME_NOT_FOUNDSTATUS_SUCCESSSTATUS_ACCESS_DENIEDSTATUS_NOT_SUPPORTEDSTATUS_INVALID_DEVICE_REQUESTSTATUS_FS_DRIVER_REQUIREDSTATUS_INVALID_INFO_CLASSSTATUS_LOGON_FAILURESTATUS_OBJECT_PATH_SYNTAX_BADSTATUS_END_OF_FILEi [ i  c                 C   
   t | S N)r   	POSIXtoFTt r@   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/smbserver.pygetFileTimeR      
rB   c                 C   r;   r<   )r   	FTtoPOSIXr>   r@   r@   rA   getUnixTimeU   rC   rE   c              
   C   s  t | d|d d|}t | d|d d|}|d d d }	|d dd  }
t |||
 }|d }t ||	}|d }|d t j@ dkrP|d	t jA M }|d t j@ dkr`|d	t jA M }|d t j@ dkrp|d	t jA M }|d t j@ dkr|d	t jA M }|d t j	@ dkr|d	t j	A M }|d t j
@ dkr|d	t j
A M }t |d |||d
 d||d}|d t j@ r|d }t ||}nd }|}|	|krt|fS t|fS )N domain_nameutf-16ler      lanmanflagsr       	challengeTsession_key)r   NTOWFv2decodeLMOWFv2hmac_md5*NTLMSSP_NEGOTIATE_EXTENDED_SESSIONSECURITYNTLMSSP_NEGOTIATE_128NTLMSSP_NEGOTIATE_KEY_EXCHNTLMSSP_NEGOTIATE_SEALNTLMSSP_NEGOTIATE_SIGNNTLMSSP_NEGOTIATE_ALWAYS_SIGNKXKEYgenerateEncryptedSessionKeyr2   r8   )identitylmhashnthashserverChallengeauthenticateMessagentlmChallengetype1responseKeyNTresponseKeyLM
ntProofStrtempntProofStr2lmChallengeResponsesessionBaseKeyresponseFlagskeyExchangeKeyexportedSessionKeyencryptedRandomSessionKeyr@   r@   rA   computeNTLMv2X   s@   rm   c                 C   s  d}t | tur| d} zTt|dkr?d|d|dt| dt|dd d t| dd  f dd}W |S d|d|dt|dt|dt|  f d	d}W |S    zSt|dkrd|d|dt| dt|d d dt|dd  df dd}nd||t|dt|dt| df d	d}W Y |S W Y |S  ty } zd
d l}|  t	d|  W Y d }~Y |S d }~ww )NrF   zlatin-1   z%s::%s:%s:%s:%srH       ntlmv2)hash_stringhash_versionr   r   zoutputToJohnFormat: %s)
typebytesrP   lenr   	Exception	traceback	print_excLOGerror)rM   usernamedomain
lmresponse
ntresponse	ret_valueerw   r@   r@   rA   outputToJohnFormat   s^   

(
	r   c                 C   s   t j|}|dkr|d d |d  }n
|d d |d  }t|d}||  |d W d    d S 1 s:w   Y  d S )Nrp   r   _ntlmv2   _ntlma
)ospathsplitextopenwrite)rq   rr   	file_namefn_dataoutput_filenamefr@   r@   rA   writeJohnOutputToFile   s   
"r   c                 C   s   | t jj@ r|dS |S )NrH   )r   SMBFLAGS2_UNICODErP   rK   textr@   r@   rA   decodeSMBString   s   
r   c                 C   s    | t jj@ r|dS |dS )NrH   ascii)r   r   r   encoder   r@   r@   rA   encodeSMBString   s   

r   c                 C   s$   t j| }t|j|j|j S r<   )	datetimedatefromtimestampr   SMB_DATEyearmonthdaypackr?   dr@   r@   rA   
getSMBDate      r   c                 C   s$   t j | }t|j|j|j S r<   )r   r   r   SMB_TIMEhourminutesecondr   r   r@   r@   rA   
getSMBTime   r   r   c                 C   s@   |  }| }||d= i }|D ]}t||||< q|S )Nglobal)getServerConfigsectionsindexdictitems)connId	smbServerconfigr   sharesir@   r@   rA   	getShares   s   r   c                 C   s,   t |}| }||rt||S d S r<   )r
   r   has_sectionr   r   )r   sharer   r   r@   r@   rA   searchShare   s
   
r   c                 C   sX   t j| dd} t| dkr*| d dks| d dkr*|du s$|dkr*| dd } | S )aa  Normalizes a path by replacing "" with "/" and stripping potential
    leading "/" chars. If a path is provided, only strip leading '/' when
    the path is empty.

    :param file_name: file name to normalize
    :type file_name: string

    :param path: path to normalize
    :type path: string

    :return normalized file name
    :rtype string
    \/r   NrF   r   )r   r   normpathreplaceru   )r   r   r@   r@   rA   normalize_path   s
   $r   c                 C   s6   t j| |}t j| }t jt j||f|kS )aK  Validates if a provided file name path is inside a path. This function is used
    to check for path traversals.

    :param path: base path to check
    :type path: string
    :param file_name: file name to validate
    :type file_name: string

    :return whether the file name is inside the base path or not
    :rtype bool
    )r   r   joinrealpathcommonprefix)r   r   	path_nameshare_real_pathr@   r@   rA   isInFileJail	  s   r   c              
   C   sN  t |}tj| |}d}d}t| |s!td t}d|||fS |d@ r)tj}ntj	|dur9t
}d|||fS tj|rN|tj@ dkrNt}d|||fS |d@ dkrZ|tjO }n|d@ dkrf|tjO }ntj}ztjdkrt|tjO }|rytj}t||}	W n  ty }
 ztd	||f |
 d}	t}W Y d }
~
nd }
~
ww |	|||fS )
Nr   %Path not in current working directoryrI   T   r      win32zopenFile: %s,%s)r   r   r   r   r   ry   rz   r9   O_CREATexistsr/   isdirr   ATTR_DIRECTORYr+   O_WRONLYO_RDWRO_RDONLYsysplatformO_BINARYr   rv   r3   )r   fileName
accessModefileAttributesopenModereadOnlypathName	errorCodemodefidr   r@   r@   rA   openFile  sD   



r   c              
   C   s  |t jj@ r	d}nd}t|}tj| |}tj|}t|\
}}	}
}}}}}}}|d u rP|}d}tj	|r>|t j
O }tj|rI|t jO }|}|||fS |t jksZ|tjkr}t  }t jt jB |d< d|d< tdd |d	< dd|d
< | S |t jkrt j|d}d||d< | S |t jks|tjkrt  }d|d< t ||d< | S |t jkrt  }| S |t jks|tjkrt   }t j!|d< | S |t j"krt # }| S |t j$krt % }| S d S )NrH   r   r   FileSystemAttributes   MaxFilenNameLengthInBytesXTFSr   LengthOfFileSystemNameFileSystemNamerK   SHAREVolumeLabelrF   VolumeCreationTime
DeviceType)&r   r   r   r   r   r   r   getsizestatr   SMB_FILE_ATTRIBUTE_DIRECTORYisfileSMB_FILE_ATTRIBUTE_NORMALSMB_QUERY_FS_ATTRIBUTE_INFOsmb2SMB2_FILESYSTEM_ATTRIBUTE_INFOSMBQueryFsAttributeInfoFILE_CASE_SENSITIVE_SEARCHFILE_CASE_PRESERVED_NAMESru   r   getDataSMB_INFO_VOLUMESMBQueryFsInfoVolumeSMB_QUERY_FS_VOLUME_INFOSMB2_FILESYSTEM_VOLUME_INFOSMBQueryFsVolumeInfor=   SMB_QUERY_FS_SIZE_INFOSMBQueryFsSizeInfoSMB_QUERY_FS_DEVICE_INFOSMB2_FILESYSTEM_DEVICE_INFOSMBQueryFsDeviceInfoFILE_DEVICE_DISKFILE_FS_FULL_SIZE_INFORMATIONSMBFileFsFullSizeInformationFILE_FS_SIZE_INFORMATIONFileFsSizeInformation)r   filenamelevelpktFlagsencodingr   r   fileSizer   inodevnlinkuidgidsizeatimemtimectimelastWriteTimeattribsr   datar@   r@   rA   queryFsInformationI  s\   







r  Fc                 C   sx  |t jj@ r	d}nd}t|}tj| |}t| |s%t	d g dt
fS g }|ddkr8|ddkr8d}	ntj|}	tj|}
|	dkr\|tj|
d	 |tj|
d
 |	dkrtj|
skd dtfS t|
D ])}t| |	 rtj|
|}tj|r|t j@ r|| qp|| qpntj|r|| g }t|}t}|D ]}|t jks|tjkrt j|d}nt|t jks|tjkrt j|d}nc|t jks|tj krt j!|d}nR|t j"krt j#|d}nF|t j$ks|tj%krt j&|d}n4|t j'ks|tj(krt j)|d}n!|t j*ks#|tj+kr*t j,|d}nt	d|  ||t-f  S t.|\
}}}}}}}}}}tj|rTt j|d< nt j/t j0B |d< tj|1||d< |t jtjt j'tj(fv rd|d< ||d< ||d< t 2||d< t 2||d< t 2||d< t 2||d< d|d< tj|1||d< dt|d  d }t|| |d< n|t jtjfv r	||d< ||d< t 2||d< t 2||d< t 2||d< t 2||d< tj|1||d< dt|d  d }t|| |d< n|t jt j$tj tj%fv rQd|d< ||d< ||d< t 2||d< t 2||d< t 2||d< t 2||d< dt|d  d }t|| |d< nJ|t j"kr||d< t3||d< t4||d< t3||d< t4||d< t3||d< t4||d< n|t j*tj+fv rdt|d  d }t|| |d< || q|t jks|du r|dkrd|d d< |||fS )NrH   r   r   r   *?rF   .z..r   zWrong level %d!ExtFileAttributesFileNameEaSize	EndOfFileAllocationSizeCreationTimeLastAccessTimeLastWriteTimeLastChangeTimez                        	ShortName   NextEntryOffsetCreationDateLastAccessDateLastWriteDateT)5r   r   r   r   r   r   r   r   ry   rz   r9   findbasenamedirnameappendr   r1   listdirfnmatchlowerr   r   ru   r2   !SMB_FIND_FILE_BOTH_DIRECTORY_INFOr   SMB2_FILE_BOTH_DIRECTORY_INFOSMBFindFileBothDirectoryInfoSMB_FIND_FILE_DIRECTORY_INFOSMB2_FILE_DIRECTORY_INFOSMBFindFileDirectoryInfo!SMB_FIND_FILE_FULL_DIRECTORY_INFOSMB2_FULL_DIRECTORY_INFOSMBFindFileFullDirectoryInfoSMB_FIND_INFO_STANDARDSMBFindInfoStandard$SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO SMB2_FILE_ID_FULL_DIRECTORY_INFOSMBFindFileIdFullDirectoryInfo$SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO SMB2_FILE_ID_BOTH_DIRECTORY_INFOSMBFindFileIdBothDirectoryInfoSMB_FIND_FILE_NAMES_INFOSMB2_FILE_NAMES_INFOSMBFindFileNamesInfor4   r   ATTR_NORMALATTR_ARCHIVEr   r=   r   r   )r   r   r  searchAttributesr  isSMB2r  r   filespatterndirNamefileentrysearchResultsearchCountr   r   itemr   r  r  r	  r
  r  r  r  r  r  padLenr@   r@   rA   
findFirst2  s   






	




 
rO  c                 C   s   t | ||S r<   )queryPathInformation)r   r  r  r@   r@   rA   queryFileInformation     rQ  c              
   C   sH  zd}t || }tj| |}t| |std d tfW S tj|rt	|\
}}}}	}
}}}}}tj
|r?tj}ntjtjB }|tjkrpt }t||d< t||d< t||d< t||d< ||d< n|tjkrt }t||d< t||d< t||d< t||d< ||d	< n|tjkrt }||d
< ||d< tj
|rd|d< nd|d< n|tjkrt }||d
< ||d< d|d< tj
|rd|d< nd|d< n|tjkr0t }t||d< t||d< t||d< t||d< ||d< ||d
< ||d< tj
|r#d|d< nd|d< |d|d< nU|tjkrt }t |d< t |d< t |d< t |d< t  |d< t! |d< t" |d< t# |d< t$ |d< t||d d< t||d d< t||d d< t||d d< tj
|rtj%|d d	< d|d d< tj|d d< ntj&tj'B |d d	< d|d d< tjtjB |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< t(|d|d d!< np|tj)krHt* }t||d< t||d< t||d< t||d< ||d
< ||d< ||d	< n=|tj+ksT|tj,krYt- }n,|tj.kse|tj/krjt0 }n|tj1kryt2 }||d	< ntd"|  d t3fW S ||fW S d t4fW S  t5y } ztd#|   d }~ww )$Nr   r   r  r  r  r   r  
ChangeTimeFileAttributesr  r  r   	DirectoryNumberOfLinksrH   r  BasicInformationStandardInformationInternalInformationEaInformationAccessInformationPositionInformationModeInformationAlignmentInformationNameInformationr  DeletePendingIndexNumberAccessFlagsCurrentByteOffsetr   AlignmentRequirementFileNameLengthz'Unknown level for query path info! 0x%xzqueryPathInfo: %s)6r   r   r   r   r   ry   rz   r9   r   r   r   r   r   rB  rC  SMB_QUERY_FILE_BASIC_INFOSMBQueryFileBasicInfor=   r   SMB2_FILE_BASIC_INFOFILE_BASIC_INFORMATIONSMB_QUERY_FILE_STANDARD_INFOSMBQueryFileStandardInfoSMB2_FILE_STANDARD_INFOFILE_STANDARD_INFORMATIONSMB_QUERY_FILE_ALL_INFOSMBQueryFileAllInfor   SMB2_FILE_ALL_INFOFILE_ALL_INFORMATIONFILE_INTERNAL_INFORMATIONFILE_EA_INFORMATIONFILE_ACCESS_INFORMATIONFILE_POSITION_INFORMATIONFILE_MODE_INFORMATIONFILE_ALIGNMENT_INFORMATIONFILE_NAME_INFORMATIONr   r   SMB_FILE_ATTRIBUTE_ARCHIVEru   SMB2_FILE_NETWORK_OPEN_INFOSMBFileNetworkOpenInfoSMB_QUERY_FILE_EA_INFOSMB2_FILE_EA_INFOSMBQueryFileEaInfoSMB_QUERY_FILE_STREAM_INFOSMB2_FILE_STREAM_INFOSMBFileStreamInformationSMB2_ATTRIBUTE_TAG_INFOFILE_ATTRIBUTE_TAG_INFORMATIONr4   r1   rv   )r   r  r  r   r   r   r   r  r  r	  r
  r  r  r  r  r  r   
infoRecordr   r@   r@   rA   rP    s   















rP  c                 C   s   d}d}||fS )N  r@   )r   
totalUnits	freeUnitsr@   r@   rA   queryDiskInformation  s   r  c                   @   s   e Zd ZdddZdS )NTTRANSCommandsr   c                 C   s   d S r<   r@   )selfr   r   
recvPacket
parametersr  maxDataCountr@   r@   rA   default  s   zNTTRANSCommands.defaultNr   )__name__
__module____qualname__r  r@   r@   r@   rA   r    s    r  c                   @   s(   e Zd ZedddZedddZdS )TRANSCommandsr   c                 C   s2  | | }d}d}d}	t}
td|d d d dkrt|}|d dkrt| |}t }t||d< t||d< d	}|D ]C}t	 }|d
dt|   |d< t
|| d |d< dt| t| |d< |	| 7 }	d|| v r~||| d d
 7 }q?|d
7 }q?|	|7 }	nt}
ntd|d d d dkrt }t }| |d< | }	t|	|d< n[td|d d d dkrt|}t }t| |}||d   }t	 }|d  d
 |d< t
|d |d< | }	d|v rt|	|d< |	|d d
 7 }	t|	|d< nt}
|| | |||	|
fS )N    <Hr   r   	InfoLevelr   EntriesReturnedEntriesAvailablerF       NetworkName
share typeType   RemarkOffsetLowcomment
ServerNameTotalBytesAvailable	ShareName)getConnectionDatar2   structunpackr   SMBNetShareEnumr   SMBNetShareEnumResponseru   NetShareInfo1intr   r4   SMBNetServerGetInfoResponseSMBNetServerInfo1getServerNameSMBNetShareGetInfoSMBNetShareGetInfoResponseuppersetConnectionData)r   r   r  r  r  r  connData	respSetuprespParametersrespDatar   netShareEnumr   tailDatar   rJ  netServerInforequestr   	shareInfor@   r@   rA   lanMan  s\   







zTRANSCommands.lanManc                 C   s   | | }d}d}d}	t}
t|d d }t|d }td|d dd  d }||d v r]|d | d	 }|tkrJt	|| t
||}	n|d | d
 }|| ||}	nt}
|| | |||	|
fS )Nr  Datar   
Parametersr  Setupr   OpenedFiles
FileHandleSocket)r  r2   r   
SMBCommandSMBTransaction_Parametersr  r  PIPE_FILE_DESCRIPTORr   r   readsendrecvr-   r  )r   r   r  r  r  r  r  r  r  r  r   r  transParametersr   
fileHandlesockr@   r@   rA   transactNamedPipe  s&   

zTRANSCommands.transactNamedPipeNr  )r  r  r  staticmethodr  r  r@   r@   r@   rA   r    s
    ?r  c                   @   sj   e Zd ZedddZedddZedddZeddd	Zedd
dZedd Z	edd Z
dS )TRANS2Commandsr   c                 C   sp  | | }d}d}d}	t}
tj|d |d}|d |d v r|d |d  d }tt|d |d |}tj||}t	||rJ|j
d|d	 t}
nWtj|r|d
 }|tjkrt|}|d }|dkrid}nt|}|d }|dkryd}nt|}|dks|dkrt|||f n|j
d|d
  tj|d	 t}
nt}
|
tkrt }nt}
|| | |||	|
fS )Nr  Flags2rK   r  TidConnectedSharesr   r  r   r  InformationLevelr  r   r  r  z%Unknown level for set path info! 0x%x)r  r2   r    SMBSetPathInformation_Parametersr   r   r   r   r   r   logr9   r   SMB_SET_FILE_BASIC_INFOSMBSetFileBasicInforD   utimeloggingERRORr4   r1   (SMBSetPathInformationResponse_ParametersSTATUS_SMB_BAD_TIDr  )r   r   r  r  r  r  r  r  r  r  r   setPathInfoParametersr   r   r   informationLevelr  r  r  r@   r@   rA   setPathInformation  sN   





z!TRANS2Commands.setPathInformationc                 C   s  | | }d}d}d}	t}
t|}|d |d v r|d |d v r|d |d  d }|d }|tjkrOt|}|d d	krNd
|d |d  d< t }nq|tjkrt|}|d }|d	krdd}nt	|}|d }|d	krtd}nt	|}t
|||f n>|tjkr|d |d  d }t|}|d d	krt
||d d d	 t
|d n|jd|d  tj|d t}
nt}
|
tkrt }nt}
|| | |||	|
fS )Nr  r  r  FIDr  r  r  r`  r   TDeleteOnCloser  r  r  r  r  r       %Unknown level for set file info! 0x%xr  )r  r2   r    SMBSetFileInformation_ParametersSMB_SET_FILE_DISPOSITION_INFOSMBSetFileDispositionInfo(SMBSetFileInformationResponse_Parametersr  r  rD   r   r  SMB_SET_FILE_END_OF_FILE_INFOSMBSetFileEndOfFileInfolseekr   r  r  r  r4   r/   r  r  )r   r   r  r  r  r  r  r  r  r  r   setFileInfoParametersr   r  r  r  r  r  r@   r@   rA   setFileInformation/  sZ   









z!TRANS2Commands.setFileInformationc                 C   s   | | }d}d}d}	t|}
|d |d v rJ|
d |d v rG|d |
d  d }ttj|tj||
d \}}|d urFt }|}	nt	}nt
}|| | |||	|fS )Nr  r  r  r  r  r  r  )r  r   "SMBQueryFileInformation_ParametersrQ  r   r   r)  r(  *SMBQueryFileInformationResponse_Parametersr-   r  r  )r   r   r  r  r  r  r  r  r  r  queryFileInfoParametersr   r  r   r@   r@   rA   rQ  h  s&   

z#TRANS2Commands.queryFileInformationc              
   C   s   | | }d}d}d}	d}
tj|d |d}|d |d v rd|d |d  d }zt|t|d |d |d	 \}}
W n tyX } z|jd
| tj|d W Y d }~nd }~ww |d urct	 }|}	nt
}
|| | |||	|
fS )Nr  r   r  r  r  r  r   r  r  zqueryPathInformation: %sr  )r  r   "SMBQueryPathInformation_ParametersrP  r   rv   r  r  r  *SMBQueryPathInformationResponse_Parametersr  r  )r   r   r  r  r  r  r  r  r  r  r   queryPathInfoParametersr   r  r   r@   r@   rA   rP    s2   
"z#TRANS2Commands.queryPathInformationc                 C   sf   | | }d}|d |d v r't|d |d  d dtd|d |d d}|| | d	d	||fS )
Nr   r  r  r   rF   r  r  r  r  )r  r  r  r  r  )r   r   r  r  r  r  r  r   r@   r@   rA   r    s   
z!TRANS2Commands.queryFsInformationc                 C   s8  | | }d}d}d}	t}
tj|d |d}|d }|d |d v r||d v r|d | }t }d}d}d	}t|D ]<}|d  }t|}|| |ksX|d	 d |d
 krld	}||d	 d  |d |< ||d<  n|d7 }|	|7 }	||7 }q<|d	kr|d |= ||d< ||d
< nt}
nt	}
|
| | |||	|
fS )Nr  r  r  SIDr  r  SIDsr   r   SearchCountLastNameOffsetEndOfSearch)r  r2   r   SMBFindNext2_ParametersSMBFindNext2Response_Parameters	enumerater   ru   r-   r  r  )r   r   r  r  r  r  r  r  r  r  r   findNext2ParameterssidrK  endOfSearchrL  	totalDatar   lenDatar@   r@   rA   	findNext2  sB   
 


zTRANS2Commands.findNext2c                 C   s  | | }d}d}d}	tj|d |d}
|d |d v r|d |d  d }t|t|d |
d |
d |
d	 |d d
\}}}|dkrt }d}d}d}d}t|D ]c}|d  }t|}|| |kso|d d |
d krd}t|d dkr|d}nt	|d 
 d d }||d d  |d |< ||d<  n|d7 }|	|7 }	d|d  d }|	d| 7 }	||| 7 }qS||d< ||d< ||d< n	|dkrt}nt}|| | |||	|fS )Nr  r  r  r  r  r   r  r  SearchAttributesr  r   r      r  r  r  r  r"     r  r  )r  r   SMBFindFirst2_ParametersrO  r    SMBFindFirst2Response_Parametersr  r   ru   listkeysr/   r  r  )r   r   r  r  r  r  r  r  r  r  findFirst2Parametersr   rK  rL  r   r  r  r  r   r   rN  r@   r@   rA   rO    s\   
 
zTRANS2Commands.findFirst2Nr  )r  r  r  r  r  r  rQ  rP  r  r  rO  r@   r@   r@   rA   r    s    48
/r  c                   @   sD  e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 Zed1d2 Zed3d4 Zd5S )6SMBCommandsc              
   C   s  | | }t|d }t|d }|d |d krtdtj|d d}|d }	|	|d< |d	 }
|
|d
< ||d  |d dkr[|d d |d  }|d |||	  |d< nd|d< |d dkr||d d |d  }|d |||
  |d< nd|d< |d dkrt|d |d }nt	d|d d d d }||v r=d}d}d}z|| | |||d |d |d \}}}}W n! ty } z|j
d||f tj|d t}W Y d }~nd }~ww |dkr|dkr|dkrd}d}nZt|dr| }t|}t|dr| }t|}g }d}|dks|dkr2t|d }t }t }t||d< t||d< t||d< t||d< ||d< t||d kretdt||d f  |d |d	< nt||d	< |d	 |d
< t||d< ||d< t|dkrd d!t| d   d  }d"| }||d#< d!t| | |d< n
d}d|d< d|d#< t|dkrd d!t| | t| d   d  }d"| |d$< d!t| | t| | |d< nd|d< d|d$< |d |d  |d< |d |d	  |d< ||d< ||d< ||d	 d  }||d	 8 }||d	 d% 7 }||d d  }||d 8 }|| |dks|dks|| | |d |fS |j
d&| tj|d d}d}t}||d< ||d< || | |gd |fS )'NCommandr  ParameterCountTotalParameterCount,Unsupported partial parameters in TRANSACT2!r  r   Trans_ParametersLength	DataCountTrans_DataLengthr  ParameterOffsetr   ?   SetupLengthTrans_Parametersr  
DataOffset
Trans_Data
SetupCountNamer  r  r   MaxDataCountzTransaction: (%r,%s)r  r   TotalDataCountDataDisplacementLowering answer from %d to %d   7      Pad1Pad2r   zUnsupported Transact command %r)r  r   r  r  rv   SMBTransaction_SData
fromStringr   r  r  r  r  r  r3   hasattrr   ru   !SMBTransactionResponse_ParametersSMBTransaction2Response_Datary   debugr*  r  r,   )r   r   r  r  transCommandsr  respSMBCommandr  	transData
paramCount	dataCountparamOffset
dataOffsetcommandsetupr  r  r   r   r  r  remainingDataremainingParameterscommandsdataDisplacementrN  padBytespad2Lenr@   r@   rA   smbTransaction#  s   


$"
8
zSMBCommands.smbTransactionc              
   C   sh  | | }t|d }t|d }|d |d krtdt }|d }	|	|d< |d }
|
|d< |d	 d
krP|d	 d |d  }|d |||	  |d< nd|d< |d d
krq|d d |d  }|d |||
  |d< nd|d< |d }||v rd}d}d}z|| | |||d |d |d \}}}}W n! ty } z|jd||f tj|d t	}W Y d }~nd }~ww |dkr|dkr|dkrd}d}|t
krt	}nKt|dr| }t|}t|dr| }t|}g }d
}|d
ks|d
krt|d }t }t }t||d< t||d< t||d< t||d< ||d< t||d krDtdt||d f  |d |d< nt||d< |d |d< t||d< ||d< t|d
krddt| d  d }d| }||d< dt| | |d	< n
d
}d
|d	< d|d< t|d
krddt| | t| d  d }d| |d < dt| | t| | |d< nd
|d< d|d < |d |d  |d< |d |d  |d< ||d< ||d< ||d d  }||d 8 }||d d! 7 }||d d  }||d 8 }|| |d
ks|d
ks|| | |d |fS d}d}t}||d< ||d< || | |gd |fS )"Nr  r  r  r  z*Unsupported partial parameters in NTTrans!NT_Trans_ParametersLengthr  NT_Trans_DataLengthr  r   I   r  r  NT_Trans_Parametersr  r  NT_Trans_DataFunctionr  zNTTransaction: (0x%x,%s)r  r   r  r  r  r  r  r  r  r!  r"  r#  r   )r  r   r  SMBNTTransaction_Parametersrv   SMBNTTransaction_Datar  r  r  r3   r2   r&  r   ru   #SMBNTTransactionResponse_ParametersSMBNTTransactionResponse_Datary   r)  r*  r  r,   )r   r   r  r  r*  r  r+  NTTransParametersNTTransDatar-  r.  r/  r0  r1  r2  r  r  r   r   r  r  r3  r4  r5  r6  rN  r7  r8  r@   r@   rA   smbNTTransact  s   



$"
7
zSMBCommands.smbNTTransactc              
   C   sd  | | }t|d }t|d }|d |d krtdt }|d }	|	|d< |d }
|
|d< |d	 d
krP|d	 d |d  }|d |||	  |d< nd|d< |d d
krq|d d |d  }|d |||
  |d< nd|d< td|d d
 }||v rz|| | |||d |d |d \}}}}W n ty } z|jd||f t	j
|d  d }~ww |dkr|dkr|dkrd}d}nVt|dr| }t|}t|dr| }t|}g }d
}|d
ks|d
krt|d }t }t }t||d< t||d< t||d< t||d< ||d< t||d kr7tdt||d f  |d |d< nt||d< |d |d< t||d< ||d< t|d
krsddt| d  d }d| }||d< dt| | |d	< n
d
}d
|d	< d|d< t|d
krddt| | t| d  d }d| |d < dt| | t| | |d< nd
|d< d|d < |d |d  |d< |d |d  |d< ||d< ||d< ||d d  }||d 8 }||d d! 7 }||d d  }||d 8 }|| |d
ks|d
ks|| | |d |fS |jd"| t	j
|d d}d}t}||d< ||d< || | |gd |fS )#Nr  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  zTransaction2: (0x%x,%s)r  r   r  r  r  r  r  r   r!  r"  r#  r   z#Unsupported Transact/2 command 0x%x)r  r   r  SMBTransaction2_Parametersrv   SMBTransaction2_Datar  r  r  r  r  r&  r   ru   "SMBTransaction2Response_Parametersr(  ry   r)  r*  r  r,   )r   r   r  r  r*  r  r+  trans2Parameters
trans2Datar-  r.  r/  r0  r1  r2  r  r  r   r   r  r  r3  r4  r5  r6  rN  r7  r8  r@   r@   rA   smbTransaction2=  s   



$"
7
zSMBCommands.smbTransaction2c           	      C   sL   | | }ttjj}d}d}t}||d< ||d< || | |gd |fS )Nr  r  r  )r  r   r  r   SMB_COM_LOCKING_ANDXr2   r  	r   r   r  r  r  r+  r  r  r   r@   r@   rA   smbComLockingAndX  s   
zSMBCommands.smbComLockingAndXc              
   C   s  | | }ttjj}d}d}t|d }|d |d v r|d |d  d dk}	|d |d v rt}
|d |d  d	 }z|tkrQ|d |d  d
   n	|t	krZt
| W n tyz } z|jd| tj|d t}
W Y d }~nRd }~ww |d |d  d du r|	rt}
n/zt
|d |d  d  W n ty } z|jd| tj|d t}
W Y d }~nd }~ww |d |d = nt}
nt}
|
dkrd}d}||d< ||d< || | |gd |
fS )Nr  r  r  r  	read onlyyesr  r  r  r  zcomClose %sr  r  Tr  r   r  )r  r   r  r   SMB_COM_CLOSESMBClose_Parametersr2   r  closeVOID_FILE_DESCRIPTORr   rv   r  r  r  r3   remover-   r  r  )r   r   r  r  r  r+  r  r  comCloser   r   r  r   r@   r@   rA   smbComClose  sR   

zSMBCommands.smbComClosec              
   C   s  | | }ttjj}t }d}t|d }t|d }	|d |d v r|d |d v r|d |d  d }
|d |d  d	 }|jd
| t	j
|d t}z:|
tkrst|
dd|d krrt|
|d d t|
|	d  n|d |d  d }||	d  |d |d< W n$ ty } z|jd
| t	j|d t}W Y d }~n
d }~ww t}nt}|dkrd}d}||d< ||d< || | |gd |fS )Nr  r  r  r  r  Fidr  r  r  zsmbComWrite: %sr  r   r   Offsetr  Count)r  r   r  r   SMB_COM_WRITESMBWriteResponse_ParametersSMBWrite_ParametersSMBWrite_Datar  r  INFOr2   r  r   r  r   r  rv   r  r3   r-   r  r  )r   r   r  r  r  r+  r  r  comWriteParameterscomWriteDatar  r   r   r  r   r@   r@   rA   smbComWrite	  sF   
zSMBCommands.smbComWritec              
   C   s   | | }ttjj}d}d}t|d }|d |d v r]|d |d v rZt}	|d |d  d }
zt|
 W n$ t	yY } z|j
d| tj|d	 t}	W Y d }~n
d }~ww t}	nt}	|	d
krgd}d}||d< ||d< || | |gd |	fS )Nr  r  r  r  r  r  r  zcomFlush %sr  r   r  )r  r   r  r   SMB_COM_FLUSHSMBFlush_Parametersr2   r   fsyncrv   r  r  r  r3   r-   r  r  )r   r   r  r  r  r+  r  r  comFlushr   r  r   r@   r@   rA   smbComFlush8  s2   
zSMBCommands.smbComFlushc              
   C   sx  | | }ttjj}d}d}tj|d |d d}|d |d v r|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 }t	j
||}|jd| tj|d t||si|jdtj|d t}
n7t	j
|rrt}
n.|	rwt}
n)zt	| W n! ty } z|jd| tj|d t}
W Y d }~nd }~ww t}
|
dkrd}d}||d< ||d< || | |gd |
fS )Nr  r  r  r  r  r  rP  rQ  r   DirectoryNamezsmbComCreateDirectory: %sr  r   r   r  )r  r   r  r   SMB_COM_CREATE_DIRECTORYSMBCreateDirectory_Datar2   r   r   r   r   r   r  r  r`  r   r  r9   r   r.   r3   mkdirrv   r  r  )r   r   r  r  r  r+  r  r  comCreateDirectoryDatar   r   r   r   r   r   r@   r@   rA   smbComCreateDirectory[  sD   

z!SMBCommands.smbComCreateDirectoryc              
   C   s  | | }ttjj}d}d}tj|d |d d}|d |d v r|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 }t	j
||}tt|d |d }t	j
||}|jd||f tj|d t||rvt||s|jdtj|d t}
n8t	j
|st}
n/|	rt}
n*zt	|| W n! ty } z|jd| tj|d t}
W Y d }~nd }~ww t}
|
dkrd}d}||d< ||d< || | |gd |
fS )Nr  r  r  r  r  r  rP  rQ  r   OldFileNameNewFileNamezsmbComRename: %s to %sr  r   zsmbComRename: %sr   r  )r  r   r  r   SMB_COM_RENAMESMBRename_Datar2   r   r   r   r   r   r  r  r`  r   r  r9   r   r/   r3   renameOSErrorr  r  )r   r   r  r  r  r+  r  r  comRenameDatar   r   r   oldFileNameoldPathNamenewFileNamenewPathNamer   r@   r@   rA   smbComRename  sH   
zSMBCommands.smbComRenamec              
   C   sx  | | }ttjj}d}d}tj|d |d d}|d |d v r|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 }|j	d| t
j|d tj||}t||si|j	dt
j|d t}
n7tj|srt}
n.|	rwt}
n)zt| W n! ty } z|j	d| t
j|d t}
W Y d }~nd }~ww t}
|
dkrd}d}||d< ||d< || | |gd |
fS )Nr  r  r  r  r  r  rP  rQ  r   r  zsmbComDelete: %sr  r   r   r  )r  r   r  r   SMB_COM_DELETESMBDelete_Datar2   r   r   r  r  r`  r   r   r   r   r  r9   r   r/   r3   rV  rt  r  r  )r   r   r  r  r  r+  r  r  comDeleteDatar   r   r   r   r   r   r@   r@   rA   smbComDelete  sD   

zSMBCommands.smbComDeletec              
   C   st  | | }ttjj}d}d}tj|d |d d}|d |d v r|d |d  d dk}	t}
|d |d  d	 }tt|d |d
 }t	j
||}t||s^|jdtj|d t}
n@t	j
|sgt}
n7|	rlt}
n2zt	| W n* ty } z|jd| tj|d |jtjkrt}
nt}
W Y d }~nd }~ww t}
|
dkrd}d}||d< ||d< || | |gd |
fS )Nr  r  r  r  r  r  rP  rQ  r   ri  r   r  zsmbComDeleteDirectory: %sr   r  )r  r   r  r   SMB_COM_DELETE_DIRECTORYSMBDeleteDirectory_Datar2   r   r   r   r   r   r   r  r  r  r9   r   r/   r3   rmdirrt  errno	ENOTEMPTYr*   r  r  )r   r   r  r  r  r+  r  r  comDeleteDirectoryDatar   r   r   r   r   r   r@   r@   rA   smbComDeleteDirectory  sF   

z!SMBCommands.smbComDeleteDirectoryc              
   C   s  | | }ttjj}t }d}|d dkr$t|d }t }	nt|d }t	 }	|d |	d< |d |	d< |	
|d  |d |d	 v r|d
 |d v r|d |d
  d }
|d |d
  d }|jd| tj|d t}zK|
tkr|d }d|jv r||d d> 7 }t|
dd|krt|
|d t|
|	d  n|d |d
  d }||	d  |d |d< d|d< W n$ ty } z|jd| tj|d t}W Y d }~n
d }~ww t}nt}|dkrd}d}||d< ||d< || | |gd |fS )Nr  	WordCount   r  
DataLengthr  r  r  r  rY  r  r  r  zsmbComWriteAndX: %sr  rZ  
HighOffsetro   r   r   r  r[  r   	AvailablezsmbComWriteAndx: %s)r  r   r  r   SMB_COM_WRITE_ANDXSMBWriteAndXResponse_ParametersSMBWriteAndX_Parameters_ShortSMBWriteAndX_Data_ShortSMBWriteAndX_ParametersSMBWriteAndX_Datar%  r  r  DEBUGr2   r  fieldsr   r  r   r  rv   r  r3   r-   r  r  )r   r   r  r  r  r+  r  r  	writeAndXwriteAndXDatar  r   r   offsetr  r   r@   r@   rA   smbComWriteAndX  sZ   


zSMBCommands.smbComWriteAndXc              
   C   s  | | }ttjj}t }t }t|d }|d |d v r|d |d v r|d |d  d }	|d |d  d }
|jd|
 t	j
|d	 t}z9|	tkrct|	|d
 d t|	|d }n|d |d  d }||d }t||d< t||d< ||d< W n$ ty } z|jd| t	j|d	 t}W Y d }~n
d }~ww t}nt}|dkrd}d}||d< ||d< || | |gd |fS )Nr  r  r  rY  r  r  r  zsmbComRead: %sr  rZ  r   r[  r  r  r  zsmbComRead: %s r  )r  r   r  r   SMB_COM_READSMBReadResponse_ParametersSMBReadResponse_DataSMBRead_Parametersr  r  r  r2   r  r   r  r  r  ru   rv   r  r3   r-   r  r  )r   r   r  r  r  r+  r  r  comReadParametersr  r   r   contentr  r   r@   r@   rA   
smbComReadQ  sD   
zSMBCommands.smbComReadc              
   C   s  | | }ttjj}t }d}|d dkr t|d }nt|d }|d |d v r|d |d v r|d |d  d	 }	|d |d  d
 }
|jd|
 t	j
|d d}zL|	tkr~|d }d|jv rn||d d> 7 }t|	|d t|	|d }n|d |d  d }||d }d|d< t||d< d|d< d|d< |}W n$ ty } z|jd| t	j|d t}W Y d }~n
d }~ww t}nt}|dkrd}d}||d< ||d< || | |gd |fS )Nr  r  
   r  r  r  rY  r  r  r  zsmbComReadAndX: %sr  r   rZ  r  ro   MaxCountr  r  	Remainingr  ;   r  DataCount_HizsmbComReadAndX: %s r  )r  r   r  r   SMB_COM_READ_ANDXSMBReadAndXResponse_ParametersSMBReadAndX_Parameters2SMBReadAndX_Parametersr  r  r  r  r  r   r  r  r  ru   rv   r  r3   r-   r  r  )r   r   r  r  r  r+  r  r  readAndXr  r   r   r  r  r  r   r@   r@   rA   smbComReadAndX  sR   

zSMBCommands.smbComReadAndXc                 C   s  | | }ttjj}t }d}tj|d |d d}|d |d v rq|d |d  d }	tt|d |d }
|j	d	|
 t
j|d
 t|	|
sV|j	dt
j|d
 t}nt|	|
|d d\}}}||d< ||d< ||d< t}nt}|dkr{d}d}||d< ||d< || | |gd |fS )Nr  r  r  r  r  r  r   r  zsmbQueryInformation: %sr  r   r  FileSizer  rT  r   r  )r  r   r  r   SMB_COM_QUERY_INFORMATION&SMBQueryInformationResponse_ParametersSMBQueryInformation_Datar   r   r  r  r  r   r  r9   r  r2   r  r  )r   r   r  r  r  r+  r  r  queryInformationr   r   r   r  r  r   r@   r@   rA   smbQueryInformation  s2   

zSMBCommands.smbQueryInformationc                 C   s   | | }ttjj}t }d}|d |d v r;t|d |d  d \}}	||d< d|d< d|d< |	|d	< t}
nt}
|
d
krEd}d}||d< ||d< |	| | |gd |
fS )Nr  r  r  r   
TotalUnitsr   BlocksPerUnit	BlockSize	FreeUnitsr   r  r  )
r  r   r  r   SMB_COM_QUERY_INFORMATION_DISK*SMBQueryInformationDiskResponse_Parametersr  r2   r  r  )r   r   r  r  r  r+  r  r  r  r  r   r@   r@   rA   smbQueryInformationDisk  s*   
z#SMBCommands.smbQueryInformationDiskc           
      C   sv   | | }ttjj}t }t }t|d }d|d< |d |d< ||d< ||d< t}	|	| | |gd |	fS )Nr  r   SequenceNumberr  )
r  r   r  r   SMB_COM_ECHOSMBEchoResponse_ParametersSMBEchoResponse_DataSMBEcho_Datar2   r  )
r   r   r  r  r  r+  r  r  echoDatar   r@   r@   rA   
smbComEcho  s   
zSMBCommands.smbComEchoc           	      C   s   | | }ttjj}d}d}|d |d v r7|jd|d |d |d  d f |d |d |d = t}nt}||d< ||d< || | |gd |fS )	Nr  r  r  Disconnecting Share(%d:%s)	shareNamer  r  r  )	r  r   r  r   SMB_COM_TREE_DISCONNECTr  r2   r  r  rN  r@   r@   rA   smbComTreeDisconnect  s"   
z SMBCommands.smbComTreeDisconnectc           	      C   sr   | | }ttjj}d}d}|d |d krt}nt}||d< ||d< d|d< d|d< || | |gd |fS )Nr  Uidr  r  r   FAuthenticated)r  r   r  r   SMB_COM_LOGOFF_ANDXSTATUS_SMB_BAD_UIDr2   r  rN  r@   r@   rA   smbComLogOffAndX&  s   
zSMBCommands.smbComLogOffAndXc              
   C   s  | | }ttjj}t }d}t|d }d}	|d |d v r|d |d v rt}	|d |d  d }
zUt	|
\
}}}}}}}}}}t
||d	< t||d
< t
||d< t||d< t
||d< t||d< ||d< ||d< d}tj|
r~tj}tj|
rtj}||d< W n" ty } z|jd| tj|d t}	W Y d }~nd }~ww nt}	|	dkrd}d}||d< ||d< || | |gd |	fS )Nr  r  r   r  r  rY  r  r  
CreateDater  r%  r  r&  r  FileDataSizeFileAllocationSizer   rT  zsmbComQueryInformation2 %sr  r  )r  r   r  r   SMB_COM_QUERY_INFORMATION2'SMBQueryInformation2Response_ParametersSMBQueryInformation2_Parametersr2   r   r   r   r   r   r   r   r   r   rv   r  r  r  r3   r  r  )r   r   r  r  r  r+  r  r  queryInformation2r   r   r   r  r  r	  r
  r  r  r  r  r  r  r   r@   r@   rA   smbComQueryInformation2=  sP   
z#SMBCommands.smbComQueryInformation2c              
   C   sl  | | }ttjj}t }d}t|d }tj|d |d d}	|d |d v r?|d |d  d d	k}
t}|d
 dkrS|d |d
  d }t	
d|  nd|d |d  v rh|d |d  d }nd}t}d}tt|d |	d }t||st	d d|d< d|d< |gd tfS tj||}|d }d}|tjkr|tjtjB O }np|tj@ tjkr|tjtjB O }n_|tj@ tjkrtj|du r|tjO }nIt}nF|tj@ tjkr|tjO }n8|tj@ tjkrtj|du rt}n%|tjO }n|tj@ tjkrtj|durt||  v durt}|tkr>|d }|tj!@ s1|tj"@ r6|tj#O }|tj$@ sB|tj%@ rY|tj!@ sN|tj"@ rT|tj&O }n|tj'O }|tj(@ rd|tj&O }|d }|tj@ tjkr|tj)@ tj)kr|
sz
t*| tj#}W n( t+y } z|j,d|||f t-j.|d t}W Y d }~n
d }~ww |
rt}|tj/@ tj/krtj0|du rt1}|tj2@ tj2krd}|tkr>zDtj0|rt3j4dkrt5}n2t3j4dkr|tj6O }t||  v rt7}t88 }|9|  t|  n|
rtj#}t:||}W n( t+y= } z|j,d|||f t-j.|d d}t}W Y d }~nd }~ww nt;}|tkrt<|d dkrRd}nt=|d > d d }||d< ||d< |t7krd|d< d|d < d|d!< d|d"< d|d#< d|d$< d%|d&< d|d'< d(|d)< d*|d+< nYtj0|rtj?|d< d|d < n
d|d < |d |d< t@||tjAd,\}}|tkr|d- |d!< |d" |d"< |d# |d#< |d$ |d$< |d. |d< |d& |d&< |d' |d'< nd}d}|tkri |d |< ||d | d/< ||d | d< ||d | d0< |t7kr||d | d1< nd}d}||d< ||d< |B| | |gd |fS )2Nr  r  r  r  r  r  r  rP  rQ  RootFidr   r  r  zRootFid present %s!r   NONEFr   DispositionT
AccessMaskCreateOptionszNTCreateAndX: %s,%s,%sr  r   r   r  rY  CreateActionr  rT  IsDirectory
CreateTimer  r  r      r  r  r   FileTypei  IPCStater  r  r  r  r  r  )Cr  r   r  r   SMB_COM_NT_CREATE_ANDX"SMBNtCreateAndXResponse_ParametersSMBNtCreateAndX_ParametersSMBNtCreateAndX_Datar2   ry   r)  r3   r   r   r   rz   r9   r   r   r   FILE_SUPERSEDEO_TRUNCr   FILE_OVERWRITE_IFFILE_OVERWRITEr   r/   FILE_OPEN_IFFILE_CREATEr.   	FILE_OPENstrgetRegisteredNamedPipesFILE_READ_DATAGENERIC_READr   FILE_WRITE_DATAGENERIC_WRITEr   r   GENERIC_ALLFILE_DIRECTORY_FILErl  rv   r  r  r  FILE_NON_DIRECTORY_FILEr   r+   FILE_DELETE_ON_CLOSEr   r   rU  r   r  socketconnectr   r  ru   r  r	  r   rP  rn  r  )r   r   r  r  r  r+  r  r  ntCreateAndXParametersntCreateAndXDatar   r   r   deleteOnCloser   r   createDispositionr   desiredAccesscreateOptionsr   r   r  fakefidrespInfor@   r@   rA   smbComNtCreateAndXm  s  



















zSMBCommands.smbComNtCreateAndXc                 C   s  | | }ttjj}t }d}t|d }tj|d |d d}	|d |d v r]|d |d  d }
|d |d  d	 d
k}t|
t	|d |	d |d |d |d |\}}}}nt
}|tkrt|d d }t|d dkrvd}nt|d  d d }||d< |tj@ rd|d< n|tj@ rd|d< n|tj@ rd|d< nd|d< i |d |< ||d | d< ||d | d< d|d | d< nd}d}||d< ||d< || | |gd |fS )Nr  r  r  r  r  r  r  r   rP  rQ  r  DesiredAccessrT  OpenModer  r   r   r  rY  r   Action   r  Fr  )r  r   r  r   SMB_COM_OPEN_ANDXSMBOpenAndXResponse_ParametersSMBOpenAndX_ParametersSMBOpenAndX_Datar   r   r  r2   ru   r  r	  r   r   r   O_APPENDr  )r   r   r  r  r  r+  r  r  openAndXParametersopenAndXDatar   r   
openedFiler   r   r   r   r@   r@   rA   smbComOpenAndX"	  sR   






zSMBCommands.smbComOpenAndXc                 C   sP  | | }t }tjj|d< tjjtjjB tjjB |d tjj@ B |d< |d |d< |d |d< |d |d< t	tjj
}t }t }t|d }	|	d d@ rWt }tj|d d	}
|	d
 |
d< |
|d  t}t|d |
d }t|r|dd }nt|}t| ||}|d urt|d dkrd}nt|d  d d }||d |< ||d | d< ||d< n|jd| tj|d t}|d? |d< |d@ |d< tjj|d< |dkrd|d< n||d< d|d< t |d d ! |d!< ||d< ||d< |d" |d"< |"| |d# r|#|||d$ |d%  |$| | d |g|fS )&NFlags1r  r  MidPidr  Flagsr"  r   PasswordLength_PasswordLengthr  Pathr   r  r  r   r   r  r  zTreeConnectAndX not found %sr  rI   	ErrorCoder   
ErrorClassOptionalSupportIPC$IPCServicePadLenNTFSNativeFileSystemr  SignatureEnabledSigningSessionKeySigningChallengeResponse)%r  r   NewSMBPacketr   FLAGS1_REPLYFLAGS2_EXTENDED_SECURITYFLAGS2_NT_STATUSFLAGS2_LONG_NAMESr   r  SMB_COM_TREE_CONNECT_ANDX%SMBTreeConnectAndXResponse_ParametersSMBTreeConnectAndXResponse_DataSMBTreeConnectAndX_Parameters-SMBTreeConnectAndXExtendedResponse_ParametersSMBTreeConnectAndX_Datar%  r2   r   ntpathismountsplitr(  r   ru   r  r	  r  r  r  r)   SMB_SUPPORT_SEARCH_BITSr   rP   
addCommand	signSMBv1r  )r   r   r  r  r  respr+  r  r  treeConnectAndXParameterstreeConnectAndXDatar   
UNCOrSharer   r   tidr@   r@   rA   smbComTreeConnectAndX_	  sb   






z!SMBCommands.smbComTreeConnectAndXc              
   C   s`  |j | dd}ttjj}|d dkr}t }tj|d d}t|d }t }	|d |	d< |		|d	  |d
 |d
< d}
t
d|	d dd d tkrt|	d }|d }t|d d dkr|d d }|td kr|tv rzt| }nt|}|jd| tj|d d}t||d< |d |d< ||d< t|d | |d< t|d | |d< ||d< ||d	< |gd tfS n!t
d|	d dd d tkrt|	d }|d }nd}
|	d }t
d|tdtdd  d }|dkrt }|	| ||d< d}|d tj@ r|tjO }|d tj@ r!|tjO }|d tj@ r.|tjO }|d tj@ r;|tjO }|d tj @ rH|tj O }|d tj!@ rU|tj!O }|tj"tj#B tj$B tj%B tj&B O }t' }|( )d |tj*< |tj+< |, )d |tj-< |tj.< t
/dd t01t23 d!  |tj4< t5 }|j6rtj7dB n||d< t|, )d|d"< |d" |d#< d$|d%< |8 |d&< |, )d|d'< t||d(< t||d)< ||d*< d$t|d'  |d+< d,|d-< d.|d/< |
du r
t }d0|d1< td |d2< |9 |d< n|}t}d3|d4< ||d5< nR|d6kr!t:d7|d8krdt; }|	| |d9|d' <d|d: <d|d; <df  t|= dkr|d: <d> }||= v r|= | \}}}t?||||8 ||d5 |d \}}|d urd|d<< ||d=< d|d>< nt@}ntA}|tAkrd|d?< t }d@|d1< |dA|d; <d|d: <df  ||dB< |d' <ddCkr|d' <dn|d; <d|dD< |d: <d|d:< z0|B }tC|d5 d& |d: |d' |dE |dF }||dG  |dCkrtD|dG |dH | W n   |dI|  Y nt }dJ|d1< |jdK|d |jEd urcz|jE|||d' <d|d: <d|d; <ddL W n  t:yb } ztFdM|  W Y d }~nd }~ww nt:dN| t||d< |d |d< |9 |d< ntG }tH }tI|d }tJ }	|dO |	dO< |dP |	dP< |		|d	  |d
 |d
< tA}d3|d4< d|d?< d|dQ< |dR|	dS |	dT f  z0|B }tCdUtK|	dT tK|	dS |	dV |	dW }||dG  |dCkrtD|dG |dH | W n   |jdI| |d Y t|d | |d< t|d | |d< ||d< ||d	< d|d?< |L| | |gd |fS )XNFcheckStatusr  r  r  r   r  SecurityBlobLengthr  CapabilitiesBSecurityBlobr   r   	MechTokenr   2NTLMSSP - Microsoft NTLM Security Support ProviderUnsupported MechType '%s'r  s   0

+7
NativeOSNativeLanManResponseTokenT<LNTLMSSP r  NEGOTIATE_MESSAGErK   rH   <q     }*{G逖 
domain_lendomain_max_len8   domain_offsetrM   rG   TargetInfoFields_lenTargetInfoFields_max_lenTargetInfoFieldsTargetInfoFields_offset   Versionr"  
VersionLen   NegStateSupportedMechr  r  CHALLENGE_MESSAGEr   )Challenge Message raise, not implemented!r  AUTHENTICATE_MESSAGE (%s\%s,%s)	user_name	host_namer  r  SignSequenceNumberr  r  %User %s\%s authenticated successfullyAUTHENTICATE_MESSAGErF   user_domain_namerJ   r   rq   rr   =Could not write NTLM Hashes to the specified JTR_Dump_Path %s   Could not authenticate user!r   r  rG   rT  rU  $[!] Could not call auth_callback: %sUnknown NTLMSSP MessageType %dAnsiPwdLengthUnicodePwdLengthr  z-User %s\%s authenticated successfully (basic)PrimaryDomainAccountr  AnsiPwd
UnicodePwd)Mr  r   r  r   SMB_COM_SESSION_SETUP_ANDX0SMBSessionSetupAndX_Extended_Response_Parameters*SMBSessionSetupAndX_Extended_Response_Data'SMBSessionSetupAndX_Extended_Parameters!SMBSessionSetupAndX_Extended_Datar%  r  r  r   r   ru   r   r   r   r  r  r  r   getServerOSr(   r   r   r   NTLMAuthNegotiateNTLMSSP_NEGOTIATE_56rT   rU   rS   NTLMSSP_NEGOTIATE_UNICODENTLM_NEGOTIATE_OEMNTLMSSP_NEGOTIATE_VERSIONNTLMSSP_NEGOTIATE_TARGET_INFONTLMSSP_TARGET_TYPE_SERVERNTLMSSP_NEGOTIATE_NTLMNTLMSSP_REQUEST_TARGETAV_PAIRSr  r   NTLMSSP_AV_HOSTNAMENTLMSSP_AV_DNS_HOSTNAMEgetServerDomainNTLMSSP_AV_DOMAINNAMENTLMSSP_AV_DNS_DOMAINNAMEr   calendartimegmtimegmtimeNTLMSSP_AV_TIMENTLMAuthChallenge_SMBSERVER__dropSSPNTLMSSP_DROP_SSP_STATICgetSMBChallenger   rv   NTLMAuthChallengeResponserP   getCredentialsr-  rm   r8   r2   getJTRdumpPathr   r   auth_callbackprint&SMBSessionSetupAndXResponse_Parameters SMBSessionSetupAndXResponse_DataSMBSessionSetupAndX_ParametersSMBSessionSetupAndX_Datar	   r  )r   r   r  r  r  r+  r  r  sessionSetupParameterssessionSetupDatarawNTLMblobtokenmechTypemechStr	respTokenmessageTypenegotiateMessageansFlagsav_pairschallengeMessager   r_   r[   r
  r\   r]   
sessionKeyjtr_dump_pathntlm_hash_datar   r@   r@   rA   smbComSessionSetupAndX	  s   
 
$







"






4


z"SMBCommands.smbComSessionSetupAndXc              
   C   s  |j | dd}|d |d< t|d d }ttjj}t }tjj|d< |d |d< |d |d< |d |d< |d d	}z|d
d }|d tjj	@ rtjj	tjj
B tjjB |d< t }	d|	d< t }
td g|
d< |
 |	d< t }tjjtjjB tjjB tjjB |d< d|d< n;tjj
tjjB |d< t }t }	d|	d< d|v r|d |	d< t|	 |d< nd|	d< d|d< tjjtjjB |d< | }|ddr|dddu r|d  tjjO  < ||d< tjjtjjB |d< d|d< d|d < d!|d"< d#|d$< d|d%< d|d&< d|d'< d|d(< |	|d< ||d)< |	|d*< ||d+< W n& tyM } z|jd,| t j!|d- t"#d.d/|d< W Y d }~nd }~ww |$| | |%| d |gt&fS )0NFr1  r	  r  r   r  r  r  r[  s   NT LM 0.12 r   r     AAAAAAAAAAAAAAAA
ServerGUIDr8  r   r6  r4  ChallengeLengthrF   PayloadEncryptionKey	Challenges   "3DUfwr"  r   rpc_apisTDialectIndexSecurityModeMaxMpxCountMaxNumberVcsi   MaxBufferSize   
MaxRawSize
SessionKeyLowDateTimeHighDateTimeServerTimeZoner  _dialects_data_dialects_parameterszsmbComNegotiate: %sr  r  r  )'r  r   r  r   SMB_COM_NEGOTIATEr  r  r'  r   r  r  r   SMBExtended_Security_Datar   r   r   SMBExtended_Security_ParametersCAP_EXTENDED_SECURITYCAP_USE_NT_ERRORSCAP_NT_SMBSCAP_UNICODESMBNTLMDialect_ParametersSMBNTLMDialect_Dataru   r   
has_option
getbooleanCAP_RPC_REMOTE_APISSECURITY_AUTH_ENCRYPTEDSECURITY_SHARE_USERrv   r  r  r  r  r   r  r)  r2   )r   r   r  r  r  r+  r+  dialectsr   r  r  r  r   r   r@   r@   rA   smbComNegotiate
  sz   

zSMBCommands.smbComNegotiatec                 C   s   | d|d  tj t }tjj|d< tjj|d< |d |d< |d |d< |d |d< |d |d< |d |d< d	|d
< t}|d? |d< |d@ |d< d |g|fS )NNot implemented command: 0x%xr  r  r  r	  r  r  r  s      r  rI   r  r   r  )	r  r  r  r   r  r   r  r  r,   )r   r   r  r  packetr   r@   r@   rA   r  
  s   zSMBCommands.defaultN)r  r  r  r  r9  rF  rL  rO  rX  rc  rh  rn  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r  r0  r  r  r  r@   r@   r@   rA   r  !  sv    
 
 

 

2
.
"
-
.
/
.
9
-
4
&




/
 5
<
K
  
Pr  c                   @   s  e Zd Zed/ddZedd Zedd Zedd	 Zed
d Zedd Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zed d! Zed"d# Zed$d% Zed&d' Zed(d) Zed*d+ Zed,d- Zd.S )0SMB2CommandsFc                 C   s  |j | dd}t }tj|d< t|d< d|d< tj|d< d|d	< |du r,|d
 |d
< nd|d
< d|d< t }d|d< |du rbt|d d }|d 	d}d|v sXd|v r^tj
|d< n	tdtj
|d< d|d< d|d< d|d< d|d< d|d< ttt |d< ttt |d< d|d< t }	g }
| r| d r|
td  td! td" g7 }
| r|
td# g7 }
|
|	d$< |	 |d%< t|d% |d&< ||d< || | d |gtfS )'NFr1  r
  Statusr   CreditRequestResponser  r   	SessionID	MessageIDTreeIDr  Tr  r[  s
   SMB 2.002 s
   SMB 2.??? DialectRevisionzSMB2 not supported, fallbackingr  
ServerGuidr4  r  MaxTransactSizeMaxReadSizeMaxWriteSize
SystemTimeServerStartTimer  SecurityBufferOffsetr{   MS KRB5 - Microsoft Kerberos 5KRB5 - Kerberos 5 KRB5 - Kerberos 5 - User to Userr8  r   BufferSecurityBufferLength)r  r   
SMB2PacketSMB2_FLAGS_SERVER_TO_REDIRr2   SMB2_NEGOTIATESMB2Negotiate_Responser   r  r'  SMB2_DIALECT_002rv   r=   r{  r|  r}  r~  r   getKerberosSupportgetComputerAccountCredentialsr   getNTLMSupportr   ru   r  )r   r   r  isSMB1r  
respPacketr+  r  r  r  supported_mechtypesr@   r@   rA   smb2Negotiate  sP   


zSMB2Commands.smb2Negotiatec                 C   s>  zqt j| t dd }|d }|d d d }tt|d d d  }| }t|d |d	 |d
 |d |d d}z||d d d  }	W n% tyl   t	d|d d d d
dd | D  d tf Y W S w z	||	d|}
W n ty   t	d d tf Y W S w t j|
t dd }t|d d t|d d }tt|d d  }||d|d d }t j|t dd }|d   |d< |d d d   |d< t|d d |d d  }t }d|d < tjjj|d!< |d d |d d< t }|d"  |d"< |d#  |d#< |j|d d< |j|d d< ||d$t|d |d d< t|}t  }t!d% |d&< d'|d(< ||d)< |" }t#$ }d*|d+< t%||d,< ||d-< d.|d/< |jd d0 |d1< d2|d3< |t&fW S    t  }t!d% |d&< d'|d(< |" }t#$ }d*|d+< t%||d,< ||d-< |t&f Y S )4N)asn1Specr   apReqticketzenc-partcipheretyper]   aespasswordr{   r|   )rc4r  r  userr|   zoCould not find the correct encryption key! Ticket is encrypted with keytype %d, but keytype(s) %s were suppliedz, c                 S   s   g | ]}t |qS r@   )r  ).0enctyper@   r@   rA   
<listcomp>c  s    z/SMB2Commands._kerberos_auth.<locals>.<listcomp>r   zUCiphertext integrity failed. Most likely the account password or AES key is incorrectkeykeytypekeyvalueauthenticator   crealmrY  cnamezname-stringrT  subkey   pvnozmsg-typer  cusecr  r  rP  r  rO  r<  H   r  r  r  Tr  rI   r  r   rV  )'r   rP   r   r!   r  r  r#   KeyErrorry   rz   r   r	  r8   decryptr"   r   r    rt   r   asOctetsr   r   KerberosMessageTypes
KRB_AP_REPvaluer   prettyPrintcontentsr  encryptr   r   r   r   r   r   SMB2SessionSetup_Responseru   r2   )r  r  r   r  ap_req
cipherText	newCiphercomputerAccountCredentialsekeysr  	plainTextencTicketPartr  encApReqAuthenticatorApRepAuthenticatorencryption_keyap_repencAPRep
aprepBytesacceptacceptBytesr+  r@   r@   rA   _kerberos_authO  s   &


zSMB2Commands._kerberos_authc              
   C   s  t d| tdtdd  d }t }|dkrjt }||  ||d< d}|d tj@ r6|tjO }|d tj	@ rB|tj	O }|d tj
@ rN|tj
O }|d tj@ rZ|tjO }|d tj@ rf|tjO }|d tj@ rr|tjO }|d tj@ r~|tjO }|tjtjB tjB tjB tjB O }|jrtjdB }t }d| v r| dd  d	|tj< | d	|tj< n|  d	 |tj< |tj< |  d	 |tj< |tj< t  d
dt!"t#$ d  |tj%< t& }	||	d< t| d	|	d< |	d |	d< d|	d< |' |	d< | d	|	d< t||	d< t||	d< ||	d< dt|	d  |	d< d|	d< d|	d< |du rXt( }
d|
d< t)d |
d< |	* |
d < n|	}
t+}t,-dd!|d"< |	|d#< n|d$krst.d%|d&kr(t/ }||  |0d'|d 1d	|d( 1d	|d) 1d	f  d}d}|2 }|d( 1d	d*krt|3 dkr|d( 1d	4 }t5}||3 v r|3 | \}}}t6||||' ||d# |d \}}|d urd+|d,< ||d-< d|d.< nO|d/ d*kr%t7|d0 |d/ |d1 |d2 }|8  |9||' \}}d+|d,< ||d-< d|d.< nd|d,< |d tj:@ r?d+}|j;dkr<t<}nt=}nd+}t=}|t=krd+|d3< t( }
d4|
d< |rZt> }
|0d5|d) 1d	|d( 1d	f  ||d6< |d 1d	d*kr|d 1d	n|d) 1d	|d7< |d( 1d	|d(< z0|? }t@|d# d |d( |d |d8 |d9 }|0|d:  |d*krtA|d: |d; | W n   |0d<|  Y |rd|d=< n|rd$|d=< nt( }
d>|
d< |0d? |jBd ur'z|jB|||d 1d	|d( 1d	|d) 1d	d@ W n  t.y& } ztCdA|  W Y d }~nd }~ww nt.dB| dC|dD< t|
|dE< |
* |dF< ||fS )GNr=  r>  r  r   r   r?  rK   r  rH   r@  rA  rB  rC  rD  rE  rF  rM   rG   rG  rH  rI  rJ  rK  rL  r"  rM  FrN  rO  r8  rP  r<  rL   r  rQ  r   rR  r  rS  rT  rU  rF   Tr  r  rV  r{   dcipr]   r|   r  r  rW  rX  rY  rJ   r   rq   rr   rZ  SessionFlagsr[  r\  r]  r^  r_  r  r  r  r  )Dr  r  ru   r   r  r   rl  r%  rm  rT   rU   rS   rn  ro  rW   rp  rq  rr  rs  rt  r  r  ru  rx  r'  r  r   ry  rz  r  rv  rw  r   r{  r|  r}  r~  r  r  r  r   r   r   r(   randomrandintrv   r  r  rP   r  r  r-  r8   rm   NetLogonsetupConnectionlogonUserAndGetSessionKeyNTLMSSP_NEGOTIATE_ANONYMOUS_SMBSERVER__anonymousLogonr3   r2   Emptyr  r   r   r  r  )r  r  r   r  r  r+  r  r  r  r  r  r   r_   isGuest
isAnonymusr  r[   r
  r\   r]   r  netlogonr  r  r   r@   r@   rA   
_ntlm_auth  s0  $








"
"""




&


4



zSMB2Commands._ntlm_authc                  C   sJ   t  } td | d< d| d< |  }t }d|d< t||d< ||d< |S )	Nr8  rP     rO  r  r  r  r  )r   r   r   r   r  ru   )r  r  r+  r@   r@   rA   generic_negTokenRespp  s   z!SMB2Commands.generic_negTokenRespc                 C   s4  |j | dd}t|d }|d |d< |d }d}d }td|dd d tkrt|}|d	 }	t|d
 d dkr|d
 d }g }
| r[|	 d r[|
t
d t
d t
d g7 }
| rf|
t
d g7 }
||
vr|tv rst| }nt|}|jd| tj|d t gd tfS nWtd|dd d tkrt|}|d }	d|	v r| rt
d }n4| rt
d }n+t gd tfS |dr| rd}|}	t
d }n|jdtj|d t gd tfS |t
d t
d t
d fv rt|	||\}}n|t
d kr
t|	|||\}}d|d< || | |gd |fS )NFr1  r  r4  r  r5  r   r   r7  r   r{   r  r  r  r8  r9  r  r<  s   NTLMSSP Tz)Unknown or unsupported security blob typer  )r  r   SMB2SessionSetupr  r  r   r   ru   r  r  r   r  r   r   r  r  r  r  r$  r(   r   r   
startswithr  r  r"  r  )r   r   r  r  r  securityBlobr  authTyper  r  r  r  r+  r   r@   r@   rA   smb2SessionSetup~  sX   



zSMB2Commands.smb2SessionSetupc                 C   s  | | }t }tj|d< t|d< d|d< |d |d< |d |d< |d |d< |d	 |d	< |d
 |d
< t }t|d }t}| |d d  d |d  }|d}	|j	d|	 t
j|d t|	rn|	dd }nt|	}t| | |}
|
d urt|d dkrd}nt|d  d d }|
|d |< ||d | d< ||d
< |j	d||f |d n|j	d| t
j|d t}||d< | dkrtj|d< d|d< n	tj|d< d|d< d|d< d|d< ||d< |d  r|||d!  || | d |g|fS )"Nr
  r  r   r  r  r  r  Reservedr  r  r  
PathOffset
PathLengthrH   zsmb2TreeConnect: %sr  r   r  r  r   r  r  zConnecting Share(%d:%s)zSMB2_TREE_CONNECT not found %sr  	ShareType0   
ShareFlagsr4  i MaximalAccessr  r  )r  r   r  r  r2   SMB2TreeConnect_ResponseSMB2TreeConnectr   rP   r  r  r`  r%  r&  r'  r(  r   r  ru   r  r	  r  r)   SMB2_SHARE_TYPE_PIPESMB2_SHARE_TYPE_DISK	signSMBv2r  )r   r   r  r  r  r+  treeConnectRequestr   r   r.  r   r/  r@   r@   rA   smb2TreeConnect  sV   

 





zSMB2Commands.smb2TreeConnectc              
   C   s  | | }t }t|d }d|d< |d |d v r|d |d  d dk}t}d|d |d  v r@|d |d  d }nd	}t}d
}	t|d d |d  d}
|jd|
 t	j
|d t||
srtd t gd tfS tj||
}|d }d}|tjkr|tjtjB O }nm|tj@ tjkr|tjtjB O }n\|tj@ tjkrtj|du r|tjO }nFt}nC|tj@ tjkr|tjO }n5|tj@ tjkrtj|du rt}n"|tjO }n|tj@ tjkrtj|durt|| v durt}|tkr|d }|tj @ s|tj!@ r|tj"O }|tj#@ s |tj$@ r7|tj @ s,|tj!@ r2|tj%O }n|tj&O }|tj'@ rB|tj%O }|d }|tj@ tjkr|tj(@ tj(kr|sz
t)| tj"}W n( t*y } z|jd|||f t	j+|d t}W Y d }~n
d }~ww |rt}|tj,@ tj,krtj-|du rt.}|tj/@ tj/krd}	|tkrzDtj-|rt0j1dkrt2}n2t0j1dkr|tj3O }t4|| v rt5}t66 }|7| t4|  n|rtj"}t8||}W n( t*y } z|jd|||f t	j+|d d}t}W Y d }~nd }~ww nt9}|tkrt:; }||d< ||d< |t5krRd|d< d|d< d|d< d|d< d|d< d|d< d |d!< nLtj-|r_t<j=|d!< n|d! |d!< t>||
t<j?d"\}}|tkr|d |d< |d |d< |d |d< |d# |d#< |d$ |d!< |d |d< |d |d< |tkri |d% |< ||d% | d&< ||d% | d'< |	|d% | d(< i |d% | d)< d|d% | d) d*< d+|d% | d) d,< |t5kr||d% | d-< nt }|tkr||d. d/< |@| | |gd |fS )0Nr  r  r  r  r  rP  rQ  r   r  F
NameLengthrH   zsmb2Create: %sr  r   CreateDispositionr   Tr  r  zSMB2_CREATE: %s,%s,%sr   FileIDr  r  r  r  rS  r  r  r  r  rT  r  r   r  r  r  r  r  OpenEnumerationLocationrF   EnumerationSearchPatternr  LastRequestSMB2_CREATE)Ar  r   SMB2Create_Response
SMB2Creater2   r3   r   rP   r  r  r`  r   ry   rz   	SMB2Errorr9   r   r   r   r  r  r   r  r  r   r/   r  r  r.   r  r  r  r  r  r   r  r  r   r   r  r  rl  rv   r  r  r   r+   r  r   r   rU  r   r
   r  r  r  r   r  r   generater   r   rP  rn  r  )r   r   r  r  r+  ntCreateRequestr   r   r   r  r   r   r  r   r  r  r   r   r  r  r  r@   r@   rA   
smb2Create  s  


















zSMB2Commands.smb2Createc              
   C   s  | | }t }t|d }|d  dkr.d|d v r'|d d d }n|d  }n|d  }|d |d v rG|d |d  d d	k}||d
 v rDt}|d
 | d }	|d
 | d }
|jd|
 tj|d d }z+|	t	kr|d
 | d 
  n|	tkrt
|	 ttj|
tj|
tj\}}W n ty } z|jd| tj|d t}W Y d }~nd }~ww |d
 | d du r
|rt}n@ztj|
rt|d
 | d  nt|d
 | d  W n  ty	 } z|jd| tj|d t}W Y d }~nd }~ww |d ur9|d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |d |d< |tkrC|d
 |= nt}nt}|| | |gd |fS )Nr  r:     r?  r>  r  r  rP  rQ  r  r  r  zsmb2Close: %sr  r  zSMB2_CLOSE %sr  Tr  r  r  rS  r  r  	EndofFilerT  )r  r   SMB2Close_Response	SMB2Closer   r2   r  r  r`  r  rT  rU  r   rQ  r   r)  r(  rz  rv   r  r-   r3   r   shutilrmtreerV  r  r  )r   r   r  r  r+  closeRequestfileIDr   r   r  r   r  r   r@   r@   rA   	smb2Close  st   




zSMB2Commands.smb2Closec           
      C   s  | | }t }t|d }t}d|d< d|d< |d  dkr8d|d	 v r1|d	 d d }n|d  }n|d  }|d
 |d v r||d v r|d | d }|jd| tj|d |d tj	kr|d tj
krvt }	||	d< nNttj|tj||d \}	}n;|d tjkr|d tjkrd}	n*ttj|tj||d }	n|d tjkrd }	t}n|jd|d  tj|d |	d urt|	|d< |	|d< nt}nt}|| | |gd |fS )Nr  r  OutputBufferOffsetr  r  r:  rF  r?  r>  r  r  r  r  zsmb2QueryInfo: %sr  InfoTypeFileInfoClassra  s       zqueryInfo not supported (%x)OutputBufferLength)r  r   SMB2QueryInfo_ResponseSMB2QueryInfor2   r   r  r  r`  SMB2_0_INFO_FILESMB2_FILE_INTERNAL_INFOrr  rQ  r   r   r)  r(  SMB2_0_INFO_FILESYSTEMr}  r  SMB2_0_INFO_SECURITYr3   r  ru   r-   r  r  )
r   r   r  r  r+  	queryInfor   rM  r   r  r@   r@   rA   smb2QueryInfo  sR   



zSMB2Commands.smb2QueryInfoc              
   C   s  | | }t }t|d }t}|d  dkr0d|d v r)|d d d }n|d  }n|d  }|d |d v r|d |d  d }|d |d  d	 d
k}	||d v r|d | d }
|jd|
 tj|d |d tj	kr|d }|tj
krt|d }|d dkrtj|
rt|
rt}n%d|d | d< n|tjkrt|d }|d }|dkrd}nt|}|d }|dkrd}nt|}|dkr|dkrt|
||f n|tjkr|d | d }t|d }|d dkrt||d d d t|d n|tjkrt|d }t|d d}tj||}t||sE|jdtj |d t! gd t"fS |d dkr[tj#|r[t! gd t$fS |	rat%}n`zt&|
| ||d | d< W nO t'y } z|jd| tj |d t%}W Y d }~n4d }~ww |tj(kr|d  t}n!|jd!| tj |d t)}n|jd"|d  tj |d nt*}nt+}|,| | |gd |fS )#Nr  r:  rF  r?  r>  r  r  r   rP  rQ  r  r  zsmb2SetInfo: %sr  rP  rQ  r  r`  r   Tr  r  r  rS  r  r  r   r  rH   r   ReplaceIfExistsz2Warning: SMB2_FILE_ALLOCATION_INFO not implementedr  zsetInfo not supported (%x))-r  r   SMB2SetInfo_ResponseSMB2SetInfor2   r   r  r  r`  rU  SMB2_FILE_DISPOSITION_INFOr   r  r   r   r   r+  r*   rh  r  rD   r  SMB2_FILE_END_OF_FILE_INFOr  r  r   SMB2_FILE_RENAME_INFOFILE_RENAME_INFORMATION_TYPE_2r   rP   r   r   r  rB  r9   r   r.   r3   rs  rv   SMB2_FILE_ALLOCATION_INFOr4   r-   r  r  )r   r   r  r  r+  setInfor   rM  r   r   r   r  r  r  r  r  
renameInforx  ry  r   r@   r@   rA   smb2SetInfo+  s   





zSMB2Commands.smb2SetInfoc              
   C   s  | | }t }t|d }d|d< |d  dkr2d|d v r+|d d d }n|d  }n|d  }|d |d	 v r||d
 v r|d
 | d }|d
 | d }|jd| tj|d t}	z<|t	kr|d }
t
|dd|
krt
||
d t
||d  n|d
 | d }||d  |d |d< d|d< W n$ ty } z|jd| tj|d t}	W Y d }~n
d }~ww t}	nt}	|| | |gd |	fS )Nr  r  r  r:  rF  r?  r>  r  r  r  r  r  zsmb2Write: %sr  rZ  r   r   r  Lengthr[  r   r  zSMB2_WRITE: %s)r  r   SMB2Write_Response	SMB2Writer   r  r  r`  r2   r  r   r  r   r  rv   r  r3   r-   r  r  )r   r   r  r  r+  writeRequestrM  r  r   r   r  r  r   r@   r@   rA   	smb2Write  sF   
zSMB2Commands.smb2Writec              
   C   s  | | }t }t|d }d|d< |d  dkr2d|d v r+|d d d }n|d  }n|d  }|d |d	 v r||d
 v r|d
 | d }|d
 | d }|jd| tj|d d}	zC|tkr||d }
t	
||
d t	||d }n|d
 | d }||d }d|d< t||d< d|d< ||d< t|dkrt}	W n$ ty } z|jd| tj|d t}	W Y d }~n
d }~ww t}	nt}	|| | |gd |	fS )Nr  r  r  r:  rF  r?  r>  r  r  r  r  r  zsmb2Read: %sr  r   rZ  rf  r  P   r  r  DataRemainingzSMB2_READ: %s )r  r   SMB2Read_ResponseSMB2Readr   r  r  r`  r  r   r  r  r  ru   r:   rv   r  r3   r-   r  r  )r   r   r  r  r+  readRequestrM  r  r   r   r  r  r  r   r@   r@   rA   smb2Read  sL   
zSMB2Commands.smb2Readc              
   C   s   | | }t }t|d }|d |d v rk|d  }||d v rh|d | d }|d | d }|jd| tj|d	 t}	zt	
| W n$ tyg }
 z|jd
|
 tj|d	 t}	W Y d }
~
n
d }
~
ww t}	nt}	|| | |gd |	fS )Nr  r  r  r:  r  r  r  zsmb2Flush: %sr  zSMB2_FLUSH %s)r  r   SMB2Flush_Response	SMB2Flushr   r  r  r`  r2   r   rf  rv   r  r3   r-   r  r  )r   r   r  r  r+  flushRequestrM  r  r   r   r   r@   r@   rA   	smb2Flush  s*   
zSMB2Commands.smb2Flushc              	   C   s  | | }t }t|d }d|d< |d |d v du r&t gd tfS |d  dkrDd	|d
 v r=|d
 d	 d }n|d  }n|d  }||d v du rZt gd tfS |d | d }|jd| t	j
|d tj|d | d du rt gd tfS |d tjtjtjtjtjtjfvrt gd tfS |d tj@ rd|d | d d< d|d | d d< |d tj@ rd|d | d d< |d d}|d | d d dkr|d | d d dkr|dkrd}||d | d d< |d tj@ r|d dkr||d | d d< tjtj|d | d |}	ttj|	tj|	|d tj dd\}
}}|t!krFt gd |fS |dkrZ|dkrZ|d8 }|
dd  }
|dkrt|d | d d dkrtt gd t"fS |d | d d dk rt gd t#fS d}d}t$|d | d d |D ]}|d | d d  d7  < |d tj%@ rd|
| d< |
|  }t&|}d|d  d }z)|
|d   }t&|}|| | | }||d  krd|
| d< |
|  }W n
 t'y   Y nw || |d  kr|d | d d  d8  <  n||d|  7 }||| 7 }|d tj%@ r/ nq|d | d d |krHd!|d | d d< d"|d#< ||d < ||d< |(| | |gd |fS )$Nr  r  r  r  r  Fr:  rF  r?  r>  r  r  zsmb2QueryDirectory: %sr  FileInformationClassr
  r   r;  r<  rF   r=  rH   r  re  T)rE  r   r  r   r#  r"  rR  r  r  rO  ))r  r   SMB2QueryDirectory_ResponseSMB2QueryDirectoryrB  r%   r   r'   r  r  r`  r   r   r   r&   FILE_DIRECTORY_INFORMATIONFILE_FULL_DIRECTORY_INFORMATION!FILEID_FULL_DIRECTORY_INFORMATIONFILE_BOTH_DIRECTORY_INFORMATION!FILEID_BOTH_DIRECTORY_INFORMATIONFILENAMES_INFORMATIONr7   SMB2_REOPENSMB2_RESTART_SCANSrP   SMB2_INDEX_SPECIFIEDr   r   rO  r)  r(  r   r   r2   r/   r$   rangeSL_RETURN_SINGLE_ENTRYru   
IndexErrorr  )r   r   r  r  r+  queryDirectoryRequestrM  r   rG  r   rK  rL  r   r  r  nItemr  r   rN  nextDatalenNextDatanextTotalDatar@   r@   rA   smb2QueryDirectory  s   
"

$zSMB2Commands.smb2QueryDirectoryc                 C      t  gd tfS r<   )r   rB  r4   r   r   r  r@   r@   rA   smb2ChangeNotify     zSMB2Commands.smb2ChangeNotifyc                 C   s   t  }|gd tfS r<   )r   SMB2Echo_Responser2   )r   r   r  r+  r@   r@   rA   smb2Echo  s   zSMB2Commands.smb2Echoc                 C   s|   | | }t }|d |d v r0|jd|d |d |d  d f |d |d |d = t}nt}|| | |gd |fS )Nr  r  r  r  r  )r  r   SMB2TreeDisconnect_Responser  r2   r  r  r   r   r  r  r+  r   r@   r@   rA   smb2TreeDisconnect  s   
zSMB2Commands.smb2TreeDisconnectc                 C   sT   | | }t }|d |d krt}nt}d|d< d|d< || | |gd |fS )Nr  r  r   Fr  )r  r   SMB2Logoff_Responser  r2   r  r  r@   r@   rA   
smb2Logoff  s   
zSMB2Commands.smb2Logoffc           	      C   s   | | }t }t|d }| }|d |v rT||d  | ||\}}|tkrQ|d |d< |d |d< d|d< d|d< d|d< t||d	< d|d
< ||d< n|}n|jd|d  tj	|d t
}t }|| | |gd |fS )Nr  CtlCoder:  r   InputOffset
InputCountp   OutputOffsetOutputCountr
  r  z#Ioctl not implemented command: 0x%xr  )r  r   SMB2Ioctl_Response	SMB2Ioctl	getIoctlsr2   ru   r  r  r  r5   rB  r  )	r   r   r  r  r+  ioctlRequestioctls
outputDatar   r@   r@   rA   	smb2Ioctl  s*   

zSMB2Commands.smb2Ioctlc                 C   s.   | | }t }t}|| | |gd |fS r<   )r  r   SMB2Lock_Responser2   r  r  r@   r@   rA   smb2Lock  s
   
zSMB2Commands.smb2Lockc                 C   r  r<   )r   rB  r0   r  r@   r@   rA   
smb2Cancel  r  zSMB2Commands.smb2Cancelc                 C   s&   | d|d  tj t gd tfS )Nr  r  )r  r  r  r   rB  r4   r  r@   r@   rA   r    s   zSMB2Commands.defaultNF)r  r  r  r  r  r  r"  r$  r)  r7  rE  rN  rZ  re  rj  rp  rt  r  r  r  r  r  r  r  r  r  r@   r@   r@   rA   r    s`    :
W
 I

B
B
 $
E
<
k
0
2

 






r  c                   @   s0   e Zd Zedd Zedd Zedd ZdS )Ioctlsc                 C   s   t  tfS r<   )r   rB  r6   )r   r   r  r@   r@   rA   fsctlDfsGetReferrals
  rR  zIoctls.fsctlDfsGetReferralsc           	   
   C   s   | | }d}|d  |d v rb|d |d   d }t}z#|tkr't}n|d |d   d }||d  ||d }W n! tya } z|jd| t	j
|d	 t}W Y d }~nd }~ww t}|| | ||fS )
NrF   r:  r  r  r  r  MaxOutputResponsezfsctlPipeTransceive: %s r  )r  r   r2   r  r5   sendallr  rv   r  r  r  r3   r  )	r   r   r  r  ioctlResponser  r   r  r   r@   r@   rA   fsctlPipeTransceive  s(   
zIoctls.fsctlPipeTransceivec                 C   s^   | | }t}t|d }t }d|d< d|d< d|d< tj|d< || | | |fS )	Nr  r   r4  r  Guidr   r  Dialect)r  r2   r   VALIDATE_NEGOTIATE_INFO VALIDATE_NEGOTIATE_INFO_RESPONSEr  r  r   )r   r   r  r  r   validateNegotiateInfovalidateNegotiateInfoResponser@   r@   rA   fsctlValidateNegotiateInfo'  s   

z!Ioctls.fsctlValidateNegotiateInfoN)r  r  r  r  r  r  r  r@   r@   r@   rA   r  	  s    

r  c                   @   s&   e Zd Zd	ddZdd Zdd ZdS )
SMBSERVERHandlerFc                 C   sN   || _ |d d \| _| _|| _t j| _d| _|| _	t
j| ||| d S )Nr   i,  )_SMBSERVERHandler__SMB_SMBSERVERHandler__ip_SMBSERVERHandler__port_SMBSERVERHandler__request	threadingcurrent_threadname_SMBSERVERHandler__connId_SMBSERVERHandler__timeOut_SMBSERVERHandler__select_pollr   BaseRequestHandler__init__)r  r  client_addressserverselect_pollr@   r@   rA   r  9  s   zSMBSERVERHandler.__init__c              
   C   s  | j d| j| jf  | j | j| j| j 	 ztj| j  d| j| j| j	| j
d}z|| j}W n tjy<     tjyG   Y W d S w | tjkr| d\}}}td| }td| }| j d| j|d  |d f  t }|tj ||  | j	|  n!| j | j| }	|	D ]}
t|
dr||
  q||
 qW n# ty } z| j d	|  d
d l }|!  W Y d }~d S d }~ww q)NzIncoming connection (%s,%d)THOST)	sess_portr  r      z"NetBIOS Session request (%s,%s,%s)r   r   z
Handle: %sr   )"r  r  r  r  addConnectionr  r   NetBIOSTCPSessionr  r  r  recv_packetr  NetBIOSTimeoutNetBIOSErrorget_typeNETBIOS_SESSION_REQUESTget_trailerr'  decode_namestripNetBIOSSessionPacketset_type!NETBIOS_SESSION_POSITIVE_RESPONSEset_trailerr  rawDataprocessRequestr&  send_packetr   rv   rw   rx   )r  sessionp_rnmyremote_namemynamerr+  r   r   rw   r@   r@   rA   handleD  sN   
zSMBSERVERHandler.handlec                 C   s2   | j d| j| jf  | j | j tj| S )NzClosing down connection (%s,%d))	r  r  r  r  removeConnectionr  r   r  finishr  r@   r@   rA   r  m  s   zSMBSERVERHandler.finishNr  )r  r  r  r  r  r  r@   r@   r@   rA   r  8  s    
)r  c                   @   st  e Zd ZeddfddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dZd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jdfd.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Z d:d; Z!d<d= Z"d>d? Z#d@dA Z$dBdC Z%dDdE Z&dFdG Z'dHdI Z(dJdK Z)d[dMdNZ*dOdP Z+d\dQdRZ,dSdT Z-d]dVdWZ.dXdY Z/dS )^	SMBSERVERNFc                 C   s,  |r4t j| _|d d}t|dkr|d nd}zt|}W n ty-   t |}Y nw |d|f }dtj	_
tj	| || d| _d| _d| _d| _d | _d| _d| _d| _d| _d| _d| _|| _i | _d| _i | _d| _d| _d| _d| _d| _d| _ d | _!t" | _#t$ | _%t& | _'t( | _)t* | _+t, | _-d| j)j.i| _/d	| j'j0t1j2j3| j'j4i| _5t1j2j6| j%j7t1j2j8| j%j9t1j2j:| j%j;t1j2j<| j%j=t1j2j>| j%j?t1j2j@| j%jAt1j2jB| j%jCi| _Di t1j2jE| j#jFt1j2jG| j#jHt1j2jI| j#jJt1j2jK| j#jLt1j2jM| j#jNt1j2jO| j#jPt1j2jQ| j#jRt1j2jS| j#jTt1j2jU| j#jVt1j2jW| j#jXt1j2jY| j#jZt1j2j[| j#j\t1j2j]| j#j^t1j2j_| j#j`t1j2ja| j#jbt1j2jc| j#jdt1j2je| j#jft1j2jg| j#jht1j2ji| j#jjt1j2jk| j#jlt1j2jm| j#jnt1j2jo| j#jpt1j2jq| j#jrt1j2js| j#jtt1j2ju| j#jvd| j#j.i	| _wtxjy| j-jztxj{| j-j|txj}| j-j~i| _i txj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jtxj| j+jd| j+j.i| _i | _d S )
Nr   %r   r   TrF   Fr   z\PIPE\LANMAN)r  AF_INET6address_familyr'  ru   r  
ValueErrorif_nametoindexr   	TCPServerallow_reuse_addressr  _SMBSERVER__serverName_SMBSERVER__serverOS_SMBSERVER__serverDomain_SMBSERVER__challenge_SMBSERVER__log_SMBSERVER__computerAccountName!_SMBSERVER__computerAccountNTHash_SMBSERVER__computerAccountAES#_SMBSERVER__computerAccountPassword!_SMBSERVER__computerAccountDomain_SMBSERVER__domainControllerIP_SMBSERVER__serverConfig_SMBSERVER__credentials_SMBSERVER__logFile _SMBSERVER__registeredNamedPipes_SMBSERVER__jtr_dump_path_SMBSERVER__SMB2Supportr  _SMBSERVER__KerberosSupport_SMBSERVER__NTLMSupportr  r  r  _SMBSERVER__smbCommandsHandlerr  _SMBSERVER__smbTrans2Handlerr  _SMBSERVER__smbTransHandlerr  _SMBSERVER__smbNTTransHandlerr  _SMBSERVER__smb2CommandsHandlerr  _SMBSERVER__IoctlHandlerr  _SMBSERVER__smbNTTransCommandsr  r   r   TRANS_TRANSACT_NMPIPEr  _SMBSERVER__smbTransCommandsTRANS2_FIND_FIRST2rO  TRANS2_FIND_NEXT2r  TRANS2_QUERY_FS_INFORMATIONr  TRANS2_QUERY_PATH_INFORMATIONrP  TRANS2_QUERY_FILE_INFORMATIONrQ  TRANS2_SET_FILE_INFORMATIONr  TRANS2_SET_PATH_INFORMATIONr  _SMBSERVER__smbTrans2Commandsrd  rh  rj  rn  r  r  rq  rz  r{  r~  r  r  rf  r  r  r  r  r0  r  r  r  r  r  r  SMB_COM_TRANSACTION2rL  SMB_COM_TRANSACTIONr9  SMB_COM_NT_TRANSACTrF  r  r  r  r  r  r  r  r  r  r  r  r  r\  rc  rR  rX  rM  rO  r  r  _SMBSERVER__smbCommandsr   FSCTL_DFS_GET_REFERRALSr  FSCTL_PIPE_TRANSCEIVEr  FSCTL_VALIDATE_NEGOTIATE_INFOr  _SMBSERVER__smb2Ioctlsr  r  SMB2_SESSION_SETUPr)  SMB2_LOGOFFr  SMB2_TREE_CONNECTr7  SMB2_TREE_DISCONNECTr  r?  rE  
SMB2_CLOSErN  
SMB2_FLUSHrt  	SMB2_READrp  
SMB2_WRITErj  	SMB2_LOCKr  
SMB2_IOCTLr  SMB2_CANCELr  	SMB2_ECHOr  SMB2_QUERY_DIRECTORYr  SMB2_CHANGE_NOTIFYr  SMB2_QUERY_INFOrZ  SMB2_SET_INFOre  _SMBSERVER__smb2Commands_SMBSERVER__activeConnections)r  server_addresshandler_classconfig_parseripv6ip_partsscope_idr@   r@   rA   r  v  s  
	












	










zSMBSERVER.__init__c                 C      | j S r<   )r  r  r@   r@   rA   r       zSMBSERVER.getIoctlsc                 C   r/  r<   )r  r  r@   r@   rA   r    r0  zSMBSERVER.getCredentialsc                 C   s2   z| j |= W n   Y | dt| j    d S )NzRemaining connections %s)r(  r  r  r	  )r  r  r@   r@   rA   r     s
   zSMBSERVER.removeConnectionc                 C   s   i | j |< d| j | d< || j | d< || j | d< d| j | d< i | j | d< i | j | d< i | j | d< i | j | d	< d
| j | d< d| j | d< d| j | d< d
| j | d< d S )Nr   	PacketNumClientIP
ClientPortr  r  r  r  r>  Fr  rF   r  r  r  r  r(  )r  r  ipportr@   r@   rA   r  '  s   
zSMBSERVER.addConnectionc                 C   r/  r<   r4  r  r@   r@   rA   getActiveConnections:  r0  zSMBSERVER.getActiveConnectionsc                 C   s   || j |< d S r<   r4  )r  r   r  r@   r@   rA   r  =     zSMBSERVER.setConnectionDataTc                 C   s*   | j | }|du rd|v durtd|S )NTr  zUser not Authenticated!)r(  rv   )r  r   r2  connr@   r@   rA   r  B  s
   
zSMBSERVER.getConnectionDatac                 C   r/  r<   )r  r  r@   r@   rA   r  J  r0  z!SMBSERVER.getRegisteredNamedPipesc                 C   s   || j t|< dS NTr  r  r  pipeNameaddressr@   r@   rA   registerNamedPipeM  s   zSMBSERVER.registerNamedPipec                 C   s   || j v r| j t|= dS dS )NTFr;  r  r=  r@   r@   rA   unregisterNamedPipeQ  s   
zSMBSERVER.unregisterNamedPipec                 C      || j v r| j |= d S d S r<   r  r  transCommandr@   r@   rA   unregisterTransactionW     
zSMBSERVER.unregisterTransactionc                 C   (   || j v r| j | }nd }|| j |< |S r<   rC  r  rE  callbackoriginalCommandr@   r@   rA   hookTransaction[  s
   
 
zSMBSERVER.hookTransactionc                 C   rB  r<   r  rD  r@   r@   rA   unregisterTransaction2  rG  z SMBSERVER.unregisterTransaction2c                 C   rH  r<   rM  rI  r@   r@   rA   hookTransaction2  
   

zSMBSERVER.hookTransaction2c                 C   rB  r<   r  rD  r@   r@   rA   unregisterNTTransaction  rG  z!SMBSERVER.unregisterNTTransactionc                 C   rH  r<   rQ  rI  r@   r@   rA   hookNTTransaction  rP  zSMBSERVER.hookNTTransactionc                 C   rB  r<   r  )r  
smbCommandr@   r@   rA   unregisterSmbCommand  rG  zSMBSERVER.unregisterSmbCommandc                 C   rH  r<   rT  )r  rU  rJ  rK  r@   r@   rA   hookSmbCommand  s
   
$
zSMBSERVER.hookSmbCommandc                 C   rB  r<   r'  )r  smb2Commandr@   r@   rA   unregisterSmb2Command  rG  zSMBSERVER.unregisterSmb2Commandc                 C   rH  r<   rX  )r  rY  rJ  rK  r@   r@   rA   hookSmb2Command  s
   

zSMBSERVER.hookSmb2Commandc                 C   sF   |r| dpd}| dpd}| d| d| }| j|| d S )NrY  NULLrT  r   z: )getr  r  )r  msgr  r  r|   r{   r@   r@   rA   r    s
   zSMBSERVER.logc                 C   r/  r<   )r  r  r@   r@   rA   r    r0  zSMBSERVER.getServerNamec                 C   r/  r<   )r  r  r@   r@   rA   rk    r0  zSMBSERVER.getServerOSc                 C   r/  r<   )r  r  r@   r@   rA   rx    r0  zSMBSERVER.getServerDomainc                 C   r/  r<   )r  r  r@   r@   rA   r    r0  zSMBSERVER.getSMBChallengec                 C   r/  r<   r  r  r@   r@   rA   r     r0  zSMBSERVER.getServerConfigc                 C   
   || _ d S r<   r_  r  r   r@   r@   rA   setServerConfig  rC   zSMBSERVER.setServerConfigc                 C   r/  r<   )r  r  r@   r@   rA   r    r0  zSMBSERVER.getJTRdumpPathc                 C   r/  r<   )_SMBSERVER__dump_hashesr  r@   r@   rA   getDumpHashes  r0  zSMBSERVER.getDumpHashesc                 C   r/  r<   r  r  r@   r@   rA   getAuthCallback  r0  zSMBSERVER.getAuthCallbackc                 C   r`  r<   re  r  rJ  r@   r@   rA   setAuthCallback   rC   zSMBSERVER.setAuthCallbackc                 C   r/  r<   )r  r  r@   r@   rA   r    r0  zSMBSERVER.getKerberosSupportc                 C   r/  r<   )r  r  r@   r@   rA   r    r0  zSMBSERVER.getNTLMSupportc                 C   s   dS r:  r@   )r  r  r  r@   r@   rA   verify_request	  s   zSMBSERVER.verify_requestc                 C   s|   t d|d |d< t }|| || t|dr%||  n|| | d d |d< |d  d7  < d S )Nr@  rV  SecurityFeaturesr   r"  r   )r  r   hashlibmd5updater&  r   digest)r  r  r  signingSessionKeysigningChallengeResponsemr@   r@   rA   r*    s   



zSMBSERVER.signSMBv1r   c                 C   sR   d|d< |d  t jO  < | d|  }t||tj }|d d |d< d S )Ns                   	Signaturer
  r  rI   )r   SMB2_FLAGS_SIGNEDr   hmacnewrk  sha256rn  )r  r  ro  	padLength
packetData	signaturer@   r@   rA   r5  0  s
   zSMBSERVER.signSMBv2c              
   C   s  d}d }zt j|d}t |d d }W n   tj|d}| |d}| ||d  d}Y | |d}g }g }z|du rF|d du r`|d t jjt jj	fvr`t
}	d }
t |d g}n|d t jjkrz| j|d  || ||| j\}}
}	n|d t jjkr| j|d  || ||| j\}}
}	n|d t jjkr| j|d  || ||| j\}}
}	n|d | jv r+| jdu r|d t jjkrz| jtj || |d\}}
}	d}W n` ty
 } z&dd l}|  | d	| tj | j|d  || ||\}}
}	W Y d }~n2d }~ww | j|d  || ||\}}
}	n| j|d  || ||\}}
}	n| jd
 || ||\}}
}	|||
|	f || n|d du rm|d tjtjfvrmt
}	d }
dg}|||
|	f || ncd}|s|d | jv r| jdu r| j|d  || |\}}
}	n| jd
 || |\}}
}	n| jd
 || |\}}
}	|||
|	f || |d dkr||d d  }tj|d}nd}|rrW n ty } z| d|d |f tj  d }~ww | |d}| || g }tt|D ]}|| \}}
}	|| }|
d u r|D ]}|du rt  }t jj |d< t jj!t jj"B t jj#B |d t jj$@ B |d< |d |d< |d |d< |d |d< |d |d< |	d? |d< |	d? d
@ |d< |	d
@ |d< |%| |d r|d  t jj&O  < | '|||d |d  || qt }tj(|d< |dkr|d  tj)O  < |	|d< |d |d< |d |d< |d |d< |d |d< |d |d < |d! |d!< |d" |d"< t*|d#r|+ |d< nt,||d< || qq|
}q|du rPg }t|}t-|D ]F\}}t| d }|d$ |k rt|| |d< |d r,| j||d |d% t*|d#r?||+ |d&   q|||d&   qd'.|g}i |d(< |S ))NFr  r  r   r  Tr  r  zSMB2_NEGOTIATE: %sr   rF   NextCommandzprocessRequest (0x%x,%s)r  r  r  r  r	  r  rI   r  r"  	_reservedr  r  r  r
  r  r  CreditCharger*  r  r  r  r   r   )rw  r  r  r>  )/r   r  r  r   r  r  r5  r   r  rf  r3   r  r  r  r  r  r  r  r  r'  r  rv   rw   rx   r  r  r  r*  r  r  r  ru   r  r  r  r  r   r)  FLAGS2_SMB_SECURITY_SIGNATUREr*  r  SMB2_FLAGS_RELATED_OPERATIONSr&  r   r  r  r   )r  r   r  rE  r  r  r  compoundedPacketsResponsecompoundedPacketsr   respPacketsrespCommandsr   rw   donepacketsToSend	packetNumrespCommandr  	finalDatatotalPacketsidxrN  r@   r@   rA   r  8  sf  











3

zSMBSERVER.processRequestc           	      C   s  | j d u r|d u rd}t | _ | j | | j dd| _| j dd| _| j dd| _| j ddre| j dd| _	| j dd| _
| j dd| _| j dd	| _| j dd
| _| j dd| _| j dd| _| j ddrt| j dd| _nd| _| j ddr| j dd| _| j ddr| j dd| _nd| _| j ddr| j dd| _nd| _| j ddr| j dd| _nd| _| j ddr| j dd| _nd| _| j ddr| j dd| _nd| _| j ddr| j dd| _nd| _| jdkrtj| jtjdddd t| _| j dd}|dkrQt|}|  }|rM|!d\}}}}|||"df| j#|$ < |  }|s0|%  | &d  d S )!Nzsmb.confr   server_name	server_osserver_domaincomputer_account_namecomputer_account_hashcomputer_account_aescomputer_account_passwordcomputer_account_domainr  log_filerM   s   AAAAAAAAr  dump_hashesFSMB2SupportDropSSPKerberosSupportNTLMSupportTanonymous_logonNone'%(asctime)s: %(levelname)s: %(message)s%m/%d/%Y %I:%M:%S %p)r  r  formatdatefmtforcecredentials_filerF   :z
zConfig file parsed)'r  r   ConfigParserr  r]  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  rc  r  r  r  r  r  r  basicConfigr  ry   r  r   readliner'  r  r  r-  rT  r  )	r  
configFilecredentials_fnamecredliner  r
  r\   r]   r@   r@   rA   processConfigFile+  st   


zSMBSERVER.processConfigFilec                 C   sn   |dks|dkr+t |d rd| }t |d rd| }z
t|}t|}W n   Y |||f| j| < d S )NrF   r   z0%s)ru   r   r  r-  r  r  r
  r\   r]   r@   r@   rA   addCredentialy  s   zSMBSERVER.addCredentialrF   c                 C   s(   || _ || _|| _|| _|| _|| _d S r<   r  r  r  r  r  r  )r  r{   r|   r  r]   r  r  r@   r@   rA   setComputerAccountCredentials  s   
z'SMBSERVER.setComputerAccountCredentialsc                 C   s   | j | j| j| j| j| jdS )N)r{   r]   r  r  r|   r  r  r  r@   r@   rA   r    s   z'SMBSERVER.getComputerAccountCredentials)Tr  r<   )rF   rF   rF   )0r  r  r  r  r  r  r  r  r  r7  r  r  r  r?  rA  rF  rL  rN  rO  rR  rS  rV  rW  rZ  r[  r  r`  r  r  rk  rx  r  r   rb  r  rd  rf  rh  r  r  ri  r*  r5  r  r  r  r  r  r@   r@   r@   rA   r  t  sZ     %
(,	
" 
tN
r  r  )DCERPCServer)r\  )NetrShareEnumNetrShareEnumResponseSHARE_INFO_1NetrServerGetInfoNetrServerGetInfoResponseNetrShareGetInfoNetrShareGetInfoResponse)NetrWkstaGetInfoNetrWkstaGetInfoResponse)ERROR_INVALID_LEVELc                   @   s   e Zd Zdd Zdd ZdS )
WKSTServerc                 C   s*   t |  d| ji| _| dd| j d S )Nr   )z$6BFFD098-A112-3610-9833-46C3F87E345Az1.0z\PIPE\wkssvc)r  r  r  wkssvcCallBacksaddCallbacksr  r@   r@   rA   r    s   
zWKSTServer.__init__c                 C   s  t |}| d|d   t }|d dvrt|d< |S |d |d d< |d dkrTd|d d	 d
< t|d d	 d< t|d d	 d< d|d d	 d< d|d d	 d< |S d|d d d< t|d d d< t|d d d< d|d d d< d|d d d< t|d d d< |S )NzNetrWkstaGetInfo Level: %dLevel)d   e   r  	WkstaInfotagr    WkstaInfo100wki100_platform_idwki100_computernamewki100_langroupr  wki100_ver_majorr   wki100_ver_minorWkstaInfo101wki101_platform_idwki101_computernamewki101_langroupwki101_ver_majorwki101_ver_minorwki101_lanroot)r  r  r  r  r\  r  r  r  answerr@   r@   rA   r    s*   
zWKSTServer.NetrWkstaGetInfoN)r  r  r  r  r  r@   r@   r@   rA   r    s    r  c                   @   s>   e Zd Zdd Zdd ZdddZdd	 Zd
d Zdd ZdS )
SRVSServerc                 C   sD   t |  i | _d | _d | _| j| j| jd| _| 	dd| j d S )N)   rI      )z$4B324FC8-1670-01D3-1278-5A47BF6EE188z3.0z\PIPE\srvsvc)
r  r  _shares_SRVSServer__serverConfig_SRVSServer__logFiler  r  r  srvsvcCallBacksr  r  r@   r@   rA   r    s   
zSRVSServer.__init__c                 C   r`  r<   )r  ra  r@   r@   rA   rb    rC   zSRVSServer.setServerConfigNc                 C   s   |d urt  | _| j| | j }| jdd| _| jdkr,tj| jtj	ddd ||
d= i | _|D ]}t| j|| j|< q7d S )Nr   r  r  r  r  )r  r  r  r  )r   r  r  r  r   r]  r  r  r  r  r   r  r   r   )r  r  r   r   r@   r@   rA   r    s    


zSRVSServer.processConfigFilec                 C   s   t |}| d|d   |d d d  }t }|| jv rP| j| }d|d d< |d |d d	 d
< |d |d d	 d< |d d |d d	 d< d|d< |S d|d d< t|d d	< d|d< |S )NzNetrGetShareInfo Level: %dr  NetNamer  r   
InfoStructr  r  
ShareInfo1shi1_netnamer  	shi1_typer  shi1_remarkr   r  i	  )r  r  r  r  r  r\  )r  r  r  sr  r   r@   r@   rA   r    s    

zSRVSServer.NetrShareGetInfoc                 C   s   t |}| d|d   t }d|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< d|d< |S )NzNetrServerGetInfo Level: %dr  r  r  r  r  ServerInfo101sv101_platform_idr  
sv101_name   sv101_version_majorr   sv101_version_minor
sv101_typesv101_commentr   r  )r  r  r  r\  r  r@   r@   rA   r    s   zSRVSServer.NetrServerGetInfoc                 C   s   t |}| d|d d   t }d|d d< d|d d d< t| j|d< t| j|d d d d	< d
|d< | jD ],}t }|d |d< | j| d |d< | j| d d |d< |d d d d | q;|S )NzNetrShareEnum Level: %dr  r  r   	ShareInfor  TotalEntriesLevel1EntriesReadr   r  r  r  r  r  r  r  r  )r  r  r  ru   r  r  r*  )r  r  r  	shareEnumr   r  r@   r@   rA   r    s   
zSRVSServer.NetrShareEnumr<   )	r  r  r  r  rb  r  r  r  r  r@   r@   r@   rA   r    s    
r  c                   @   s   e Zd ZdZdddedfddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zd1d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d0S )2SimpleSMBServera  
    SimpleSMBServer class - Implements a simple, customizable SMB Server

    :param string listenAddress: the address you want the server to listen on
    :param integer listenPort: the port number you want the server to listen on
    :param string configFile: a file with all the servers' configuration. If no file specified, this class will create the basic parameters needed to run. You will need to add your shares manually tho. See addShare() method
    z0.0.0.0i  rF   Fc              	   C   s  |dkr|||f|d| _ | j | d | _nt | _| jd | jddddd tdD  | jdddd	d tdD  | jdd
ddd tdD  | jddd | jddd | jddd | jddd | jd | jddd | jddd | jddd | jddd |||f| j|d| _ | j   t	 | _
d| j
_t | _d| j_| j dd| j
 f | j dd| j f d S )NrF   )r,  r   r  c                 S      g | ]}t tjqS r@   r  choicestringascii_lettersr  r  r@   r@   rA   r  D      z,SimpleSMBServer.__init__.<locals>.<listcomp>r"  r  c                 S   r  r@   r  r  r@   r@   rA   r  E  r  r  c                 S   r  r@   r  r  r@   r@   rA   r  H  r  r  r  r  rQ  r  rM   AAAAAAAAAAAAAAAAr  r  rP  r  3r   )r+  r,  Tsrvsvcz	127.0.0.1wkssvc)_SimpleSMBServer__serverr  _SimpleSMBServer__smbConfigr   r  add_sectionsetr   r  r  _SimpleSMBServer__srvsServerdaemonr  _SimpleSMBServer__wkstServerr?  getListenPort)r  listenAddress
listenPortr  smbserverclassr,  r@   r@   rA   r  :  s<   

$

zSimpleSMBServer.__init__c                 C   r/  r<   )r  r  r@   r@   rA   	getServerc  r0  zSimpleSMBServer.getServerc                 C   s"   | j   | j  | j  d S r<   )r  startr  r  serve_foreverr  r@   r@   rA   r  f  s   

zSimpleSMBServer.startc                 C   s   | j   d S r<   )r  server_closer  r@   r@   rA   stopk  r8  zSimpleSMBServer.stopc                 C   s   | j ||S r<   )r  r?  r<  r@   r@   rA   r?  n  r8  z!SimpleSMBServer.registerNamedPipec                 C   s   | j |S r<   )r  rA  r@  r@   r@   rA   rA  q  s   z#SimpleSMBServer.unregisterNamedPipec                 C   
   | j  S r<   )r  r  r  r@   r@   rA   r  t  rC   z'SimpleSMBServer.getRegisteredNamedPipes0noc                 C   s   |  }| j| | j|d| | j|d| | j|d| | j|d| | j| j | j| j | j  | j  d S )Nr  rP  r  r   )r  r  r  r  r  rb  r  r  )r  r  	sharePathshareComment	shareTyper   r   r@   r@   rA   addSharew  s   
zSimpleSMBServer.addSharec                 C   sD   | j |  | j| j  | j| j  | j  | j  d S r<   )r  remove_sectionr  r  rb  r  r  )r  r  r@   r@   rA   removeShare  s
   
zSimpleSMBServer.removeSharec                 C   s8   |dkr| j dd| | j| j  | j  d S d S )NrF   r   rM   r  r  r  rb  r  )r  rM   r@   r@   rA   setSMBChallenge  s
   zSimpleSMBServer.setSMBChallengec                 C   ,   | j dd| | j| j  | j  d S )Nr   r  r  r  logFiler@   r@   rA   
setLogFile     zSimpleSMBServer.setLogFilec                 C   r  )Nr   r  r  r  r@   r@   rA   setCredentialsFile  r  z"SimpleSMBServer.setCredentialsFilec                 C   s   | j |||| d S r<   )r  r  r  r@   r@   rA   r    s   zSimpleSMBServer.addCredentialc                 C   s   | j dd|d d  | j dd| | j dd| | j dd|p$d | j dd|p.d | j dd	|p8d | j dd
| | j dd| | j| j  | j  d S )Nr   r  r  r  r  r  rF   r  r  r  r  r  )r  r  r  r  r  r  r  r@   r@   rA   setComputerAccount  s   z"SimpleSMBServer.setComputerAccountc                 C   F   |du r| j ddd n| j ddd | j| j  | j  d S )NTr   r  TrueFalser  r  r   r@   r@   rA   setSMB2Support  
   zSimpleSMBServer.setSMB2Supportc                 C   r  )NTr   r  r  r  r  r  r@   r@   rA   setNTLMSupport  r  zSimpleSMBServer.setNTLMSupportc                 C   r  )NTr   r  r  r  r  r  r@   r@   rA   setKerberosSupport  r  z"SimpleSMBServer.setKerberosSupportc                 C   r  r<   )r  rf  r  r@   r@   rA   rf    rC   zSimpleSMBServer.getAuthCallbackc                 C   s   | j | d S r<   )r  rh  rg  r@   r@   rA   rh    s   zSimpleSMBServer.setAuthCallbackc                 C   r  )NTr   r  r  r  r  r  r@   r@   rA   
setDropSSP  r  zSimpleSMBServer.setDropSSPN)rF   r	  r
  )r  r  r  __doc__r  r  r  r  r  r?  rA  r  r  r  r  r  r  r  r  r  r   r!  rf  rh  r"  r@   r@   r@   rA   r  1  s,    )
r  c                   @   sF   e Zd ZejZejjZ	ej
ZedddfddZdd Zdd	 ZdS )
r  r"  NrF   c                 C   sV   || _ || _|d ur|| _n|d d | _t|| _|| _|| _|| _d | _d | _	d S )Nr  )
r  r  computer_namer   r  r  client_challengeprimary_namer  dce)r  r  r  r  r  r%  r$  r&  r@   r@   rA   r    s   

zNetLogon.__init__c           	   	   C   s<  t j| j| j| jdd}t|}| }|  |j	t
jt| jd t
|| j| jd | j}|d }t
d | j|| j}t
| j|}t
|| jd | jd t
jj| jd |d}|| jd| j |tj || j |j	t
jdt| jd	}t
 ||}|!| t
"|| j| j|}|d
 | _#|| _$d S )Nncacn_ip_tcp)dataRepresentationprotocol)transfer_syntaxr  ServerChallengei`THIS_IS_IGNORED_IN_IMPACKETr   )alterr+  ReturnAuthenticator)%r   hept_mapr  nrpc_uidsyntaxr   DCERPCTransportFactoryget_dce_rpcr  bindr   MSRPC_UUID_NRPCr   bin_to_uuidtuphNetrServerReqChallenger&  r$  r%  ComputeSessionKeyStrongKeyr  ComputeNetlogonCredentialhNetrServerAuthenticate3r  NETLOGON_SECURE_CHANNEL_TYPEWorkstationSecureChannelset_credentialsr  set_auth_typer   RPC_C_AUTHN_NETLOGONset_auth_levelauthn_level_packetComputeNetlogonAuthenticatorset_session_keyhNetrLogonGetCapabilitiesr  r'  )	r  binding_string_nrpcrpctransportr'  r+  serverchallr  
clientcredauthr@   r@   rA   r    s,   



zNetLogon.setupConnectionc                 C   s@  t  }d|d< | jd |d< t jj|d< t jj|d< t jj|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< | j|d< d|d d< d|d d< d|d< | j	
|}t|d d  d! |d" }||d# fS )$Nr  LogonServerComputerNameValidationLevel
LogonLevelLogonInformationr  rG   rH   LogonNetworkTransitiveIdentityLogonDomainNamei   ParameterControlrT  UserNamerF   WorkstationLmChallenger   NtChallengeResponserJ   LmChallengeResponser   s           r/  
Credentialr   	Timestamp
ExtraFlagsValidationInformationValidationSam4UserSessionKeyrN   r  )r   NetrLogonSamLogonWithFlagsr$  NETLOGON_VALIDATION_INFO_CLASSNetlogonValidationSamInfo4NETLOGON_LOGON_INFO_CLASS$NetlogonNetworkTransitiveInformationrP   r  r'  r  r   rZ   )r  r_   r^   r  r+  
signingKeyr@   r@   rA   r    s(   
z"NetLogon.logonUserAndGetSessionKey)r  r  r  r   r6  r1  r   DCERPC	NDRSyntaxr2  RPC_C_AUTHN_LEVEL_PKT_PRIVACYrB  r  	randbytesr  r  r  r@   r@   r@   rA   r    s    r  r<   )r{  r  r}  r   r  r  r  logging.configr%  r   r,  r  r   r  rJ  r  rk  rt  binasciir   r   r   impacket.dcerpc.v5r   r   r   r   sixr	   r
   	six.movesr   r   pyasn1.codec.derr   r   impacketr   r   r   r   r   r   impacket.spnegor   r   r   r   r   r   impacket.krb5.asn1r   r   r   r   r   impacket.krb5r   impacket.krb5.cryptor    r!   r"   r#   impacket.nt_errorsr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   	getLoggerr  ry   r  r  rB   rE   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rO  rQ  rP  r  r  r  r  r  r  r  r  r  ThreadingMixInr  r  rU  r  impacket.dcerpc.v5.rpcrtr  impacket.dcerpc.v5.dtypesr\  impacket.dcerpc.v5.srvsr  r  r  r  r  r  r  impacket.dcerpc.v5.wkstr  r  impacket.system_errorsr  r  r  r  r  r@   r@   r@   rA   <module>   s    d
	7,
	/6 	a  ,                      /<      -$'` $