o
    j5e                     @   s   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlT d dlmZ d d	lmZ d d
lmZ d dlZG dd dZdS )    N)NDRCALL)DCERPCTCPTransport)DCERPCSMBTransport)unpack)uuidtup_to_bingeneratestringver_to_binbin_to_uuidtup)*)hresult_errors)RC4)ISC_REQc                   @   s|   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdddZ	d ddZ
dd Zdd Zdd Zd!ddZd"ddZdS )#DCERPC5Connectionc                 C   s   || _ || _d | _|d u rt| _nt| _| jjd urt| _t| _	d| _
d| _td| _td| _| j| _td| _d| _d| _d| _d | _d | _d | _d | _d | _d | _d | _d S )Nr      z$8a885d04-1ceb-11c9-9fe8-08002b1048602.0)z$71710533-BEBA-4937-8319-B5DBEF9CCC36z1.0)targetgssapi	transportRPC_C_AUTHN_NONE	auth_typeRPC_C_AUTHN_WINNTkerberosRPC_C_AUTHN_GSS_NEGOTIATERPC_C_AUTHN_LEVEL_NONE
auth_levelctxcallidr   	NDRSyntaxNDR64Syntaxtransfer_syntax!_DCERPC5Connection__max_xmit_size_max_user_frag_DCERPC5Connection__sequence_DCERPC5Connection__sessionKey$_DCERPC5Connection__clientSigningKey$_DCERPC5Connection__serverSigningKey$_DCERPC5Connection__clientSealingKey$_DCERPC5Connection__serverSealingKey'_DCERPC5Connection__clientSealingHandle'_DCERPC5Connection__serverSealingHandle)selfr   r    r,   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/dcerpc/v5/connection.py__init__   s2   



zDCERPC5Connection.__init__c                 C   s   | j S N)r$   )r+   r,   r,   r-   get_session_key3   s   z!DCERPC5Connection.get_session_keyc                 C   
   || _ d S r/   )r   )r+   r   r,   r,   r-   set_auth_level6      
z DCERPC5Connection.set_auth_levelc                 C   r1   r/   )r   )r+   r   r,   r,   r-   set_auth_type9   r3   zDCERPC5Connection.set_auth_typec              
      sP   z| j d ur| j  I d H  W dS  ty' } z
d |fW  Y d }~S d }~ww )NTN)r   
disconnect	Exception)r+   er,   r,   r-   r6   <   s   
zDCERPC5Connection.disconnectc              
      s   z?| j jdkrt| j | _| j I dH  W dS | j jdkr>t| j | _| j I dH \}}|dur5|| j | _W dS t  t	yV } z
d|fW  Y d}~S d}~ww )zP
		Selects the correct transport layer based on the self.target and starts it
		ncacn_ip_tcpNncacn_npr5   )
r   rpcprotocolr   r   connectr   r0   r$   NotImplementedErrorr7   )r+   _errr8   r,   r,   r-   r<   E   s$   zDCERPC5Connection.connectr   r   c              
      s  zt  }| j}t|D ]0}t }||d< d|d< ||d< t td |d< t||d< || |  jd7  _|d7 }qt }||d< t||d< ||d< d|d< || t }	t	|	d< |
 |	d< | j|	d	< |rpt|	d< | jtkr(| jtkr| jjjd
| j tjtjB tjB tjB tjB tjB dI d
H \}
}}|d
urd
|fW S nE| jtkrdtdfW S | jtkr| jjjd
tjtjB tjB tjB tj B tj!B | j dI d
H \}
}}|d
urd
|fW S nd
tdfW S t" }| j|d< | j|d< | jd |d< dt#|	$ d  d }|dkr |	d  d| 7  < ||d< ||	d< |
|	d< | j%&|	$ I d
H \}}|d
ur<|| ' I d
H \}}|d
urL|t|}|d t(ks^|d t)kret*|
 }nd|d t+kss|d t,kr|d t,krt-|
 }t.d|d d
d d }n
t/|d }|d }|t0v rdt1|dfW S |t2v rdt1dt2|  fW S dt1d| fW S dt1d|d  fW S t|d |d  d D ]L}|3|}|d! dkrd"| }|t45|d! d#|d!  7 }|d$7 }|3|d% }|t25|d&| 7 }|d! |fd'kr|d(7 }t1||d | _6q|d) | _7| jtkr| jtkri| jjj|d | j tjtjB tjB tjB tjB tjB dI d
H \}}}|d
urad
|fW S | jj8 | _9nE| jtkrrd
}n<| jtkr| jjj|d tjtjB tjB tjB tj B tj!B | j dI d
H \}}}|d
urd
|fW S | jj8 | _9d| _:| jt;t<t=fv r.| jtkr$| jj> d*kr| jj? | _@| jj?d+| _A| jjB | _C| jjBd+| _DtE| jC}|jF| _GtE| jD}|jF| _Hn4| jj8 | _@| jj8 | _A| jj8 | _C| jj8 | _DtE| j@}|jF| _G|jF| _Hn
| jtkr.td,t" }| j|d< | j|d< | jd |d< |d
ur| jtkrt }t|d< |
 |d< ||d< ||d< | j%j&|$ dd-I d
H \}}|d
urx|d| _:| ' I d
H \}}|d
ur|| jjI | _:n3t }tJ|d< d.|d< ||d< ||d< |d	 | _| j|d	< | j%j&|$ dd-I d
H \}}|d
ur||  jd7  _|d
fW S  ty } z
d|fW  Y d
}~S d
}~ww )/za
		Performs bind operation. Does authentication and sets up the keys for further communication
			ContextIDr   
TransItemsr   AbstractSyntaxTransferSyntaxtypepduDatacall_idN)spnflagsFz%RPC_C_AUTHN_NETLOGON Not implemented!)rH   rG   zUnsupported auth type!r   r   5 auth_ctx_id   r      auth_pad_lensec_trailer	auth_data<LRejectedReason
error_codezBind context rejected: %s'Unknown DCE RPC fault status code: %.8xz(Unknown DCE RPC packet type received: %dctx_numResultzBind context %d rejected: z)Unknown DCE RPC context result code: %.4xz; ReasonzUnknown reason code: %.4x)   r   zI (this usually means the interface isn't listening on the given endpoint)	max_rfragTServer(RPC_C_AUTHN_NETLOGON is not implemented!)forceWriteAndxs       )K	MSRPCBindr   rangeCtxItemr   r   r   
addCtxItemMSRPCHeader
MSRPC_BINDgetDatar   MSRPC_ALTERCTXr   r   r   r   r   ntlmauthenticater   to_target_stringr   REPLAY_DETECTCONFIDENTIALITYUSE_SESSION_KEY	INTEGRITYSEQUENCE_DETECT
CONNECTIONRPC_C_AUTHN_NETLOGONr7   r   MUTUAL_AUTHUSE_DCE_STYLESEC_TRAILERlen
get_packetr   sendrecv_oneMSRPC_BINDACKMSRPC_ALTERCTX_RMSRPCBindAckMSRPC_BINDNAKMSRPC_FAULTMSRPCRespHeaderr   MSRPCBindNakrpc_status_codesDCERPCExceptionrpc_provider_reason
getCtxItemrpc_cont_def_resultgetr    r!   r0   r$   r#   RPC_C_AUTHN_LEVEL_CONNECTRPC_C_AUTHN_LEVEL_PKT_INTEGRITYRPC_C_AUTHN_LEVEL_PKT_PRIVACYis_extended_securityget_signkeyr%   r&   get_sealkeyr'   r(   r   encryptr)   r*   get_seq_numberMSRPC_AUTH3)r+   
iface_uuidalterbogus_bindsr    bindr   r>   itempacketauthresr?   rN   paddatarespbindRespstatus_codectxItemsmsgreasonresponsecipher3cipher4cipher	alter_ctxauth3r8   r,   r,   r-   r   [   s  





































zDCERPC5Connection.bindNTc              
      s\  z| j | jkr|| j d}nd}| |j||I dH \}}|dur&||  I dH \}}|dur5|t|j tj	|j }t
||jjd }	|dd dkr|du rtd|dd d }
|
tv rjt|
d	}nt
|d
}z|	||d}W n
   ||
d	}Y n|||
d}d|fW S |	||d}|dfW S  ty } z
d|fW  Y d}~S d}~ww )zb
		Creates a requests then dispateches it to _transport.send for singing/encryption asn sending
		TFNResponses       rP   r   rR   DCERPCSessionError)isNDR64)r   rS   )r    r   changeTransferSyntaxcallopnumrecv
__import__
__module__sysmodulesgetattr	__class____name__r   r}   r~   r7   )r+   requestuuid
checkErrorr   r>   r?   answermodule	respClassrS   	exceptionsessionErrorClassr   r8   r,   r,   r-   r   R  s@   



zDCERPC5Connection.requestc           
   
      s
  zt |tdurt|j| }z|d dkr |d  tO  < W n   Y | j|d< | j|d< t|d |d< d	}| j	d
krGt
| j	| j}n| j}| jttfv rW|dkrWd}t|d d |krod}|d | jkro| jd }|r|d }d
}	 ||||  }|snP|d
kr|d  tO  < n	|d  t M  < |t|7 }|t|kr|d  tO  < n	|d  t M  < ||d< | j|d|d t@ dI d H \}}|d ur|qxn| |I d H \}}|d ur||  jd7  _W dS  ty }	 z
d |	fW  Y d }	~	S d }	~	ww )NTr       rH   ctx_idrF   rE   
alloc_hintFr         r   r\   	forceRecvr5   )
isinstancera   DCERPC_RawCallOP_NUMrs   PFC_OBJECT_UUIDr   r   rr   r"   minr!   r   r   r   PFC_FIRST_FRAGPFC_LAST_FRAG_transport_sendr7   )
r+   r   should_fragmentfragment_sizer   offsettoSendr>   r?   r8   r,   r,   r-   rt     sj   



"zDCERPC5Connection.sendc              
      s  ztd}d}|sr| j dI d H \}}|d ur|t|}| }|d tkrw|d |d krwtd|||d  d }|tv rHtt| |d	@ tv rVtt|d	@  |tj	v rqtj	| d }tj	| d }	td
||	f td| |d t
@ rd}nd}
||d  }|d }|rl|d7 }|| d  }t|d}|d |  }|d tkr| jtkr| jj dkr| jj| j| j||| j| j\}}n| jj| j| j||| j| j\}}|  jd7  _nw| jtkrtd| jtkr| jdkr| jjj|| jd|dI d H \}}nP|d tkr^| jtkrM|dd  }| jj dkr8| jj| j|| j| j}n&| jj| j|| j| j}|  jd7  _n| jtkrWtd| jtkr^	 |d rl|d |d   }||7 }|r
|d fW S  ty } z
d |fW  Y d }~S d }~ww )NFr   r   rD   frag_lenrK   rP   r     %s - %srT   rH   Tauth_lenr   )r   r   r[   init)	directionrO      rM   )r   r   r{   get_header_sizerz   r   r}   r~   r   ERROR_MESSAGESr   rq   r   r   r   r   re   r   SEALr&   r(   r#   r*   rn   r7   r   decryptr   SIGN)r+   finished	retAnswerresponse_datar?   response_headeroffr   error_msg_shorterror_msg_verboser   r   r   rO   rN   	signaturecfounderntlmsspr8   r,   r,   r-   r     s   




	
"		

xzDCERPC5Connection.recvc              
      sb  zd}d}d}|s| j dI d H \}}|d ur|t|}| }|d tkr|d |d krtd|||d  d }|tv rKd tt| fW S |d	@ tv r\d tt|d	@  fW S |tj	v rztj	| d }	tj	| d }
d td
|	|
f fW S d td| fW S |d t
@ rd}nd}|r
|d fW S  ty } ztt  d |fW  Y d }~S d }~ww )NFr   r   r   rD   r   rK   rP   r   r   rT   rH   T)r   r   r{   r   rz   r   r}   r~   r   r   r   r7   print	traceback
format_exc)r+   r   r   r   r   r?   r   r   r   r   r   r8   r,   r,   r-   ru   N  s@   

zDCERPC5Connection.recv_onec              
      s  z3| j |d< d|d< d|d< | jttfv rt }| j|d< | j|d< d|d< | j d	 |d
< dt| d  d }|dkrN|d  d| 7  < ||d< | |d< d|d< |d }| jtkr| jt	kr| j
j dkr| j
j| j| j| dd || j| j\}}n/| j
j| j| j||| j| j\}}n| jtkrtd| jtkr| j
j
|| jI dH \}}||d< nP| jtkr| jt	kr| j
j dkr| j
j| j| dd | j| j}n)| j
j| j|| j| j}n| jtkrtd| jtkr| j
j
|| jI dH }| |d< ||d< |  jd7  _| jj| ||dI dH \}	}
|
dur3|
W dS  tyL } z
d|fW  Y d}~S d}~ww )zq
		This function does the signing and ecryption on the data we want to send out.
		Keys are set up during bind
		r   r   rN   rO   r   r   r   rM   rI   rJ   rK   rE      s                   TNir[   r   r   r5   )r   r   r   r   rq   r   rr   rs   rc   r   r   re   r   r   r%   r'   r#   r)   rn   r7   r   r   r   signr   rt   )r+   
rpc_packetr\   r   rN   r   
plain_datasealedMessager   r>   r?   r8   r,   r,   r-   r   w  s   





	

	



 
z!DCERPC5Connection._transport_sendc              
      s   z9t |dr"| t|| |I d H \}}|d ur||d fW S | t|||I d H \}}|d ur6||d fW S  tyP } z
d |fW  Y d }~S d }~ww )Nrc   )hasattrrt   r   rc   r7   )r+   functionbodyr   tr?   r8   r,   r,   r-   r     s   
 

zDCERPC5Connection.call)r   r   r   )NT)r   r   r/   )r   r   __qualname__r.   r0   r2   r4   r6   r<   r   r   rt   r   ru   r   r   r,   r,   r,   r-   r      s     "	
 
x0K 
)]r   )asyncior   aiosmb.dcerpc.v5.ndrr   aiosmb.dcerpc.v5.transport.tcpr   aiosmb.dcerpc.v5.transport.smbr   aiosmb.dcerpc.v5.structurer   aiosmb.dcerpc.v5.uuidr   r   r   r	   aiosmb.dcerpc.v5.rpcrtaiosmb.dcerpc.v5r   unicrypto.symmetricr   asyauth.common.winapi.constantsr   r   r   r,   r,   r,   r-   <module>   s    