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rÛe. 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jA Be6jC¡¡ e6jDdu�r#e? Ee6jD¡ e? F¡  e Gd&¡ 	 zejH I¡  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| j6 9¡ 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rÛd}t|d ƒdkr½d}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 r™d}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r˜t ¡ }	|}
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   é   ÚNextEntryOffsetéH   Ú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r°t|d ƒdkr‰d}nt|d  ¡ ƒd d }||d |< d|d | d< |	|d | d< ||d
< n| d|	 tj¡ t}||d< |	dkrÍt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$   Ú	ShareTypeé0   Ú
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rŸd}nt|d  ¡ ƒd d }||d |< d|d | d< ||d | d< ||d< tjj|d< |dkrÔd|	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ÿ     


€þ

ÿúÝ