o
    j(p                  
   @   s  d dl mZ d dl mZ d dlZd dlZd dlZd dlZd dlZzd dlZW n e	y3   d dl
ZY nw d dlmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZmZm Z m!Z! d d	l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( G d
d deZ)e*dkrGe+ej, ej-dddZ.e.j/dddd e.j/ddddd e.j/de0dddd e.j/ddddd  e.j/d!dd"d e.j/d#dd$d e1ej2d%kre.3  e4d% ze.5 Z6W n e7y Z8 ze9e:e8 e4d% W Y dZ8[8ndZ8[8ww e;e6j<e6j= e)e6j>Z?e?@ejABe6jC e6jDdur#e?Ee6jD e?F  eGd& 	 zejHI  W n eJyC   e4d% Y nw 	 q-dS )'    )division)print_functionN)Thread)logger)	smbserversmbversion)FILE_OVERWRITEFILE_OVERWRITE_IFFILE_WRITE_DATAFILE_APPEND_DATAGENERIC_WRITE)STATUS_USER_SESSION_DELETEDSTATUS_SUCCESSSTATUS_ACCESS_DENIEDSTATUS_NO_MORE_FILESSTATUS_OBJECT_PATH_NOT_FOUND)
SRVSServerdecodeSMBString
findFirst2STATUS_SMB_BAD_TIDencodeSMBStringqueryPathInformationc                   @   s   e Zd Zd ddZdd Zdd Zd!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S )"KarmaSMBServerFc                 C   s  t |  d| _d | _i | _t }|d |ddd |ddd |ddd |ddd	 |dd
d |d |ddd |ddd |ddd |ddd |d |ddd |ddd |ddd |ddd |d |ddd |ddd |ddd |ddd |r|ddd tj	d|d| _| j
  | jtjj | jtjj | jtjj | jtjj | jtjj | jtjj | jtj | jtjj| j| _| jtjj| j| _| jtjj| j | _!| jtjj"| j#| _$| j%tj&| j'| _(| j%tj)| j*| _+| j%tj,| j-| _.| j%tj/| j0| _1| j%tj2| j3| _4t5 | _6d| j6_7| j8dd| j69 f d S )Nr   globalserver_name	server_osUNIXserver_domain	WORKGROUPlog_fileNonecredentials_file IPC$commentzLogon server sharez	read onlyyesz
share type3pathNETLOGONno0SYSVOLSMB2SupportTrue)z0.0.0.0i  )config_parserTsrvsvcz	127.0.0.1):r   __init__serverdefaultFile
extensionsConfigParseradd_sectionsetr   	SMBSERVERprocessConfigFileunregisterSmbCommandr   SMBSMB_COM_CREATE_DIRECTORYSMB_COM_DELETE_DIRECTORYSMB_COM_RENAMESMB_COM_DELETESMB_COM_WRITESMB_COM_WRITE_ANDXunregisterSmb2Commandsmb2
SMB2_WRITEhookSmbCommandSMB_COM_NT_CREATE_ANDXsmbComNtCreateAndXorigsmbComNtCreateAndXSMB_COM_TREE_CONNECT_ANDXsmbComTreeConnectAndXorigsmbComTreeConnectAndXhookTransaction2TRANS2_QUERY_PATH_INFORMATIONr   origQueryPathInformationTRANS2_FIND_FIRST2r   origFindFirst2hookSmb2CommandSMB2_TREE_CONNECTsmb2TreeConnectorigsmb2TreeConnectSMB2_CREATE
smb2Createorigsmb2CreateSMB2_QUERY_DIRECTORYsmb2QueryDirectoryorigsmb2QueryDirectory	SMB2_READsmb2Readorigsmb2Read
SMB2_CLOSE	smb2Closeorigsmb2Closer   _KarmaSMBServer__srvsServerdaemonregisterNamedPipegetListenPort)selfsmb2Support	smbConfig rh   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/../../../bin/karmaSMB.pyr1   P   sb   





zKarmaSMBServer.__init__c                 C   s  | |}d}d}	d}
tj|d |d}tjt|d |d dd}tj|}tj	|\}}|
 dd  }|
 | jv rJ| j|
  }n| j}|d |d	 v r|d	 |d  d
 }t|||d |d |d d\}}}t }	d}d}d}d}t|D ]f}zt|d |d|d d< W n   Y |d  }t|}|| |ks|d d |d krd}t|d dkrd}nt|d  d d }||d d  |d |< ||	d<  n|d7 }|
|7 }
||7 }q||	d< ||	d< ||	d< nt}||| ||	|
|fS )N    Flags2)dataFileName\/   TidConnectedSharesr(   InformationLevelSearchAttributes)pktFlags   r   flagstextSearchCountSIDsLastNameOffsetSIDEndOfSearch)getConnectionDatar   SMBFindFirst2_Parametersosr(   normpathr   replacebasenamesplitextupperr4   r3   r    SMBFindFirst2Response_Parameters	enumerater   getDatalenlistkeysr   setConnectionData)re   connId	smbServer
recvPacket
parametersrl   maxDataCountconnData	respSetuprespParametersrespDatafindFirst2ParametersorigPathNameorigFileName_origPathNameExtension
targetFiler(   searchResultsearchCount	errorCodeendOfSearchsid	totalDatailenDatarh   rh   ri   r      s`   
" 

zKarmaSMBServer.findFirst2c                 C   s  | |}t|d }tj|d |d d}ttjj}|d }	|	tj@ tjkr-t}
nI|d tj	@ t	kr9t}
n=|d tj
@ t
krEt}
n1|d tj@ tkrQt}
n%|d tj@ tkr]t}
n|d tj@ tkrit}
n|d d@ dkrtt}
nt}
|
tkr|gd |
fS tjt|d |d	 d
d}tj|\}}| dd  }| | jv r| j|  }n| j}t|d |d|d	< | |d< |d|d ||f tj | ||||S )N
Parametersrk   Datarx   rl   CreateOptionsDisposition
AccessMask   rm   rn   ro   rp   rw   "%s is asking for %s. Delivering %sClientIP)r   r   SMBNtCreateAndX_ParametersSMBNtCreateAndX_Data
SMBCommandr;   rF   FILE_DELETE_ON_CLOSEr   r	   r
   r   r   r   r   r   r(   r   r   r   r   r   r4   r3   r   r   logloggingINFOrH   )re   r   r   r   r   r   ntCreateAndXParametersntCreateAndXDatarespSMBCommandcreateOptionsr   r   r   r   r   rh   rh   ri   rG      s@   
"z!KarmaSMBServer.smbComNtCreateAndXr   c              
   C   sN  | |}d}d}	d}
d}tj|d |d}|d |d v rd}zRt|d |d }tj|d	d
}d|v du r>i |d< |d| t	j
 ||d v sQ|dkr\t|d
|d \}}nt|| j|d \}}||d tj|< W n ty } z|d| t	j W Y d }~nd }~ww |d urt }	|}
nt}||| ||	|
|fS )Nrj   r   rk   r   rq   rr   r#   rm   rn   ro   MS15011Fz1Client is asking for QueryPathInformation for: %s.rs   zqueryPathInformation: %s)r   r   "SMBQueryPathInformation_Parametersr   r   r(   r   r   r   r   r   r   r3   dirname	ExceptionERROR*SMBQueryPathInformationResponse_Parametersr   r   )re   r   r   r   r   rl   r   r   r   r   r   r   queryPathInfoParametersr(   r   
infoRecorderh   rh   ri   r     s<   
z#KarmaSMBServer.queryPathInformationc                 C   s0   | |}d|d d< ||| | |||S )NTr   StopConnection)r   r   r]   re   r   r   r   r   rh   rh   ri   r\   C  s   
zKarmaSMBServer.smb2Readc                 C   s8   | |}|d d du rt gd tfS | |||S )Nr   r   T)r   rC   	SMB2Errorr   r`   r   rh   rh   ri   r_   I  s   
zKarmaSMBServer.smb2Closec                 C   s  | |}t|d }|d }|tj@ tjkrt}nN|d tj@ tjkr(t}nA|d tj@ tjkr5t}n4|d tj@ tjkrBt}n'|d tj@ tjkrOt}n|d tj	@ tj	kr\t}n|d d@ dkrgt}nt
}|tkrut gd |fS tj|d d |d  dd	d
}tj|\}	}
|
 dd  }
|tj@ dkr|
 | jv r| j|
  }n| j}tj||f|d d< |d|d ||f tj nd
}z	|d|d< W n ty   dd l}|| d|d< Y nw t|d |d< | |d< |  |||S )Nr   r   CreateDispositionDesiredAccessr   Buffer
NameLengthutf-16lern   ro   rp   r   r   FileDatar   r      )!r   rC   
SMB2Creater   r   r	   r
   r   r   r   r   r   r   r(   r   decoder   r   r   FILE_DIRECTORY_FILEr4   r3   r   r   r   r   encodeUnicodeDecodeErrorsysgetfilesystemencodingr   r   rW   )re   r   r   r   r   ntCreateRequestr   r   r   r   r   r   r   rh   rh   ri   rV   Q  sN   
*zKarmaSMBServer.smb2Createc              
   C   sx  | |}t }d}d|d< t}|d d du r-d|d d< ||| t gd tfS |d d \}}t|\
}	}
}}}}}}}}t	
t	jj}t	jt	jB |d	< d
|d< ||d< ||d< t	||d< t	||d< t	||d< t	||d< d|d< |d|d< dt|d  d }d
|d< d|d< t| |d< | d|  |d< d|d d< ||| |gd |fS )N       r   r   FindDoneTFr   ExtFileAttributesr   EaSize	EndOfFileAllocationSizeCreationTimeLastAccessTimeLastWriteTimeLastChangeTimes                           	ShortNamer   rm      NextEntryOffsetH   OutputBufferOffsetOutputBufferLength   )r   rC   SMB2QueryDirectory_Responser   r   r   r   r   statr   SMBFindFileIdBothDirectoryInfor;   FLAGS2_UNICODEATTR_NORMALATTR_ARCHIVE	POSIXtoFTr   r   r   )re   r   r   r   r   r   r   origNamer   modeinodevnlinkuidgidsizeatimemtimectimer   padLenrh   rh   ri   rY     s<   
z!KarmaSMBServer.smb2QueryDirectoryc                 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}
t	
|
rc|
dd }	nt	|
}	i |d< d|d d< d|d d< i }|d urt|d dkrd}nt|d  d d }||d |< d|d | d< |	|d | d< ||d
< n|d|	 tj t}||d< |	dkrtj|d< d|d< n	tj|d< d|d< d|d < d!|d"< ||d< ||| d |g|fS )#NFlagsStatusrp   CreditRequestResponseCommandUid	SessionIDReserved	MessageIDTreeIDr   
PathOffset
PathLengthr   rn      r   Fr   r   rr   r   r|   ro   r(   	shareNamezSMB2_TREE_CONNECT not found %sr$   	ShareType0   
ShareFlagsCapabilitiesiMaximalAccess)r   rC   
SMB2PacketSMB2_FLAGS_SERVER_TO_REDIRr   SMB2TreeConnect_ResponseSMB2TreeConnectr   r   ntpathismountsplitr   r   r   r   r   r   r   r   SMB2_SHARE_TYPE_PIPESMB2_SHARE_TYPE_DISKr   )re   r   r   r   r   
respPacketr   treeConnectRequestr   r(   
UNCOrSharesharetidrh   rh   ri   rS     sV   

 






zKarmaSMBServer.smb2TreeConnectc                 C   s  | |}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|}|d| tj i }t|d dkrd}nt|d  d d }||d |< d|d | 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 |g|fS ) NFlags1rk   rq   MidPidr   r   r   )rx   PasswordLength_PasswordLengthr   Pathrn   r  zTreeConnectAndX request for %srr   r   rp   r|   ro   r(   r  OptionalSupportr$   IPCServicePadLenNTFSNativeFileSystemr   )"r   r   NewSMBPacketr;   FLAGS1_REPLYFLAGS2_EXTENDED_SECURITYFLAGS2_NT_STATUSFLAGS2_LONG_NAMESr   r   rI   %SMBTreeConnectAndXResponse_ParametersSMBTreeConnectAndXResponse_DataSMBTreeConnectAndX_Parameters-SMBTreeConnectAndXExtendedResponse_ParametersSMBTreeConnectAndX_Data
fromStringr   r   r  r  r  r   r   r   r   r   r   r   SMB_SUPPORT_SEARCH_BITSr   r   
addCommandr   )re   r   r   r   r   r   respr   r   r   treeConnectAndXParameterstreeConnectAndXDatar   r  r(   r  r  rh   rh   ri   rJ      sX   




z$KarmaSMBServer.smbComTreeConnectAndXc                 C   s   | j   d S N)r2   serve_foreverre   rh   rh   ri   _startD  s   zKarmaSMBServer._startc                 C   s   t d |   d S )NzSetting up SMB Server)r   infor:  r9  rh   rh   ri   runG  s   
zKarmaSMBServer.runc                 C   s
   || _ d S r7  )r3   )re   filenamerh   rh   ri   setDefaultFileK  s   
zKarmaSMBServer.setDefaultFilec                 C   sb   |  D ]*}|d}|ddur.t|dkr.|d\}}tj| | j| 	 < qd S )Nz
 #Tr   =)
	readlinesstrip
startswithr   r  r   r(   r   r4   r   )re   r=  line	extensionpathNamerh   rh   ri   setExtensionsConfigN  s   
z"KarmaSMBServer.setExtensionsConfigN)F)r   )__name__
__module____qualname__r1   r   rG   r   r\   r_   rV   rY   rS   rJ   r:  r<  r>  rG  rh   rh   rh   ri   r   O   s    
HH
5.:1DDr   __main__FzNFor every file request received, this module will return the pathname contents)add_helpdescriptionz--helphelpzshow this help message and exit)actionrN  fileNamestorepathnamez-Pathname's contents to deliver to SMB clients)rO  metavarrN  z-configrztconfig file name to map extensions to files to deliver. For those extensions not present, pathname will be delivered)typerS  rN  z-smb2support
store_truezSMB2 Support (experimental!))rO  defaultrN  z-tsz&Adds timestamp to every logging outputz-debugzTurn DEBUG output ONrp   z(Servers started, waiting for connections)K
__future__r   r   r   r   argparser   r  r5   ImportErrorconfigparser	threadingr   impacket.examplesr   impacketr   r   r   impacket.smb3structssmb3structsrC   impacket.smbr	   r
   r   r   r   impacket.nt_errorsr   r   r   r   r   impacket.smbserverr   r   r   r   r   r   r   rH  printBANNERArgumentParserparseradd_argumentFileTyper   argv
print_helpexit
parse_argsoptionsr   r   criticalstrinittsdebugsmb2supportsr>  r(   r   rP  configrG  startr;  stdinreadKeyboardInterruptrh   rh   rh   ri   <module>   sv   7     




